2016-06-19 2 views
0

함수 정의가 make-cd이고 잘못된 답을 얻기 위해 함수를 실행할 때.(list ...) vs '(...) in Lisp

(defun make-cd (title artist rating ripped) 
    '(:title title :artist artist :rating rating :ripped ripped)) 

(add-record (make-cd "Roses" "Kathy Mattea" 7 t)) 

(:TITLE TITLE :ARTIST ARTIST :RATING RATING :RIPPED RIPPED) 

나는 정답을 얻을 수 (list ...)을 사용해야합니다.

(defun make-cd (title artist rating ripped) 
    (list :title title :artist artist :rating rating :ripped ripped)) 

(add-record (make-cd "Roses" "Kathy Mattea" 7 t)) 

(:TITLE "Roses" :ARTIST "Kathy Mattea" :RATING 7 :RIPPED T) 

왜 그렇습니까?

+0

'(X Y Z)'는'(QUOTE (X Y Z))'의 줄임말입니다. ['QUOTE'] (http : //www.lispworks.com/documentation/HyperSpec/Body/s_quote.htm)은 단순히 주어진 객체를 평가하는 대신 리터럴 데이터로 반환합니다. 즉, 여러분의 예'TITLE'에서'ARTIST','RATING'과'RIPPED'는 그 이름을 가진 변수에 대한 참조가 아닙니다; 그들은 단지 문자 그대로의 상징입니다. – jkiiski

+0

이것은 '$ WYSIWYG'가 $ WYSIWYG '이고 $ WYSIWYG가 아닌 문자열을 보간하지 않는 상수 문자열의 차이와 비슷합니다. "// =>" "This is is 대체되지 "않습니다. – Sylwester

답변

3

Lisp에는 심볼이 데이터 구조로 있습니다. 기호는 심볼로 사용되거나 코드에서 변수로 사용할 수 있습니다.

당신은 인용 표현과 기능에 대한 평가 규칙을 기억할 필요가 호출 인용 표현에 대한

평가 규칙 : 인용 된 표현 안에는 아무 것도 평가하지 않습니다. 값은있는 그대로 반환됩니다.

함수 호출에 대한 평가 규칙 : 함수 호출시 모든 인수는 왼쪽에서 오른쪽으로 평가되고 이러한 결과는 함수에 전달됩니다. 함수의 계산 결과가 리턴됩니다.

만들기 데이터 :

인용 된 기호 : A는 목록을 인용

CL-USER 13 > 'foo 
FOO 

. 따옴표 안에있는 것은 평가되지 않습니다.

CL-USER 14 > '(foo bar) 
(FOO BAR) 

중첩 목록, 인용구.

CL-USER 15 > '((foo bar) (foo baz)) 
((FOO BAR) (FOO BAZ)) 

list 기능을 사용하여 새로 생성 된 목록입니다. 내용은 기호입니다.

CL-USER 16 > (list 'foo 'bar) 
(FOO BAR) 

갓 만든 중첩 된 목록 :

CL-USER 17 > (list (list 'foo 'bar) (list 'foo 'bar)) 
((FOO BAR) (FOO BAR)) 

갓 만든 목록, 인용하여 목록 내용과 :

:

CL-USER 18 > (list '(foo bar) '(foo bar)) 
((FOO BAR) (FOO BAR)) 

변수를 사용하여 데이터를 생성 기능을 사용하여 list 2 va riables하십시오 backquoted 목록을 사용하여

CL-USER 19 > (let ((foo 1) 
        (bar 2)) 
       (list foo bar)) 
(1 2) 

. 쉼표 뒤에있는 요소가 평가됩니다. 중첩 된 backquoted 목록을 사용하여

CL-USER 20 > (let ((foo 1) 
        (bar 2)) 
       `(,foo ,bar)) 
(1 2) 

. 쉼표 뒤에있는 요소가 평가됩니다.

CL-USER 21 > (let ((foo 1) 
        (bar 2)) 
       `((,foo ,bar) (,foo ,bar))) 
((1 2) (1 2))