17

Common Lisp の関数の引数は左から右の順序で評価されるため、通常の関数を使用しない理由は次のとおりです。

(defun progn2 (&rest body)
  (first (last body)))

特別なフォームの代わりに?

4

2 に答える 2

27

PROGN関数では取得できない別の機能もあります。

Common Lisp コードのファイルでこのコードを想像してみてください:

(progn
  (defmacro foo () ))

対。

(my-progn
  (defmacro foo () ))

コンパイラを使用すると、フォームがトップレベルのフォームとしてPROGN扱われます。DEFMACROこれは、たとえば、コンパイラがマクロ定義があることを認識し、コンパイル時の環境で使用できるようにすることを意味します。

function を使用すると、フォームがトップレベルではないためMY-PROGN、コンパイラはフォームを認識しません。DEFMACRO

于 2013-06-17T07:36:11.810 に答える
24

progn評価した最後のフォームのすべての値を返しますが、関数は最初の値のみを返します。

(progn (values 1 2 3)) 
=>  1, 2, 3
(progn2 (values 1 2 3)) 
=>  1

progn(Rainer が最初に言及した)のもう 1 つの重要な機能は、すべてのフォームをトップレベルに保持することです。これにより、マクロを複数のフォームに展開できます (たとえば、 ""返された値は使用されていません" という警告に対する私の回答を参照してください) -マクロのコンパイル」 )。

于 2013-06-16T22:03:01.583 に答える