ラベル SLIME の投稿を表示しています。 すべての投稿を表示
ラベル SLIME の投稿を表示しています。 すべての投稿を表示

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章終了。休憩。

2008年1月2日水曜日

Chapter 2 Lather, Rinse, Repeat: A Tour of the REPL

Choosing a Lisp Implementation

Lisp処理系の紹介。aclと決めているので。


Getting Up and Running with Lisp in a Box

Emacsの紹介。
SLIMEの紹介。
Lisp in a Box の紹介。

日頃はAllegroのelispモジュールを使っているが、本に合わせるということでSLIMEを使ってみようと思う。
そこで、Lisp in a Boxのページへ。Win用はモジュール化されているが、Linuxはtar玉。

LinuxはUbuntuで構築しているため、あまり環境を汚したくないからpass。emacsまでtar玉で入れられても困る。
WinでLisp in a Boxを試す。
FranzからWin用のfree express editionを取得。インストール。
しかし、Lisp in a BoxのAllegro用モジュールインストーラがそれを認識できず、モジュールが入らない。
試しにclispモジュールをいれてみると、こちらはそのまま入る。

さて、どうしようか。

Common Lispなので、clispでも大差ないと思うが、今回はAllegroを堪能したいという思いもあるので、Linux上に自前で、acl + emacs + SLIMEの環境を構築することにする。

見るべきは、ここ。
http://www.franz.com/emacs/slime.lhtml

ubuntuのパッケージであるか?
$ aptitude search slime
$
ない。では、ソースから。asdf-installはやめておく。ubuntuのパッケージ管理との兼ね合いを検討の上、別途導入是非を決める。
今はCVSから。って、cvs日頃使っていないのでaptitudeで入れる。後はfranzのガイド通り。

使い方メモ。
M-x slime REPLバッファ起動
M-x slime-mode バッファをslime-modeに。

詳しい使い方はSLIMEホームページ。
http://common-lisp.net/project/slime/


Free Your Mind: Interactive Programming

用語の整理。
REPLにて、処理系は、Lisp expressionsをreadし、それをthe rules of Lispによって、evalする。
evalした結果をprintする。
ここで使うREPL環境は、the top-level, the top-level listener, the Lisp Listenerなどと呼ばれる。


Experimenting in the REPL

REPLをいじる。


CL-USER> 10
10
CL-USER> (+ 2 3)
5
CL-USER>


ひとつめ。the Lisp readerが"10"というテキストを読み込み、数字の10をrepresentingなa Lisp objectを生成する。
このobjectは、a self-evaluating objectなので、それをevaluatorが処理すると、自分自身が返る。
それが、printerに渡されて、printerがテキスト"10"を表示する。

ふたつめ。the Lisp readerが"(+ 2 3)"というテキストを読み込み、Lisp objectsを生成する。どういうobjectsかは、ここでは割愛して、後の章でS expressionsが出てきたところ(出てくるだろう)でやる。ざっくりいうと、+はa symbolであり、2と3はnumbersでり、このS式は、+として定義された関数(obj)に引数2と3(objs)を与えているということになる。
続いて、evaluatorは、2と3を評価して、2と3を得て、評価した結果を+とともに評価して、5を得る。
printerは5を受け取って、表示する。


"Hello, World" Lisp Style


CL-USER> "hello, world"
"hello, world"
CL-USER> (format t "hello, world")
hello, world
NIL
CL-USER>


ひとつめ。Numberと同様にStringもself-evaluatingなLisp objects。readerが読み込むときの形とprinterが書き出す形が同じ。
いわゆるread/print equivalence。

Lisp系をやったことが無い人は、何をごちゃごちゃと、と思うかもしれませんが、Lispではこのあたりの概念と用語をしっかりと確認することが重要(であるとSchemeの経験から思う)。なので、ここから入っているこの本はよいと思う。

ふたつめ。副作用(a side effect)による出力。every expression in Lisp evaluates to some result. であり、formatはNILを返す。

この後、defunを導入してこの節終了。


Saving Your Work

SLIMEを使ってみる。

C-cC-qでslime-close-parens-at-pointが起動しない。というかこの関数自体がないような? obsoleteになったのか? いつか調べる。
C-cC-c、C-cC-zはきく。

quitじゃなくて、sayoonaraでもいいんだ。SLIMEに日本の開発者が入ってるのかなぁ。