すべての一般的な Lisp 関数/マクロ定義が、定義されているものを返すのはなぜだろうか? nil または関数自体を返す可能性があります。定義されたシンボルを返すのはなぜですか? それについて何かできることはありますか?
> (defun foo ()) => foo
> (defmacro bar ()) => bar
すべての一般的な Lisp 関数/マクロ定義が、定義されているものを返すのはなぜだろうか? nil または関数自体を返す可能性があります。定義されたシンボルを返すのはなぜですか? それについて何かできることはありますか?
> (defun foo ()) => foo
> (defmacro bar ()) => bar
DEFUN
私は、Lisp でフォームを定義するたびに、定義されたものの名前 ( のように) を返すか、定義されたオブジェクト( のように)を返すことを期待していますDEFCLASS
。
これは、後で使用できる便利な値です。Lisp インタラクションでは、変数*
とは最後の値**
を持ちます。***
したがって、インタプリタとコンパイラを使用して Lisp で実行できます。
クリップ:
[1]> (defun foo-with-a-long-name (a) (+ a 42))
FOO-WITH-A-LONG-NAME
関数のコンパイルは次のとおりです。
[2]> (compile *)
FOO-WITH-A-LONG-NAME ;
NIL ;
NIL
エラーなし。分解を見てみましょう:
[3]> (disassemble *)
Disassembly of function FOO-WITH-A-LONG-NAME
(CONST 0) = 42
1 required argument
0 optional arguments
No rest parameter
No keyword parameters
4 byte-code instructions:
0 (CONST&PUSH 0) ; 42
1 (LOAD&PUSH 2)
2 (CALLSR 2 55) ; +
5 (SKIP&RET 2)
NIL
いいですね。
すべてのフォームが何かを返す理由は、それがどのように設計されているかです。read-eval-print-loop では、使用されていない場合でも確認が得られるので便利です。
何が返されるかは、CL がその仕様で指定されていること以外は重要ではないため、すべての CL が同じことを行います。
返されたものを表示するのは REPL のみであることに注意してください。スクリプトを実行すると、印刷したものだけが表示されます。
もう 1 つの主要な方言である Scheme は、変異しても何も返さないと言われています。実際には、REPL だけが無視する特別なオブジェクトを実装が返すということです。(display (set! X 6)) すると、何かが印刷されます。