2014-04-16 2 views
1

Scheme에서 자신의 let 표현식을 정의하는 방법에 대해 궁금합니다. 그것은 (mylet id expr1 expr2)와 같이 보이기를 바란다. id는 expr1의 값에 바인딩되어 있고 expr2에서 사용된다. 나는 그것의 라인을 따라 뭔가있을 것이라고 생각 :Scheme R5RS : let let expression

(define (mylet x a body) 
    ((lambda (x) body) a)) 

하지만 작동하지 않습니다.

내가

(mylet x 4 (* x 4)) 

나는 다음과 같은 오류 해보 :

x: undefined; cannot reference undefined identifier. 

내가 잘못하고있는 중이 야 무엇을?

답변

2

let은 실제로 매크로입니다. 프로 시저로 정의 할 수 없습니다. 거의 원래의 코드처럼 보이는

(define-syntax-rule (mylet x a body) 
    ((lambda (x) body) a)) 

을하지만, define 대신 define-syntax-rule를 사용 : 당신은 라켓을 사용하고 있기 때문에, 이것을 시도. ;-) define-syntax-rule 다음 전체 매크로에 대한 바로 가기 실제로 그건 :

(define-syntax-rule (let ((id val) ...) body ...) 
    ((lambda (id ...) body ...) val ...)) 

참고 :

(define-syntax mylet 
    (syntax-rules() 
    ((_ x a body) 
    ((lambda (x) body) a)))) 

는 사실, 당신도 "표준"let 매크로 (마이너스라는 이름의 let)이 방법을 정의 할 수 있습니다 타원 (...)의 사용. 이것은 0 개 이상의 형식을 허용합니다. 이 경우 let에 여러 본문 양식이 포함될 수 있습니다.