Common Lisp の関数の引数は左から右の順序で評価されるため、通常の関数を使用しない理由は次のとおりです。
(defun progn2 (&rest body)
(first (last body)))
特別なフォームの代わりに?
Common Lisp の関数の引数は左から右の順序で評価されるため、通常の関数を使用しない理由は次のとおりです。
(defun progn2 (&rest body)
(first (last body)))
特別なフォームの代わりに?
PROGN
関数では取得できない別の機能もあります。
Common Lisp コードのファイルでこのコードを想像してみてください:
(progn
(defmacro foo () ))
対。
(my-progn
(defmacro foo () ))
コンパイラを使用すると、フォームがトップレベルのフォームとしてPROGN
扱われます。DEFMACRO
これは、たとえば、コンパイラがマクロ定義があることを認識し、コンパイル時の環境で使用できるようにすることを意味します。
function を使用すると、フォームがトップレベルではないためMY-PROGN
、コンパイラはフォームを認識しません。DEFMACRO
progn
評価した最後のフォームのすべての値を返しますが、関数は最初の値のみを返します。
(progn (values 1 2 3))
=> 1, 2, 3
(progn2 (values 1 2 3))
=> 1
progn
(Rainer が最初に言及した)のもう 1 つの重要な機能は、すべてのフォームをトップレベルに保持することです。これにより、マクロを複数のフォームに展開できます (たとえば、 ""返された値は使用されていません" という警告に対する私の回答を参照してください) -マクロのコンパイル」 )。