2011-02-05 3 views
12

그것은 동일 모두Lisp에서 '와 #'의 차이점은 무엇입니까?

(mapcar 'car '((foo bar) (foo1 bar1))) 

(mapcar #'car '((foo bar) (foo1 bar1))) 

작업을 보인다.

또한 ' 의미 (따옴표 기호) 및 #' 의미 (기능 함수 이름)을 의미합니다.

하지만 근본적인 차이점은 무엇입니까? 왜이 둘 모두가 이전의 mapcar에서 작동합니까?

답변

13
'foo 

는 심볼 FOO로 평가합니다.

#'foo 

은 FOO라는 이름에 바인딩 된 함수로 평가됩니다.

심볼은 FOO에 함수 바인딩이있을 때 함수로 호출 할 수 있습니다. 여기에서 CAR은 함수 바인딩이있는 심볼입니다.

그러나이 작동하지 않습니다

상징 로컬 어휘 기능에 액세스하지 않고 foo 다른 곳에서 정의 된 함수가 아닌 경우 리스프 시스템이 불평 때문에 FOO로의
(flet ((foo (a) (+ a 42))) 
    (mapcar 'foo '(1 2 3 4 5))) 

.

우리는 쓸 필요가 : 여기

(flet ((foo (a) (+ a 42))) 
    (mapcar #'foo '(1 2 3 4 5))) 

제 (함수 foo를) 또는 속기 표기법 # '푸 어휘 로컬 함수 FOO을 의미합니다. 이 기호의 기능을 조회해야하므로 # 'foo는 함수를 표시하면서

참고 또한

(funcall #'foo ...) 

대에

(funcall 'foo ...) 

후자, 또 하나의 간접 할 수 직접.

요약 : 심볼은 심볼이 작동을 통해 함수를 호출, 바인딩하는 기능을 가지고

합니다.

9

왜이 둘은 이전의 mapcar에서 작동합니까? mapcar에 대한

문서 는 말한다 :

함수는 심볼 인 경우는,이 ​​symbol-function 경우와 같은 기능을 강제 변환됩니다.

1

당신의 mapcar에 익명 함수 (람다)를 통과 시도하고 당신은 그 자체로 견적 함수에 바인딩 된 기호를 기대하고 있기 때문에 #'이 필요하다는 것을 볼 수 있지만, 심볼은 명사에 붙여서의 뜻을 나타냄에 존재하지 않습니다 라는 기능 :

CL-USER> (mapcar '(lambda (x) (format t "it is ~d" x)) (list 3 5 7)) 
; Evaluation aborted on #<TYPE-ERROR expected-type: (OR FUNCTION SYMBOL) 
      datum: (LAMBDA (X) (FORMAT T "it is ~d" X))>. 

대 :

CL-USER> (mapcar #'(lambda (x) (format t "it is ~d" x)) (list 3 5 7)) 
it is 3it is 5it is 7 
(NIL NIL NIL)