Lisp は S-expressions に固執しているわけではなく、M-expressions のニーズが高まればそれもよし、という観点。その上で、S-expressions を好むプログラマがそれなりにいるということ。
RubyがM-expressionsに近いと言われているが、調べたことはないです。
Breaking Open the Black Box
通常のプログラミング言語では、
- programを表現する a sequence of characters を compiler が実行可能ファイルに翻訳する。
を3つのフェーズにわける。
- a lexical analyzer が a sequence of characters を tokensにする。
- a parser が tokens から、言語の文法に従って、an abstract syntax tree を作る。(Syntax)
- a compiler が an abstract syntax tree を 機械語などの実行可能言語に翻訳する。(Semantics)
とな。Lispでは、
- the reader が、programを表現する a sequence of characters を Lisp Objectsに変換する。Lisp Objects は S-expression と呼ばれる。S-expressions は abstract syntax trees と同じような木構造を表現できる。
- the evaluatorが、S-expressionsをLisp formsに変換して評価する。
とな。この節の、最後の文章が理解できない。"Common Lisp: the syntax of s-expressions understood by the reader and the syntax of Lisp forms understood by the evaluator." そうなのか?
the reader は、sequences of characters を S-expressions に変換するものじゃないの? "the syntax of sequences of characters from which the reader can generate S-expressions" なら、わかるんだけど。
S-expressions
- the reader は symbols が何を表しているかは知らない。それをsymbolsと認識するだけ。
- the reader は、エスケープされていない文字を全て大文字に変換する。
- the same textual name を同じsymbolとして認識するために、the reader は intern する。
- the reader は、文字を全て大文字に変換して、a package というテーブルにすでにそれが存在するかどうかを確認して、それが存在すればそれを指すものとする。存在しなければ、the package に新しい symbolとして追加してそれを指すものとする。
S-expressions As Lisp Forms
self-evaluating な symbol もある。
- T と NIL。
- keyword symbols。
Function Calls
特記事項なし。
Special Operators
the special operators は、the evaluator が特殊な処理を必要とするときのものであることが多い、とな。
Macros
special operators と special forms はこの本では同義のようだ。
マクロの引数は、well-formedなLisp formsではなくてもよい。マクロがそれをwell-formedなLisp formsに変換する。すなわち、マクロはSemanticsを定義している。
Truth, Falsehood, and Equality
おお。NILは、atomでありlistでもある。。。
Formatting Lisp Code
うーん。SLIMEで、C-M-q、C-cM-qが機能しない。
4章終了。休憩。
1 件のコメント:
マクロがなんだかわからなくなってきた。
CL-USER> (defmacro backward (lis)
(reverse lis))
BACKWARD
CL-USER> (backward (1 2 +))
3
CL-USER>
というのは、(backward lis) を (reverse lis) に変換するのではない。
(backward lis) の lisは評価しないでそのままとしておいて、それを(reverse lis)した結果に変換する。なので、
(backward (1 2 +))
(reverse (1 2 +))
(+ 2 1)
で最後のexpressionがthe evaluatorにわたる。
そうすると、REVERSEが何をするものかということを、the readerは知っている、ということなのか。それは、the evaluatorが知っていて、the readerは知らないものと思っていた。
the reader が知っているものとすると、the readerは
"the reader が、programを表現する a sequence of characters を Lisp Objectsに変換する。Lisp Objects は S-expression と呼ばれる。"
というもの以上のもののような気がするが。
マクロの章で確認しよう。
コメントを投稿