2008年1月4日金曜日

Chapter 4 Syntax and Semantics

What's with All the Parentheses?

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 件のコメント:

aka さんのコメント...

マクロがなんだかわからなくなってきた。

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 と呼ばれる。"

というもの以上のもののような気がするが。
マクロの章で確認しよう。