memo
ソーシャルブックマークを使えば良いんでしょうけども・・・。はてブ?delicious?
| /x 10 def /y 10 def x y moveto 5 5 lineto |
| ((let ((x 10) (y 10)) (lambda (x1 y1) (moveto x y) (lineto x1 y1))) 5 5) |
さっそく、マクロに使うテクニックを。クォートが4種類あります。それぞれの名前は覚えていません。
|
「瑣末なことほど議論が紛糾する現象」
プログラミングの世界では、インデントの数や括弧の前後の空白など、「自転車置場の議論」がごろごろと転がっています。
(cut cons (+ a 1) <>) ≡ (lambda (x2) (cons (+ a 1) x2))
(cut list 1 <> 3 <> 5) ≡ (lambda (x2 x4) (list 1 x2 3 x4 5))
(cut list) ≡ (lambda () (list))
(cut list 1 <> 3 <...>)
≡ (lambda (x2 . xs) (apply list 1 x2 3 xs))
(cut <> a b) ≡ (lambda (f) (f a b))部分適用便利だなー!
CL-USER> (let ((v "hoge"))
(list (print v)
(prin1 v)
(princ v)
(pprint v)))
"hoge" "hoge"hoge
"hoge"("hoge" "hoge" "hoge" NIL)
|
prin1
関数readに適した出力,すなわちLispプログラムに適した出力を生成する.
princ
prin1がLispプログラムに適した出力を生成するのに対し,princはユーザの見やすい出力を生成する.エスケープ文字も出力されない.
先頭に改行が付加される点を除いてprin1と同じである.
pprint
続くスペースを空行にすることを除いてprintと同じである.
| (princ "\n\nこんにちわ!") |
↓
↓ こんにちわ! |
| (prin1 "\n\nこんにちわ!") | \n\nこんにちわ! |
CL-USER> (mapcar (lambda (e)
(funcall e "hoge"))
`(print princ prin1 pprint))
"hoge" hoge"hoge"
"hoge"("hoge" "hoge" "hoge" NIL)
|