我想知道爲什麼每個常見的lisp函數/宏定義都返回正在定義的內容?它可以返回零或函數本身。爲什麼要返回定義的符號?有什麼我可以做的嗎?爲什麼每個普通的lisp都返回正在定義的內容
> (defun foo()) => foo
> (defmacro bar()) => bar
我想知道爲什麼每個常見的lisp函數/宏定義都返回正在定義的內容?它可以返回零或函數本身。爲什麼要返回定義的符號?有什麼我可以做的嗎?爲什麼每個普通的lisp都返回正在定義的內容
> (defun foo()) => foo
> (defmacro bar()) => bar
我期望Lisp中的每個定義形式都會返回已定義的名稱(如DEFUN
)或已定義的對象(如DEFCLASS
)。
這是一個有用的值,以後可以使用。在Lisp交互中,變量*
,**
和***
具有最後的值。因此,你可以在解釋器和編譯一個Lisp做:
CLISP:
[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以外,返回的東西並不重要,因爲它的規格中有specified,所以每個CL都是這樣做的。
記住它只是在REPL中顯示什麼返回。當您運行腳本時,只會顯示您打印的內容。
另一種主要的方言Scheme被稱爲在它發生變異時不會返回任何東西。實際上它是如何返回一個只有REPL忽略的特殊對象。如果你(顯示(設置!X 6)),你會得到一些打印的東西。
你猜測,在CL規範中沒有任何東西給出這個推理。 –
@RainerJoswig如果我們可以同意CLHS是規範,那麼它指定[函數名稱將被返回](http://clhs.lisp.se/Body/m_defun.htm)。 – Sylwester
規範中沒有任何內容表示某種東西 - 例如「確認」。 –
>我能做些什麼嗎? - 換一個宏?我無法告訴*爲什麼這是存在的行爲,但返回'nil'對我來說似乎沒有多大用處。我真的不能想到其他許多有用的東西,你可以從'defmacro'返回...... – 2013-08-30 07:33:14
>我能做些什麼嗎? - 這種行爲造成什麼問題?如果我們新的,我們可以幫助更多 – Baggers
@巴格斯它只是出於我的好奇心。感謝您的回覆。 – juanitofatas