2013-03-24 6 views
-2
(list '+ 3 5) 

(3 + 5)(리스트 (리스트 ....))

(list (+ 3 5)) 

(8)

(list (list '+ 3 5)) 

((3 + 5))

이유 세 번째 줄의 결과는 두 번째 줄의 결과와 다릅니다.

+1

다른 코드이기 때문에 ... ...? – imulsion

+1

질문을 편집하여 의미있는 제목으로 변경하십시오! – Joel

답변

2

두 번째 예제에서는 (+ 3 5), 숫자 3과 5를 평가 한 다음 기호 +에 해당하는 함수를 숫자 3과 5에 적용하여 전체 식을 계산합니다. 숫자는 자체적으로 계산됩니다. 즉 리스프는 기호 + 결과 '+()뿐만 아니라 3, 5를 평가하고, 첫 번째 예에서

). 첫 번째 예에서 그들에게 '를 추가 할 필요가 없습니다 그 이유는 다음 함수를 적용 list은 (평가 된) 인수 목록을 만드는 것 이상을 수행하지 않습니다.

세 번째 예제는 내부 목록과 동일한 작업을 수행합니다. 첫 번째 예제에서와 마찬가지로 모든 사항이 평가됩니다. 결과는 (+ 3 5)입니다. 그런 다음 함수 list의 외부 인스턴스가이 결과에 적용되어 그 주위에 다른 목록을 래핑합니다. #' 리스프 가서 +와 관련된 기능을 얻을 알려줍니다,이 경우

(list (funcall #'+ 3 5)) 

대신 세 번째 예

는, 어쩌면 당신이 원했다. Common Lisp는 일반적으로 심볼의 일반 값을 저장하는 것과는 다른 방식으로 함수를 저장합니다. 심볼의 일반 평가가 일반 심볼 값을 얻는 반면에, #'your-symbol을 평가하면 연관된 함수가 있으면이를 가져옵니다.

그럼 funcall(8)을 생산 #'+ 그 연산 값 list에 전달이어서 3 및 5로 입수 된 함수를 적용한다.

(이 어떤 말을 더 정확한 방법이 있습니다,하지만 난 초보자를 통해 아이디어를 얻기 위해 노력하고있어.)

0

LIST이의 주장에서 목록을 생성하는 기능입니다. s-expression이 평가 될 때 Lisp은 첫 번째 요소를 검사하고 함수 인 경우 (LIST가 함수 인 경우) 먼저 목록의 모든 요소를 ​​반복하고 평가 한 다음 함수에 값을 인수로 전달합니다.

두 번째 줄에는 내부 양식 (즉 (+ 3 5))이 8로 평가되고 외부 (목록) 호출이 1 요소를 포함하는 목록을 생성합니다.

세 번째 줄에는 값으로 3 요소 목록 (+ 3 5)으로 eva 된 목록에 대한 내부 호출이 있습니다. lisp이 더 많이 평가할 양식이 아니며, 기호 +가 머리 인 목록을 작성했습니다. 외부 목록 호출을 평가하면 또 다른 1 요소 목록 (3 요소 목록을 머리로 포함)이 제공됩니다.

희망이 있습니다.