Common Lisp勉強中・・・ (1)

やさしいLisp入門(書籍)を読んでのメモ.
本当にただのメモ.



変数の命名規則.

  • アルファベットの大文字小文字を区別しない.


リスト.

  • データの種類を問わず, 個数制限なしに記録していける構造.
  • 先頭のシングルクォートは, 続くリストがデータであることを示す. つかないと関数とみなす.



バッククォート.

`(リスト要素の並び)
  • ,(カンマ)
    • この次に記述された式の実行結果をリストの要素として扱う.
  • ,@(カンマ・アットマーク)
    • つづく式の実行結果として得られたリストを展開し, 全要素を1つずつ並べて要素に加える.


めちゃくちゃ適当な例.

(let
    ((test1 1)
     (test2 5))
  `(,test1 ,@test2))

結果は, (1 . 5).


consを使うのと同じ.

(let
    ((test1 1)
     (test2 5))
  (cons test1 test2))

結果は, (1 . 5).


@なしでやってみる.

(let
    ((test1 1)
     (test2 5))
  `(,test1 ,test2))

結果は, (1 5).


今度はリストで.

(let
    ((test1 '(1 2))
     (test2 '(3 4 5)))
  `(,test1 ,@test2))

結果は, ((1 2) 3 4 5).


リストで@なしで.

(let
    ((test1 '(1 2))
     (test2 '(3 4 5)))
  `(,test1 ,test2))

結果は, ( (1 2) (3 4 5) ).
はてな記法に引っかかるから, ちょっと不細工だけど・・・修正.


四則演算.

(/ 1 3)

この結果は, 1/3と表示される.

(+ (/ 1 3) (/ 1 3) (/ 1 3))

この結果は, 1.
なんとなく, Emacsの*scratch*バッファで実行してみたら,
前者, 後者共に0だった.
3を3.0に変えたらちゃんと小数では表示された.
小数でやった方が良いのかな.



シンボル.
変数の直前にシングルクォートをつけると, 変数名そのものになる.

(let ((test 1))
  (print test))

この結果は, 1
シングルクォートをつけてみる.

(let ((test 1))
  (print 'test))

結果は, TESTとなる.


リストの長さ

(length '(a b))

この結果は, 2

(length '(a . b))

こいつはエラー.
どゆこと?
エラーメッセージを直訳すると, 「適切なリストは, bで終わっちゃいけないよ」か. なんだ??
最後がnilで終わらなきゃいけないってこと?

(length '(x y . '()))

こいつの結果は, 4.
4??

 (length '( x . nil ))

こいつは, 1.

(length '( x . '() ))

こいつは, 3.
3??

(length '( x . ()))

こいつは, 1.
今のレベルじゃ全然分からん. とりあえず先行くか. 疑問残って気持ち悪いけど.