2014-11-03 3 views
0

는이 전 기능 "을 만들-람다"를 다음과 같이 정의되어 있다고 가정 해 봅시다 :런타임 혀짤배기에서 람다 함수를 만듭니다

(create-lambda 2 3) 

그것은 것 :이 같은이 기능을 호출하는 경우

(defun create-lambda(x y) 
    (lambda(z) (let ((foo (some-other-function z y))) (if (= x foo) T)))) 

반환 :

는 내가 원하는 것은
#<FUNCTION :LAMBDA (Z) (LET ((FOO (SOME-OTHER-FUNCTION Z Y))) (IF (= X FOO) T))> 

이 돌아 :

#<FUNCTION :LAMBDA (Z) (LET ((FOO (SOME-OTHER-FUNCTION Z 3))) (IF (= 2 FOO) T))> 

이것이 가능합니까?

+0

'# '와 같은 람다 함수의 출력 형식은 표준화. 이 경우,'x'와'y'의 값은 변경할 수 없기 때문에 (특별한 것으로 전역 적으로 선언되지 않은 한), 관찰 가능한 차이가 없어야합니다. –

답변

1

xy은 어휘 범위에서 23으로 바인딩되므로 최종 결과는 중요하지 않습니다. 당신은 당신이 원하지 않는 말 :

(let ((x 2) (y 3)) 
    (let ((foo (some-other-function z y))) 
    (if (= x foo) T))) 

그러나 당신이 원하는 :

(let ((foo (some-other-function z 3))) 
    (if (= 2 foo) T)) 

하지만 그 차이를 말할 수 없다. 너는 할수 있니? 어쨌든 . 이 같은 기능으로 데이터 구조를 coerce 수 있습니다 :이 사이

(defmacro create-lambda (x y) 
    `(lambda(z) 
    (let ((foo (some-other-function z ,y))) 
      (when (= ,x foo) T)))) 

의 차이는 당신이 그것을 호출하는 경우 발견하기 쉽다 :

(defun create-lambda (x y) 
    (coerce `(lambda(z) 
      (let ((foo (some-other-function z ,y))) 
       (when (= ,x foo) T))) 
      'function)) 

또는 당신이 만들 수있는 매크로를-람다를 만들 부작용 (create-lambda (print 3) (print 4)). 첫 번째 부작용은 함수가 모든 인수를 평가하기 때문에 즉시 발생합니다. 매크로는 x 및 y에 대한 모든 것을 바꿀 것이고 부작용은 호출 시간에 발생합니다.

관련 문제