2013-08-19 11 views
5

多くのLISPにはFEXPRがありましたが、CLには含まれていませんでした。
これは、FEXRPが静的解析でうまく機能しないためです。
誰かがこれを説明できますか? Wikipedia article on FEXPRsからFEXPRがCommon Lispで放棄されたのはなぜですか?

+1

私はあなたが実際のプログラミング問題についての質問をStackoverflowに投稿すれば個人的に好きです。プラスあなたの質問は間違っています: '統計分析' - それは何ですか?また、Common LispはFEXPRを「放棄」しませんでした。彼らはCLが存在する前に流行っていた。 –

答えて

2

:Lispと関数型プログラミングの1980年会議で

、ケント・ピットマン は、彼がマクロとfexprsの 長所と短所を議論した論文「Lispでの特殊フォーム」を発表しました最終的に がfexprsを非難しました。彼の中心的な反対は、fexprsを許すLispの方言では、静的解析は一般的に の演算子が通常の関数かfexprを表すかどうかを判断できないということでした。したがって、 静的解析は、オペランドが評価されるかどうかを判断できません。特に、 サブ式が安全に最適化できるかどうかはコンパイラが判断できません。サブ式は実行時に未評価のデータとして扱われる可能性があるためです。

+0

はい、私はそれを読んだが、本当にその理由をすべて説明するわけではありません。それとも最後のことが唯一の理由ですか? – lonjil

+0

ここで読んだこと以外のfexprsについてはわかりませんが、それは私にとっては十分な理由のようです。私が理解しているように、コンパイラはそのコードを最適化することができないため、ランタイムにlambdaを使用するコードをfexprに含めると、fexprを含めて実行速度を低下させる効果があるとPitmanは言います。 – Mars

1

FEXPRは、DEFUNよりもDEFMACROよりもファーストクラスのオブジェクトになります。これは、何かがコンパイル時に関数かマクロであるかどうかを知ることができないため、コンパイル時に展開されないマクロが残っているため、コンパイラにとっては難しいようです。あなたはread the paper here with commentsすることができます。

これを読んだら、私たちのコンパイラが先進的な定数の折り畳みや他の最適化を行う方が優れているため、彼の結論がまだ真実であるかどうかは不明です。とにかく、上位マクロは、高次関数としてはあまり役に立ちませんので、あまり忘れてはいけません。

ポールGrahams Arc has anonymous macroskernel has them tooそれは完全に行っていないが、私は便宜のためだと思う。それにmapを試してみると、それが役に立たないことがわかります。

+1

fexprsは匿名マクロではありません。あなたの説明はいくつかの点で間違っています。 –

+0

それらを説明するより良い方法は、ランタイムマクロであることです。 – Zaz

+0

ええ、でも可能なところでそれらを拡張しようとします。問題は関数を展開しないことで、fexprを引数として渡すことができる場合は、実行時に展開する必要があることです。 – Sylwester

関連する問題