Hatena::Groupcadr

わだばLisperになる このページをアンテナに追加 RSSフィード

2004 | 12 |
2005 | 01 | 02 | 07 | 10 | 11 |
2006 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2011 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 11 |

2007-12-19

Practical Common Lisp (11)

| 22:07 | Practical Common Lisp (11) - わだばLisperになる を含むブックマーク はてなブックマーク - Practical Common Lisp (11) - わだばLisperになる

引き続きPractical Common Lisp 第4章4. Syntax and Semanticsを読んでメモしてみています。

S-expressions

  • 基本的なS式は、リストとアトムで構成される
  • リストは、括弧で区切られていて、任意の数の空白で区切られた要素を含むことができる。
  • アトムはそれ以外のすべて
  • セミコロンは、コメント記号で、それ以後改行までコメントとして扱われる
  • ということで、文法的に覚えるべきことは非常に少ない。あとはアトムの種類を覚えることくらいになる。
  • アトムには、数字、文字列、名前(シンボル名)がある。
  • 数字は、そのものずばり、数字で構成されたもの。+と-記号を付けて表記できる。小数点と、有理数の表記のための/、そして、指数表記もつかえる。
123       ; the integer one hundred twenty-three
3/7       ; the ratio three-sevenths
1.0       ; the floating-point number one in default precision
1.0e0     ; another way to write the same floating-point number
1.0d0     ; the floating-point number one in "double" precision
1.0e-4    ; the floating-point equivalent to one-ten-thousandth
+42       ; the integer forty-two
-42       ; the integer negative forty-two
-1/4      ; the ratio negative one-quarter
-2/8      ; another way to write negative one-quarter
246/2     ; another way to write the integer one hundred twenty-three
  • これらの数字は、整数、有理数、浮動小数点数と呼ばれるが、独自の表記方法を持つ、複素数も表現できる。これは10章で解説する。
  • 同じ数字を色々な表現で書くことが可能だということが分かるが、処理系が簡略化するので注意が必要。
  • -2/8や、246/2は、-1/4や、123となる。同様に、1.0と1.0e0は表記の違いということになる。一方、1.0と、1.0d0は違うものとして扱われるが、整数と、浮動小数点数は違うものとして扱われるため。詳細は、10章で。
  • 文字列は以前の章でダブルクオートに囲まれたものとして表現として目にしている。ダブルクオートを中に含めるには、\を直前に付けてエスケープする。エスケープして表現する必要があるのは、ダブルクオート(")と、バックスラッシュ(\)の二つのみ。
"foo"     ; f、o、oを含む文字列
"fo\o"    ; 同上
"fo\\o"   ; f、 o、 \、oで構成された文字列
"fo\"o"   ; f、 o、 "、oで構成された文字列
  • 名前(シンボルの名前という意味?)はLisp内のプログラムの名前として使用している、FORMATや、hello-worldや、*db*など。これらは、シンボルと呼ばれ、処理系は、名前自体が、変数を指しているのか、関数を指しているのか等々は気にしない。
  • 殆どすべての文字がシンボル名に使えるが空白文字は句切りとして使用されているため使えない。数字も使えるが、数字のみで構成されたものは数字自体と区別がつかないので駄目。また、ピリオド(.)も名前につかえるが、ピリオド(.)一文字のみというのは駄目。他に使えない文字というのは10種あり、()'"`,:;\|は使えない。
  • これらの文字を使いたい場合、そのままでは使えないが、\を前に置くか、||で囲むかすれば使える。
  • 重要事項として、リーダは文字の大文字と小文字を区別しないということがあり、全部大文字として扱う。Fooもfoo、FOOも同じ。しかし、\f\o\oと、|foo|は、fooとして扱われ、FOOとは違ったオブジェクトとして扱われる。REPLでfooという名前を打ち込んで、FOOと返ってくるのはこのため。
  • 今日の一般的なコーディングスタイルでは、全部小文字で書くが、結局のところリーダは全部大文字として解釈している。
  • 同じ表記のは常に同じシンボルとして扱われる。
  • リーダは、文字列を全部大文字に直し、シンボルとして取り込もうとする。その際にパッケージの名前一覧に同じ名前がないかをチェックする。見付からなかった場合、新しく一覧に登録される。見付かった場合は、先に登録されていたオブジェクトが使い回される。同じ名前ならばどこでも同一のオブジェクト使われているということでもある。
  • Lispは、Algol系の言語より多くの文字種が使えるということもあるが、ハイフン(-)で区切られた名前(例hello-world)が良く使われているところが特徴的。
  • また、*が前後に付いた変数名は、大域変数を表わすという習慣がある。同じく定数表記は、+を前後に付けるのが慣用表現。内部的なものは%で開始されることが多い、%%から開始というのも同様。
  • Common Lispの標準関数/変数名には、(A-Z)に加え、*、+、-、/、1、2、<、=、>、&、が使われている。
  • 文法に占める比重とは、数字、文字列、シンボルが多いが、他には、ベクタ、単体の文字、アレイ表現がある。これらは、10、11章で扱う。
  • 要点としては、これらをどう組合されてS式が構成されているかということだが、簡単な図を示す。
x             ; Xというシンボル
()            ; 内容が空のリスト
(1 2 3)       ; 3つの数字を含むリスト
("foo" "bar") ; 2つの文字列を含むリスト
(x y z)       ; 3つのシンボルを含むリスト
(x 1 "foo")   ; 数字とシンボルと文字列を含むリスト
(+ (* 2 3) 4) ; シンボルと数字を含むリストと数字を含むリスト
  • もう少し複雑な例としては、全体として4つの要素があるリストで、2つはシンボル、1つは空リスト、1つは、シンボルと文字列を含むリストということになる。
(defun hello-world ()
  (format t "hello, world"))

ゲスト



トラックバック - http://cadr.g.hatena.ne.jp/g000001/20071219