2014-03-30 27 views
1

我正在制定方案評估程序。我需要實現let,我已經解析過,所以我有變量名稱,要輸入的值和函數的主體。我需要使用解析信息返回lambda函數,因此我有以下代碼:使用列表作爲lambda scheme/racket的參數名稱

(define (eval-let exp env) 
    ((lambda (let-variables (let-bindings exp)) (let-body exp)) (let-exp (let-bindings exp)))) 

(讓變量(讓 - 綁定EXP))的計算結果爲變量名稱(如列表:「( XY)),所以我基本上評估這樣的:

((lambda '(x y) (* x y)) '(2 3)) 

的方案解釋說簡單:#%純拉姆達:不是一個標識符:(讓 - 綁定EXP),我猜是因爲它想要一組標識符,而不是一組值。

如何將我的值列表轉換爲一組標識符?

回答

1

爲了實現自己的解釋器let表達首先你得把它改造成一個lambda應用,類似這樣的東西(程序名稱應該是不言自明):

(define (let->combination exp) 
    (let* ((bindings (let-bindings exp)) 
     (body  (let-body exp)) 
     (exps  (bindings-all-exps bindings)) 
     (lambda (make-lambda (bindings-all-vars bindings) body))) 
    (make-application lambda exps))) 

(define (make-lambda parameters body) 
    (list* 'lambda parameters body)) 

(define (make-application proc . args) 
    (cond ((null? args) (list proc)) 
     ((list? (car args)) (cons proc (car args))) 
     (else (cons proc args)))) 

而且後語法轉換已經執行,你可以繼續評估它:

(eval (let->combination exp) env) 

我想指出的是,你不應該嘗試直接評估它。另外要小心,你生成代碼有幾個不正確的報價:

((lambda '(x y) (* x y)) '(2 3)) 
     ^   ^
     here   here 

它應該是這樣,而不是:

((lambda (x y) (* x y)) 2 3) 
+1

的「嘗試直接評價」的軌道上得到了什麼。我忘了我已經有了一個申請程序,基本上把這些東西當成了名單。謝謝! –

+0

太棒了!這是我的榮幸 :) –