ネストされた s 式を頭にサポートする Lisp はありますか? 例えば
((f 2) 3 4)
for は(f 2)
、適用する関数/マクロに評価されると推定されます3 4
。
そのようなことをサポートするLispを持つことは可能ですか? または、これを禁止する/非実用的にする技術的な制限はありますか?
ネストされた s 式を頭にサポートする Lisp はありますか? 例えば
((f 2) 3 4)
for は(f 2)
、適用する関数/マクロに評価されると推定されます3 4
。
そのようなことをサポートするLispを持つことは可能ですか? または、これを禁止する/非実用的にする技術的な制限はありますか?
変数と関数に単一の名前空間を持つ Lisp では、式は有効です。これらは Lisp-1 と呼ばれます。Scheme と Clojure は、そのような Lisp の例です。
変数と関数に別々の名前空間を持つ Lisp では、式は(funcall (f 2) 3 4)
. これらは Lisp-2 と呼ばれます。Common Lisp と Emacs Lisp は、そのような Lisp の例です。
Lisp-2 では、すべてのシンボルに値 slotと関数 slotがあります。値スロットに格納されている関数を呼び出すには、funcall
キーワードを使用する必要があります。
この問題について詳しくは、http ://www.dreamsongs.com/Separation.html をご覧ください。
編集:Rainer Joswigのおかげで、答えを修正しました。
たとえば、上記の Common Lisp では有効ではありません。Common Lisp の構文では、通常、関数呼び出しの先頭としてリストを使用できません。FUNCALL
返された関数値を呼び出すために使用する必要があります。
(funcall (f 2) 3 4)
他のいくつかの Lisp 方言では許可されています。Scheme はそのような Lisp の方言です。また、Scheme は関数呼び出し式の先頭も評価します。
Scheme などの Lisp-1 Lisp では、通常、関数自体も含めて、関数形式のすべての式が評価されます。
Common Lisp などの Lisp-2 Lisp は、通常、関数と引数に対して異なる動作をします。引数が評価されるのに対し、関数は検索されます。評価された関数を呼び出す一般的な方法は、funcall
orを使用することapply
です。
(funcall (f 2) 3 4)
Common Lisp では、演算子内の関数に対して何かを評価する必要がある場合は、ラムダ形式を使用できます。
((lambda (&rest args) (apply (f 2) args)) 3 4)