2013-08-30 23 views
3

我想知道爲什麼每個常見的lisp函數/宏定義都返回正在定義的內容?它可以返回零或函數本身。爲什麼要返回定義的符號?有什麼我可以做的嗎?爲什麼每個普通的lisp都返回正在定義的內容

> (defun foo()) => foo 

> (defmacro bar()) => bar 
+0

>我能做些什麼嗎? - 換一個宏?我無法告訴*爲什麼這是存在的行爲,但返回'nil'對我來說似乎沒有多大用處。我真的不能想到其他許多有用的東西,你可以從'defmacro'返回...... – 2013-08-30 07:33:14

+0

>我能做些什麼嗎? - 這種行爲造成什麼問題?如果我們新的,我們可以幫助更多 – Baggers

+0

@巴格斯它只是出於我的好奇心。感謝您的回覆。 – juanitofatas

回答

5

我期望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 

好吧,看起來不錯。

2

每個表單返回的東西的原因是它是如何設計的。在read-eval-print-loop中,這很有用,所以即使沒有使用,也可以得到確認。

除了CL以外,返回的東西並不重要,因爲它的規格中有specified,所以每個CL都是這樣做的。

記住它只是在REPL中顯示什麼返回。當您運行腳本時,只會顯示您打印的內容。

另一種主要的方言Scheme被稱爲在它發生變異時不會返回任何東西。實際上它是如何返回一個只有REPL忽略的特殊對象。如果你(顯示(設置!X 6)),你會得到一些打印的東西。

+0

你猜測,在CL規範中沒有任何東西給出這個推理。 –

+0

@RainerJoswig如果我們可以同意CLHS是規範,那麼它指定[函數名稱將被返回](http://clhs.lisp.se/Body/m_defun.htm)。 – Sylwester

+0

規範中沒有任何內容表示某種東西 - 例如「確認」。 –

相關問題