12

次の関数を使用します。

(defun sum-greater (x y z)
 (> (+ x y) z))

LISP では、リストの最初の要素は常に、後続のアトム/リストで実行される関数を表すと理解しています。では、なぜ LISP は in を and に対して実行される関数として扱わないのxでしょう(x y z)か。明らかに、これは望ましい動作ではありませんが、予期される動作です。yz

おそらく、定義する関数defunは、リストの標準的な LISP 評価を何らかの形でオーバーライドしますか? もしそうなら、これを詳しく教えていただけますか?

ありがとう

4

5 に答える 5

8

Common Lisp の IIRC は、少なくともdefunマクロ ( HyperSpec ) です。つまり、引数の評価戦略を定義することができます。

于 2010-11-16T15:30:11.263 に答える
6

defunマクロなので特別です。また、マクロは実装に依存する可能性があるため、あらゆる種類の黒魔術が内部で発生する可能性があります。

Lisp HyperSpec (Common Lisp)、「マクロ展開時に評価される引数はありません」と引用します。

于 2010-11-16T15:30:37.753 に答える
3

ここから Lisp の基本的な紹介をダウンロードできます。

Common Lisp: A Gentle Introduction to Symbolic Computation、David S. Touretzky 著

Lisp、特に Common Lisp にはいくつかの Lisp 形式があります。

  • 関数呼び出し

  • マクロ呼び出し

  • 特殊フォーム

DEFUNはマクロです。したがって、マクロは評価される部分と評価されない部分を定義します。ANSI Common Lisp の場合、これは標準で定義され、DEFUN マクロによって実装されます。

于 2010-11-16T15:31:08.520 に答える
3

あなたの推測は正しいです。defun は通常、特殊なフォームまたはマクロです。

于 2010-11-16T15:30:18.550 に答える
2

defun は関数ではなく、特別な形式 (または 1 つに要約される) であり、これらの評価メカニズムは異なります。同様の例は、引数の 1 つがまったく評価されずに完全に破棄される場合です。

于 2010-11-16T15:31:36.833 に答える