문제

Lambda와 함께 #'를 사용해야하는 이유는 무엇입니까? 그것은 일반적으로 그런 식으로 쓰여져 있으므로 좋은 형태라고 생각합니다. 그러나이 줄은 나와 같다 :

> (mapcar #'(lambda (x) (+ x 1)) '(1 2 3))
(2 3 4)
> (mapcar (lambda (x) (+ x 1)) '(1 2 3))
(2 3 4)

차이에 대해 초보자를 밝히는 사람이 있습니까?

도움이 되었습니까?

해결책

#' 속기입니다 function, 함수에 대한 포인터를 반환합니다 (적용하는 대신). lambda 함수를 반환하면 해당 함수에 대한 포인터를 원합니다. 이것은 매우 일반적이므로, 당신을 위해 그것을하는 매크로 (가변 공간)도 있습니다. lambda 또한. 두 코드 라인은 동일합니다.

더 나은 것은 LISP-1/LISP-2 토론: 일반적인 LISP에서는 매크로 덕분에 할 수 있습니다. 항상 그렇듯이 일관성을 유지하십시오.

다른 팁

다양한 LISP 방언에서 다릅니다. 다음은 공통 LISP를 사용합니다.

첫 번째 #'(함수 ...)에 대한 짧은 표기법입니다.. 따라서 다음은 텍스트 만 다르지만 일반적인 LISP는 동일하게 읽습니다.

#'(lambda (x) (* x 2))

그리고

(function (lambda (x) (* x 2)))

#'는 readmacro이며 LISP 시스템에서 LISP 코드를 읽을 때 변환됩니다.

LISP가 평가되는 경우

(function (lambda (x) (* x 2)))

그만큼 LISP 시스템은 함수 객체를 생성하고 함수는 값으로 반환합니다..

따라서 값으로 함수가 필요할 때마다 그렇게 작성해야합니다. 값으로서의 함수는 필요합니다. 다른 함수를 인수로 전달하려고 할 때, 함수에서 반환하려고하거나 변수에 저장하려고 할 때. 예 :

(map #'(lambda (x) (* x 2)) '(1 2 3))

(defun (y) #'(lambda (x) (* x y)))

(defparameter *twice-fn* #'(lambda (x) (* x 2)))

이제 (Lambda (x) (* x 2))는 무엇입니까?

상황에 따라 두 가지 다른 것입니다.

람다 표현

Lambda 표현식은 함수 이름 대신 사용할 수 있습니다.

(function foo)   and    (function (lambda (x) (* x 2)))

그리고

(foo 17)    and  ((lambda (x) (* x 2)) 17)

두 가지는 합법적 인 공통 LISP 구문입니다. Lambda 표현이 직접 사용할 수 있습니다.

다음 두 가지 형태가 있습니다 불법적인 일반적인 lisp :

(#'(lambda (x) (* x 2)) 17)   ; illegal in Common Lisp

(function #'(lambda (x) (* x 2)))  ; illegal in Common Lisp

매크로

공통 LISP 표준화 프로세스 동안 매크로 람다가 추가되었습니다 (공통 LISP의 첫 번째 설명 인 CLTL1의 일부가 아닙니다). 약간 짧은 코드를 작성할 수 있습니다. 예시:

(lambda (x) (* x 2))

위의 경우 Lambda는 매크로입니다. 매크로 확장 중에는 다음으로 확장됩니다.

(function (lambda (x) (* x 2)))

위의 함수 형태에서 내부 람다는 람다 표현의 일부이며 함수를 나타내며 확장되지 않을 것임을 기억하십시오.

따라서 이제 위의 세 가지 예는 다음과 같이 쓸 수 있습니다.

(map (lambda (x) (* x 2)) '(1 2 3))

(defun (y) (lambda (x) (* x y)))

(defparameter *twice-fn* (lambda (x) (* x 2)))

약간 짧고 약간 덜 혼란스러워 보이며 체계 코드와 약간 더 유사하게 보입니다. 체계 코드를 읽고 쓰는 데 사용되는 프로그래머에게는 조금 더 좋아 보입니다.

요약

a) (함수 (lambda (x) (* x 2)))는 함수를 값으로 반환하는 코드를 작성하는 '진정한'방법입니다.

b) #'(Lambda (x) (* x 2))는 위의 짧은 표기법입니다.

c) (Lambda (x) (* x 2))는 훨씬 짧지 만 거시적 확장을 사용하여 a 형태를 만듭니다).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top