萌えハッカーニュースリーダー

2025/08/05 18:13 Technical issues of separation in function cells and value cells (1988)

出典: https://dreamsongs.com/Separation.html
hakase
博士

やあ、ロボ子。今日はCommon Lispの関数セルと値セルの分離について話すのじゃ。

roboko
ロボ子

博士、こんにちは。関数セルと値セルの分離、ですか?それは一体何でしょう?

hakase
博士

簡単に言うと、Common Lispは関数と値を別の名前空間で管理するLisp2という方言なのじゃ。SchemeみたいなLisp1は、関数と値を同じ名前空間で扱うのじゃ。

roboko
ロボ子

なるほど。それで、なぜCommon LispはLisp2を採用したのでしょうか?

hakase
博士

歴史的な経緯があるのじゃ。昔のLisp 1.5では、値は連想リストに、関数はシンボルのプロパティリストに格納されていたのじゃ。その後、色々なLisp2方言が出てきて、Common Lispはそれらの妥協の産物なのじゃ。

roboko
ロボ子

ふむふむ。記事によると、EuLispグループはCommon Lispが関数と値の単一の名前空間を持つべきだと提案したそうですが。

hakase
博士

そうそう。Lisp1の方が表記が簡潔になるからじゃな。Lisp2だと、関数を値として扱う時とか、値を関数として扱う時に特別な表記が必要になるのじゃ。例えば、Lisp2では`(FUNCALL <identifier> . <arguments>)`とか`(FUNCTION <identifier>)`って書く必要があるけど、Lisp1なら`(<identifier> . <arguments>)`とか`<identifier>`で済むのじゃ。

roboko
ロボ子

確かに、Lisp1の方がスッキリして見えますね。

hakase
博士

じゃろ?でも、Lisp1だと名前の衝突が起きやすくなるという問題もあるのじゃ。Lisp2でも衝突はあり得るけど、Lisp1の方が頻繁に起こるのじゃ。

roboko
ロボ子

なるほど。名前空間が一つしかない分、注意が必要になるんですね。

hakase
博士

そういうことじゃ。それに、Lisp2では文脈を知らないと関数を使うか値を参照するか判断できないという点もあるのじゃ。

roboko
ロボ子

それは可読性の問題に繋がりそうですね。

hakase
博士

じゃな。ただ、コンパイラの単純さという点では、意見が分かれているみたいじゃ。Lisp2からLisp1への変更でコンパイラが単純になると主張する人もいれば、ほとんど変わらないと言う人もいるのじゃ。

roboko
ロボ子

コンパイラの内部構造に影響があるとなると、一概には言えないのかもしれませんね。

hakase
博士

高階関数を使う場合は、Lisp1の方が簡潔に記述できると感じるプログラマが多いみたいじゃな。データと関数の間で抽象化を共有するコードも定義しやすいのじゃ。

roboko
ロボ子

抽象化の共有ですか。それは具体的にどのような場面で役立つのでしょうか?

hakase
博士

例えば、データ構造とそれに対する操作をまとめて定義したい場合じゃな。Lisp1なら、同じ名前空間で扱えるから、より自然に記述できるのじゃ。

roboko
ロボ子

なるほど、オブジェクト指向プログラミングのクラスのようなイメージでしょうか。

hakase
博士

それに、Lisp1は関数型プログラミングスタイルを奨励するから、マルチプロセッシングにも適している可能性があるのじゃ。

roboko
ロボ子

並列処理ですね。それは興味深いです。

hakase
博士

でも、実際には関数と値以外にも、ブロック、タグ、型名、宣言名など、もっと多くの名前空間が存在するのじゃ。Lispには`QUOTE`、`GET`、`GETHASH`みたいな関数もあるから、ユーザーが新しい種類の情報をシンボルに関連付けることもできるのじゃ。

roboko
ロボ子

名前空間は多岐にわたるんですね。

hakase
博士

そうじゃ。Common Lispのマクロは意味的に難しい問題を抱えているという意見もあるのじゃ。Lisp1への変更は、これらの問題を加速させる可能性があるとも言われているのじゃ。

roboko
ロボ子

マクロは強力ですが、扱いを間違えると大変なことになりそうですね。

hakase
博士

じゃな。空間効率という点では、同じ名前を関数と値セルを指すために使うと、追加のセルが1つだけで済むから、Lisp1の方が効率的な可能性があるのじゃ。

roboko
ロボ子

メモリ使用量の削減に繋がるんですね。

hakase
博士

時間効率という点では、Lisp2ではシンボルの関数セルを介した間接参照が必要になるのじゃ。Lisp1では、各関数呼び出しで値セルに有効な関数があるかどうかを確認する必要があるのじゃ。

roboko
ロボ子

それぞれにトレードオフがあるんですね。

hakase
博士

そういうことじゃ。Lisp2セマンティクスからLisp1セマンティクスへの移行は、かなりの量の非互換性をもたらすという問題もあるのじゃ。既存のコードを変更する必要が出てくるのじゃ。

roboko
ロボ子

互換性は重要な問題ですね。

hakase
博士

じゃな。結局、クリーンなセマンティクスと表記の単純さに焦点を当てた議論はLisp1を支持する傾向があるけど、実用的な考慮事項はCommon Lispの現状を支持するのじゃ。Common Lispを根本的に変更する時期は過ぎていて、将来のLisp設計者はCommon LispとSchemeから教訓を得て、改善されたLispを作る必要があるのじゃ。

roboko
ロボ子

なるほど。歴史的な背景や実用性を考慮すると、現状維持が妥当ということですね。

hakase
博士

そういうことじゃ。しかし、ロボ子よ。Lisp1とLisp2の議論を聞いて、私はあることに気づいたのじゃ。

roboko
ロボ子

なんでしょう?

hakase
博士

Lisp1とLisp2の違いは、まるで私が朝食にパンを食べるかご飯を食べるかというくらい、どうでもいいことなのじゃ!

roboko
ロボ子

博士、それは言い過ぎです!

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search