僕の備忘録(PC、UN*X、ネットワーク関連が中心)なんです。
自分の書いたところは適当(な時とか)に書き換えますので御了承を。
LISPの本を買った。
4ページの性格判定によると、Common Lisp 向きとのことであった。
> (eq (not t) (cdr '(foo))) T
gosh> (eq? #f '()) #f
まあ、このあたりの違いに騒ぐつもりはあまりない。
if の下で複数の処理をするには progn だそうだ。
そういえば、手続き型言語の多くに当然のごとく
用意されてる区切り符号とかインデントとか、
がなかった。
> (if (eq nil t) (progn (princ "foo") (princ "bar")) (progn (princ "bar" ) (princ "foo"))) barfoo "foo"
書きやすそうだけど、どうも if は
とりあえず、car と cdr で同じになったものを 付け足しておく。
> (cadr '((1 2 3) (4 5 6) (7 8 9))) (4 5 6) > (car (cdr '((1 2 3) (4 5 6) (7 8 9)))) (4 5 6)
cadr は、 carと cdrか。
> (caddr '((1 2 3) (4 5 6) (7 8 9))) (7 8 9) > (car (cdr (cdr '((1 2 3) (4 5 6) (7 8 9))))) (7 8 9)
caddr は、 carと cdrと cdrらしい。
> (cddar '((1 2 3) (4 5 6) (7 8 9))) (3) > (cdr (cdr (car '((1 2 3) (4 5 6) (7 8 9))))) (3)
cddar は、 cdrと cdrと carでいいのかしら。
> (cadadr '((1 2 3) (4 5 6) (7 8 9))) 5 > (car (cdr (car (cdr '((1 2 3) (4 5 6) (7 8 9)))))) 5
cadadr は、 carと cdrと carと cdr らしいが、もーわからん。
スクリプト言語によっては、かなり移入されてる気が。
> (setf foo '(1 2 3)) (1 2 3) > (setf bar '(1 2 3)) (1 2 3) > (eq foo bar) NIL > (equal foo bar) T > (setf foo2 foo) (1 2 3) > (setf foo3 foo) (1 2 3) > (eq foo2 foo3) T
リストの要素を数えるCommon Lisp が例題に載っていた。
手習い風に書いてみた。
(define my-length (lambda (list) (cond ((null? list) 0) (else (+ 1 (my-length (cdr list))))))) gosh> (my-length '(1 2 3 4 5 6)) 6
シンボルがリストにあれば、それとその後ろすべての
リストを返す。
なければ偽を返す。
どっちも似たようなものなんだろうな。
> (member 'foo '(1 2 foo nil t)) (FOO NIL T) > (member nil '(1 2 foo nil t)) (NIL T) > (member 3 '(1 2 foo nil t)) NIL
gosh> (member 'foo '(1 2 foo #f #t)) (foo #f #t) gosh> (member #f '(1 2 foo #f #t)) (#f #t) gosh> (member 3 '(1 2 foo #f #t)) #f
リンクはご自由にどうぞ。でもURLや内容が変った場合はあしからず。