2014-11-03 2 views
1

저는 lisp에 익숙하지 않습니다. 목록이 비어 있는지 간단한 확인을 시도하고 있습니다. 로 정의 make-node 기능을 사용하는 경우Lisp (null (QUOT NIL))은 NIL을 반환합니다.

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

:

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

(make-node 6)을 실행할 때 내가 얻을 : 테스트를 위해 나는이 테스트 함수를 만들어

(6 (QUOTE NIL) (QUOTE NIL))

이되는 내가 필요.

그때 그때 얻을 수있는 (test (make-node 6)) 전화 : 테스트에서 (caddr list)입니다

(QUOTE NIL) 

합니다. (null (QUOTE NIL))을 실행하면 T을 얻습니다.하지만 원하는 테스트 함수에서 실행하면 NIL가 나타납니다.

내 질문에 왜 이것이 null인지 확인하면 왜 대신 NIL이 나옵니까?

답변

3

(절반 진실이 있기 때문에, 그러나 매크로를 포함), (quote nil)은 함수 null의 인수로 사용되는 nil의 결과로 평가된다. 당신이 (null (function-returning-quote-nil)) 같은 것을 평가할 때

는하지만, function-returning-quote-nil 후 추가 평가없이 기능 null의 인자로 사용하는 목록 (quote nil)의 결과로 평가된다.

(null (quote nil)) ; => t

사이

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

+0

감사합니다. 이해하기 쉽습니다. 그것을 de-quote하는 방법이 있습니까? 또는 내부 목록이 비어 있는지 확인하는 방법을 알 수 있습니까? –

+0

인용 부호 생략은'eval'에 의해 수행되지만,'eval'을 피하는 해결책은 일반적으로 더 좋습니다. 실베스터 (Sylvester)가'make-node '를 바꾼다는 제안이 문제를 해결한다고 가정하지만, 그렇지 않으면''(그리고 (eql (첫 번째 세 번째 목록))' '(두 번째 (세 번째 목록) . –

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

개의 심볼 QUOTE과 함께 NIL 목록 NIL 동일하지 않다. NILNIL과 같습니다. 예.

(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로 표시 두 가지 요소의 QUOTE와 NIL과 목록이, NIL은 아닙니다. NILNIL입니다.

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

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

데이터 구조와하지 않는 unquoting 같은 것은 없다 :

편집

unquoting에 대한 의견을보고 한 후 난 당신이 make-node으로 사용할 확신 실제로 데이터에 기호 quote을 넣고 싶다면 따옴표 안에 따옴표를 넣는 것은 의미가 없습니다. 당신이 (null (quote nil))을 평가할 때

+0

이 내가 대답을 검사하는 것과 같은 일입니다 감사의 차이를 비교. 나는 조금 더 쉽게 이해할 수 있다고 생각했지만 –

+0

편집은 내 문제를 해결해 주셔서 감사합니다. –