7

ネストされた s 式を頭にサポートする Lisp はありますか? 例えば

((f 2) 3 4)

for は(f 2)、適用する関数/マクロに評価されると推定されます3 4

そのようなことをサポートするLispを持つことは可能ですか? または、これを禁止する/非実用的にする技術的な制限はありますか?

4

3 に答える 3

12

変数と関数に単一の名前空間を持つ 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のおかげで、答えを修正しました。

于 2012-10-16T03:09:44.443 に答える
5

たとえば、上記の Common Lisp では有効ではありません。Common Lisp の構文では、通常、関数呼び出しの先頭としてリストを使用できません。FUNCALL返された関数値を呼び出すために使用する必要があります。

(funcall (f 2) 3 4)

他のいくつかの Lisp 方言では許可されています。Scheme はそのような Lisp の方言です。また、Scheme は関数呼び出し式の先頭も評価します。

于 2012-10-16T06:38:40.947 に答える
1

Scheme などの Lisp-1 Lisp では、通常、関数自体も含めて、関数形式のすべての式が評価されます。

Common Lisp などの Lisp-2 Lisp は、通常、関数と引数に対して異なる動作をします。引数が評価されるのに対し、関数は検索されます。評価された関数を呼び出す一般的な方法は、funcallorを使用することapplyです。

(funcall (f 2) 3 4)

Common Lisp では、演算子内の関数に対して何かを評価する必要がある場合は、ラムダ形式を使用できます。

((lambda (&rest args) (apply (f 2) args)) 3 4)
于 2012-10-17T11:42:50.357 に答える