javascriptでlispのようなものを実装して遊んでいます。
lispやschemeの根元にはコンスセルという対になったポインタが存在し、コンスセルのcdr部にコンスセルのポインタが連続格納されることでリストが作られる。そして同時にlispやschemeのプログラム自体もリストで構成されているという認識をしています。
javascriptでコンスセルを作成することを考えた時、私はjavascriptのArrayの[0]と[1]を利用して作成することを考えました。しかしここで違和感を感じました。Arrayはもともとリストであるのに、リストを作るためにArrayを使ってコンスセルを作成してもう一度リストを作ることに意味はあるのか?ということです。
schemeでlambdaを作成した時、restargumentを取得する際にパラメータ部分にドット対を使うことで以降の引数をリストで受け取れることを知って、なるほどドット対はこんな風に使うのかと思いました。その他の言語では...rest
なんて書いたりしますよね。しかしrestargumentを受け取る方法は他にも作れそうです。(lambdaの中で__args__
を参照できるとか)
何言ってんだ!コンスセルがあるから木構造ができるんだよ。という意見もありそうですが、リストを使った木構造の方が複雑な木構造を実現できる気がしています。
また、コンスセルが存在するからこそconsを使ったエレガントなリストの作成や、carやcdrを使って好きな部分を参照できるため、Arrayだったらsliceなどを使わないと実現できないことが負荷なくできるのであろうとも考えています。
しかしそもそもコンスセルのポインタ地獄で式を評価すること自体、javascriptにとってかなり負荷になるのではないか?と思いました。またコンスセルの存在しないlispのようなものを作ったとしたら、それはドット対という特殊な構文を必要としないシンプルなものになるのでは?とも感じています。
ドット対の存在しないlispなんてlispとは言えない!なんて思われるかもしれませんが、まさにそう思われた方はなぜそう思うのか教えていただきたいです。
lispやschemeでまともにプログラムを組んだことがないのにlispのようなものを実装していること自体がおかしいとは思うのですが、修行が足りないためにコンスセルやドット対にメリットを感じられません。Arrayを使ったリストだけを利用してLISPを実装したら、何か不便なことが起こるのでしょうか?
C言語のような可変長配列の存在しない言語(確かないですよね?)でLISPを実装する場合にはコンスセルは可変長配列を実現するだけでなく柔軟な切り貼りができる便利な存在となりえるが、Javascriptには可変長配列のArrayが元々存在するからメリットを感じにくいということなのでしょうか?
詳しい方、アドバイスよろしくおねがいいたします。

回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/01/03 09:07