2014-11-03 146 views
1

我是新來的lisp,我試圖通過簡單的檢查來查看列表是否爲空。出於測試目的,我創造了這個測試功能:Lisp(null(QUOTE NIL))返回NIL

(defun test (list) 
    (if (null (caddr list)) 
     (make-node 1) 
     (caddr list))) 

如果使用定義爲make-node功能:

(defun make-node (atm) 
    (cons atm `(`() `()))) 

運行(make-node 6)當我得到:

(6 (QUOTE NIL) (QUOTE NIL))

這是我想。

我然後調用(test (make-node 6))然後我得到:

(QUOTE NIL) 

這是從測試(caddr list)。如果你運行(null (QUOTE NIL))你得到T這就是我想得到的,但是當我從給定的測試函數運行它時,我收到NIL

所以我的問題是爲什麼當我檢查這是否爲空爲什麼我得到NIL而不是T

回答

3

當你評估(null (quote nil))(quote nil)評估,導致nil被用作功能null的說法。

然而,當你評估像(null (function-returning-quote-nil))東西,function-returning-quote-nil評估,導致列表(quote nil),然後將其作爲沒有進一步的評估參數的功能null

比較來

之間

(null (quote nil)) ; => t

(null '(quote nil)) ; => nil

+0

謝謝,這讓我很容易理解。有沒有辦法去除引號?或者你知道如何檢查內部列表是否爲空? – 2014-11-03 23:32:23

+0

去引用是由'eval'完成的,但避免'eval'的解決方案通常更好。我猜想Sylvester關於改變'make-node'的建議可以解決你的問題,但是否則你可以使用測試'(和(eql(first(third list))'quote)(not(second(third list))))' 。 – 2014-11-04 06:26:24

2
(CADDR '(6 (QUOTE NIL) (QUOTE NIL))) ; ==> (QUOTE NIL) or just 'NIL 

與兩個符號QUOTENIL列表是不等於NIL。只有NIL等於NIL。例如。

(DEFPARAMETER TEST 'NIL) 
TEST ; ==> NIL 
(NULL TEST) ; ==> T 

這樣做起作用,因爲'NIL被評估爲NIL並被分配到TEST。 TEST被評估爲NIL並且它是CLs NULL值。但是:

(DEFPARAMETER TEST2 ''NIL) 
TEST2 ; ==> 'NIL or (QUOTE NIL) 
(NULL TEST2) ; ==> NIL 

有兩個元素報價和NIL,著名顯示'NIL名單,是不是NIL。只有NILNIL

編輯

看着你對unquoting的意見後,我敢肯定,你想這是make-node

(defun make-node (atm) 
    (cons atm '(()()))) 

(test (make-node 6)) ; ==> (1 NIL NIL) 

有沒有這樣的事情在一個數據結構,除非你unquoting實際上想要在您的數據中使用符號quote,在引用內容的引號內沒有任何意義。 (半真理既然有,但它涉及到宏)

+0

謝謝這是同樣的事情,我檢查了答案一個區別。我認爲對方稍微容易理解謝謝 – 2014-11-03 23:33:23

+0

編輯工作謝謝你解決了我的問題。 – 2014-11-05 03:41:01