Racket(emacsとC++ユーザー向け)入門

Racketとは

  • CやC++よりも簡単に出来るプログラミング環境
  • CやC++のメタ制御にも使える
    • 例: パラメータを3 4 ... 9 まで変更しながらCのプログラムを実行する
    • Perl Python Ruby などが類似した使われ方をする
    • メタ制御にはRacketの方が便利な場面が多い
      • Perl Python Ruby にはC++に既にある機能が重複している。RacketはC++にない機能が沢山ある
      • amb や miniKanren など
      • C++ Perl Python Ruby にない機能はScheme言語の入門サイトを見るとよい

参考

準備

.emacs に以下を追記

(setq scheme-program-name "/path/to/racket")


.bashrc に以下を追記

export PATH=$PATH:/path/to/racketInstalledDir/

念のために以下も実行しておく

$ source ~/.bashrc


さらに.emacs に以下を追記しとくと便利な機能

(defun scheme-window ()
    (interactive)
    (select-window (split-window-horizontally (* 2 (/ (window-width) 3))))
    (switch-to-buffer (get-buffer "*scheme*")))

emacsから使う

これをtmp.scmとして保存

(+ 1 3)
(define x (* 2 3))
(display (+ x 3))  
$ emacs tmp.scm
  • M-x run-scheme
  • (+ 1 3) の行の最後にカーソル移動 C-x C-e
  • (+ 1 3)から(display (+ x 3)) まで選択して C-x C-r

シェルを実行してみる

lsコマンドをRacketから実行する

#lang racket
(require racket/system)
(system "ls")

lsコマンドの実行結果をRacketに読み込み

#lang racket
(define tmp (process "ls"))
(require racket/port)
(display (port->string  (car tmp))) ;;表示
;(read (cadr tmp));;読み込む

C++のプログラムの実行結果を受け取る

stdout_test.cpp

#include <iostream>

main()
{
  std::cout << 34567;
}

g++ stdout_test.cpp -o stdout_test.exe

#lang racket
(require racket/port)
(display (port->string  (car (process "./stdout_test.exe"))))
(equal? "34567" (port->string  (car (process "./stdout_test.exe"))))

racketをコマンドラインで直接実行

$ racket -e '(+ 10 3)'

ついでにRacketに実行結果を取り込む

(display (port->string (car (process     "racket -e '(+ 10 3)'"))))

ffi

ffiというのはfoo.soを直接Racketから読むようにする方法

このffi-tutorial
https://github.com/dyoo/ffi-tutorial
の helloが分かりやすい
https://github.com/dyoo/ffi-tutorial/tree/master/ffi/tutorial/examples/hello

その他応用

パッケージ

パッケージの読み方

#lang racket
(require srfi/1)
(require (planet neil/htmlprag:1:6/htmlprag))

Scheme言語の使い方