ぱたへね

はてなダイアリーはrustの色分けができないのでこっちに来た

Lisp in Small Pieces 1.4 Evaluating Atoms

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))))

http://en.wikipedia.org/wiki/M-expression

Alternatives

ifの話。真偽値のfalseと、空リスト'()と、NILの違いは何かという議論があり、Schemeはfalseと'()は別物(NILとも違う)というスタンスを取った。

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

この辺も後でと。