Lisp In Small Piecesの1.4のまとめ。
special form について
厳密にはformで無くてもspecial formと呼ぶ。
この本によると、Schemeは、quote if set! lambda の4つ。Common Lispは30以上のspecial formを持つ。気になって、Scheme処理系の言語リファレンスをみていても全然4つじゃない。
http://www.gnu.org/software/mit-scheme/documentation/mit-scheme-ref/Special-Forms.html
http://practical-scheme.net/gauche/man/gauche-refj_26.html#g_t_00e6_009d_00a1_00e4_00bb_00b6_00e5_00bc_008f
Gaucheプログラミング(立読み版)に少し書いてあった。
http://karetta.jp/article/book/004632/004736/commentList#commentList
quote if set! lambdaにdefineがあればScheme処理系が作れる。例えばcondをマクロで実装しちゃうのか、スペシャルフォーム扱いにするのかは実装次第ということらしい。
arcは実際にミニマムな基本構文で実装されているとのこと。ふむふむ。
http://blog.practical-scheme.net/shiro?20080130-arc
Quote
S式の元となったM式では、データは()、関数の引数は[]で区別されていたため、Quoteは必要なかった。しかしM式が使われなくなったため、quoteがプログラムとデータを区別する物になった。
M式 | S式 |
(A B C) | (QUOTE (A B C)) |
car[x] | (CAR X) |
car[append[(A B C); (D E F)]] | (CAR (APPEND (QUOTE (A B C)) (QUOTE (D E F)))) |
Sequence
beginやprognの話。beginの戻り値に何を使うかで、この処理系では813を返すようにしている。元ネタはルパンの813と書いてあるが、笑うところなのだろうか。
beginは(begin α β) ≡ ((lambda () β) α)を使って、lambdaで置き換える事ができる。その部分のコードはこう。
(define (eprogn exps env) (if (pair? exps) (if (pair? (cdr exps)) (begin (evaluate (car exps) env) (eprogn (cdr exps) env)) (evaluate (car exps) env)) empty-begin)) (define emptye-begin 813)
Common Lispのprog2の存在意義に疑問を投げかけたら、twitterで解答がありました。ありがとうございます。
Assignment
代入の話。後でもう一度出てくる。
(case (car e) ((set!) (update! (cadr e) env (evaluate (caddr e) env))) ....
Abstraction
special form のlambda が関数を作る。これも後で.
(case (car e) ((lambda) (make-function (cadr e) (cddr e) env)) ...
Funtion Application
この辺も後でと。