schemeのリスト

最近ちょっとだけschemeに関して勉強をしている。
当然schemeも基本的なデータ構造はかなり持っているが、特徴的なものとしては手続き?とリストだと思う。手続きは話を聞いているだけなのでまだ使ったことはないのでここでは語らない。今回はタイトル通りリストについて色々な操作を行ってインタープリタからの出力から色々と探ってみることにした。

scemeでのリストも他の言語でのリストと同じく基本的にはデータ+次のアドレスという形に出来る。しかしこのリストは自由度が非常に高くアドレス+アドレス、データ+データというかたちも取れるようだ(というよりもschemeでは基本前者のイメージみたいだ)。その例を一部あげてみたいと思う。

(cons 1 2)

と入力してみると(1 . 2)という値がかえってくる。ちなみにconsとはリストを作る関数である。この場合 1 と2という要素を持ったリストが生成されていることが解る。当然、引数としてリストを与えてあげればまたリストを作ることが出来るはずなので実行してみた。

(cons 1 (cons 2 3))

という式を用意し、実行してみた結果は(1 2 . 3)となっている。僕のイメージだと(1 . 2 . 3)ってなってくれるはずなのに・・・ではたくさん付け加えてみたらどうだろうかと調べて見ることにした。

(cons 1(cons 2 (cons 3 (cons 4 5))))

この式を実行すると(1 2 3 4 . 5)という値がかえってくる。じゃあ

(cons (cons 1 2) (cons 3 4))

を実行すると((1 . 2) 3 . 4)となる当初予定していた形に近いものが出てきた。

色々いじってみた結果僕の予想では、同じセルの中に入っている場合は.が使われるみたいだ。つまり.が付いている方がイレギュラーの可能性が高いということである。では.を表示させない形にするにはどうすれば良いのだろうか。調べた結果から言うと空リストを入力として与えれば良いようだ。
例)

(cons 1 (cons 2 '()))

結果は(1 2)となり予想と同様に表示が出来た。

個人的にはリストと言われるとデータ構造とアルゴリズムで実装したデータ+アドレスのイメージが強く始めは良くわからなかったが、色々と便利そうなのは事実である。