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.
今のレベルじゃ全然分からん. とりあえず先行くか. 疑問残って気持ち悪いけど.