3

すべての一般的な Lisp 関数/マクロ定義が、定義されているものを返すのはなぜだろうか? nil または関数自体を返す可能性があります。定義されたシンボルを返すのはなぜですか? それについて何かできることはありますか?

> (defun foo ()) => foo

> (defmacro bar ()) => bar
4

2 に答える 2

5

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

いいですね。

于 2013-08-30T12:05:05.017 に答える
2

すべてのフォームが何かを返す理由は、それがどのように設計されているかです。read-eval-print-loop では、使用されていない場合でも確認が得られるので便利です。

何が返されるかは、CL がその仕様で指定されていること以外は重要ではないため、すべての CL が同じことを行います。

返されたものを表示するのは REPL のみであることに注意してください。スクリプトを実行すると、印刷したものだけが表示されます。

もう 1 つの主要な方言である Scheme は、変異しても何も返さないと言われています。実際には、REPL だけが無視する特別なオブジェクトを実装が返すということです。(display (set! X 6)) すると、何かが印刷されます。

于 2013-08-30T09:40:40.363 に答える