ダイヤ「UOを!ありったけ買い占めますわよ!(鞠莉さんの金で)」
果南「ダイヤ、気持ちは分かるけど落ち着こうか」
花丸「夢で夜空を照らしたい、あの曲はブレードの明かりくらいでしっとりやってほしいずら・・・」
ダイヤ「私は!スノハレみたいにUOを折りたいんですの!」
果南「本質を見失った厄介がここに1人・・・」
花丸「歌を聴きに行く人と棒を振りに行く人の間の壁は厚いずら」
ダイヤ「ではいよいよリストの話に入りますわ。リストの扱いをマスターすればSchemeをマスターしたと言っても過言では・・・少々ありますけど」
花丸「あるんだ・・・」
ダイヤ「・・・まあ、Lisp語族は文法自体がリストで成り立っていますから、リストを理解しないことにはこれ以上の理解が深まらないのは確かですわ」
果南「メタプログラミング・・・」
ダイヤ「果南さん、そこまで踏み込む予定はないのですけれど」
果南「ほら、アニメもだいぶメタなネタ入ってきたし?」
ダイヤ「確かに次元の壁は崩れつつありますけれど・・・」
花丸「がんばルビィ、ずら」
ダイヤ「まずは前回、次の2つの文が同義という話をしましたわね」
1 2 |
(cons "chika" (cons "you" "riko")) '("chika" "you" . "riko") |
花丸「コンスセルが2つつながった書き方ずら」
ダイヤ「ではここで、空リストというものを導入します。'()
と書きますが、つながった最後のコンスセルのcdr
が空リストになっている場合、その一連のコンスセルをリストと呼びますわ」
1 |
(cons "chika" (cons "you" (cons "riko" '()))) |
ダイヤ「このように定義されたものがリストです。リテラルとして書く場合は」
1 |
'("chika" "you" "riko") |
ダイヤ「こうなりますわ」
果南「ドットがなくなった、のかな」
ダイヤ「終端を表す空リストが必ず最後にあるから書く必要がない、くらいの感覚でよいと思います」
ダイヤ「リストを作るためのlist
関数もよく使いますわね」
1 |
(list "chika" "you" "riko") |
花丸「cons
をいっぱい書くよりだいぶ楽そうずら」
ダイヤ「要素アクセスはlist-ref
とlist-tail
があります」
1 2 |
(list-ref '("chika" "you" "riko") 1) ; "you" (list-tail '("chika" "you" "riko") 1) ; ("you" "riko") |
ダイヤ「list-ref
は指定位置の要素を、list-tail
は指定位置以降の要素を含むリストを返します」
ダイヤ「最初にさりげなく話しましたが、Schemeの文はリストでできています。例えばですが」
1 |
(string-append "you" "riko") |
ダイヤ「こんな文字列連結処理がありましたわね」
果南「文字列のところで出てきたね」
ダイヤ「なんとなくお分かりかもしれませんが、これは3要素のリストですわ」
花丸「言われてみると、書き方はリストと同じずら・・・」
ダイヤ「ここは論より証拠といきましょう」
1 2 3 |
(car '(string-append "you" "riko")) ; string-append (cadr '(string-append "you" "riko")) ; "you" (cddr '(string-append "you" "riko")) ; ("riko") |
花丸「おおっ」
果南「なるほど、car
とcdr
でバラせるんだ」
ダイヤ「では、最後の例で結果が"riko"
ではなく("riko")
になっている理由はお分かりですの?・・・はい、果南さん!」
花丸「ずら!?・・・ええと・・・あれ?」
果南「私?」
ダイヤ「たまには違う人にも振りますわ」
果南「えっと、じゃあ・・・」
1 |
(cons 'string-append (cons "you" (cons "riko" '()))) |
果南「cons
使って書くとこうなって、cddr
は(cons "riko" '())
だから("riko")
。"riko"
がほしかったらcaddr
だね」
花丸「おー、果南さん、すごいずら」
ダイヤ「ぐうの音も出ませんわ」
ダイヤ「このようにSchemeの文はリストでできていて、処理系はリストの入力を受け付けるとその先頭要素を命令であるとみなして処理をするようになっています」
果南「確かに、プログラムでプログラムを記述するみたいなことがやりやすい作りだね」
花丸「未来ずら!未来ずらよ果南さん!」
ダイヤ「これはむしろ古典ですわ」