The Little Schemer
atom
データの最小単位
list
カッコでくくったアトム
空のlist(0個のS式を含むリストをnull listとかempty listという)
S式
listとかatomとかの一つ以上の組み合わせ?
car
listの一番最初を取り出す関数
atomにはcarを尋ねることはできない
空のlistにはcarが定義されない
(car '(banana mellon orange)) => banana
cdr
carで取り出さなかった部分を取り出す関数
戻り値はlistになる
cons
第2引数はlistでないといけない
第2引数の頭にS式を入れ込むイメージ
https://gyazo.com/8955f9098d53ad97fba25d225f7ea9d8
(cons 'a '(1 2 3)) => (a 1 2 3)
(cons '(a b c) '(1 2 3)) => ((a b c) 1 2 3)
atom?
アトムか調べる関数
eq?
同じアトムか調べる関数。数とアトムは違うので比較できないらしい。
ただ、リストも実は比較できて、中身が同じなら真になる
lat?
リストの中にリストがないか?を調べる
問題: lat?を作るにはどうしたらいいか
(atom? (car l)) を繰り返せればいいとおもう mactkg.icon
答え
code:lat.lisp
(define lat?
(lambda (l)
(cond
(atom? (car l)) (let? (cdr l))
いきなり再帰なのうける mactkg.icon
else
常に真
ちょっとよくわからなかった mactkg.icon
or
(or A B)
member?
(member? poached (fried eggs and scrambled eggs)) => #f
第一引数が第二引数に含まれるかどうかを調べる
関数にしてみよう
code:member.lisp
(define member?
(lambda (a lat)
(cond
((null? lat) nil)
(else (or (eq? (car lat) a)
(member? a (cdr lat)))))
第一の戒律
いかなる関数を表現するときも最初の質問はすべて null? にしよう
rember
remove memberの略
(rember rice (curry rice rice)) => (curry rice)