그것은 동일 모두Lisp에서 '와 #'의 차이점은 무엇입니까?
(mapcar 'car '((foo bar) (foo1 bar1)))
및
(mapcar #'car '((foo bar) (foo1 bar1)))
작업을 보인다.
또한 '
의미 (따옴표 기호) 및 #'
의미 (기능 함수 이름)을 의미합니다.
하지만 근본적인 차이점은 무엇입니까? 왜이 둘 모두가 이전의 mapcar
에서 작동합니까?
그것은 동일 모두Lisp에서 '와 #'의 차이점은 무엇입니까?
(mapcar 'car '((foo bar) (foo1 bar1)))
및
(mapcar #'car '((foo bar) (foo1 bar1)))
작업을 보인다.
또한 '
의미 (따옴표 기호) 및 #'
의미 (기능 함수 이름)을 의미합니다.
하지만 근본적인 차이점은 무엇입니까? 왜이 둘 모두가 이전의 mapcar
에서 작동합니까?
'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 ...)
후자, 또 하나의 간접 할 수 직접.
요약 : 심볼은 심볼이 작동을 통해 함수를 호출, 바인딩하는 기능을 가지고
합니다.
왜이 둘은 이전의 mapcar에서 작동합니까? mapcar에 대한
문서 는 말한다 :
함수는 심볼 인 경우는,이 symbol-function 경우와 같은 기능을 강제 변환됩니다.
당신의 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)