2011-04-23 3 views
1

비슷한 질문이 이전에 제기 된 것을 보았지만 여기서 또 다른 문제를 이해하지 못합니다.스킴 - let 기능을 사용하는 함수

(define x 2) 
(define a 2) 

(define goo 
    (lambda (x) 
    (display x) 
    (lambda (y) (/ x y)))) 

(define foo 
    (let ((f (goo a))) 
    (lambda (x) 
     (if (= x 0) 
      x 
      (f x))))) 

(foo (foo 0))의 반환 값은 무엇인가 :

여기에 두 가지 기능입니까? 무엇이 화면에 출력됩니까? 내가 알고있는 것처럼

, 내가 처음에 (foo 0)을 실행할 때, 2은 (우리가 기능 goo를 입력합니다) 인쇄되며, 반환 값이 0 될 것입니다. 그런 다음 (foo (foo 0)) =>(foo 0)을 사용하여 foo 함수를 다시 입력합니다. 우리는 다시 goo 함수를 입력하고 2이 출력됩니다. 하지만 실행할 때 2이 한 번만 인쇄됩니다. let에 대한 중요한 문제가 누락되어 있고 lambda에 대한 연결이 누락 된 것 같습니다.

답변

2

foo 정의 내부 letfoofoo가 평가 될 때가 아니라, 정의 경우 따라서 a-goo의 출원은 평가된다.

이렇게 보겠습니다. foo의 가치는 무엇입니까? 그것은 lambda 표현입니다. f의 바인딩은 foo에 의해 닫히고, foo이 평가 될 때마다 "다시 실행"되지 않습니다.

편집 : 당신은 당신이 다시 sqrt를 호출하지 않는 bar을 평가하는 경우 여기 lambda

> (let ((x (sqrt 2))) (* x 3)) 
4.24264068711929 
> (define bar (let ((x (sqrt 2))) (* x 3))) 
> bar 
4.24264068711929 
>   

없이 예입니다. barlet의 본문으로 정의되며이 경우 표현식의 결과 인 숫자입니다.

예에서 let의 본문은 lambda 표현입니다. 하지만 제 예제처럼 let 바인딩은 다시 실행되지 않습니다.

+0

탱크 u. 그러나 "let"의 본문은 다음과 같습니다. (lambda (x) x (fx)) 의미 - "foo"를 평가할 때마다 let을 입력해야합니다. 그 때문에, 나는 또한 함수 "goo"(re-defind)를 입력했다. 누락 된 부분이 무엇입니까? – Tom

+0

x가 0이 아닌 경우 f를 다시 계산합니다. f는 foo가 정의 될 때 (goo a)를 평가 한 결과입니다. f가 이미 바인드 된 경우, foo를 실행할 때마다 리 바인드되지 않습니다. –

+0

위의 편집을 참조 할 수있는 예제를 참조하십시오. –

관련 문제