所以我正在試驗,並且在方案中創建了一種編程語言。我也爲它構建了一個解釋器,這是下面的大部分代碼。記憶,口譯員和閉包
我想重寫解釋器,以便在較小的環境下構建閉包,即。在構建閉包時,它使用的環境與當前環境相似,但僅在閉包的函數部分保留變量,該變量是自由變量。我正在學習記憶,但這是令人困惑的。
編輯:我現在正在使用相當於此的球拍,所以如果在那裏更容易,你應該給我建議。
(define-struct var (string)) ;; a variable, e.g., (make-var "foo")
(define-struct int (num)) ;; a constant number, e.g., (make-int 17)
(define-struct add (e1 e2)) ;; add two expressions
(define-struct fun (name formal body)) ;; a recursive 1-argument function
(define-struct closure (fun env)) ;; closures (made at run-time)
(define (envlookup env str)
(cond [(null? env) (error "unbound variable during evaluation" str)]
[(equal? (caar env) str) (cdar env)]
[#t (envlookup (cdr env) str)]))
(define (eval-prog p)
(letrec
([f (lambda (env p)
(cond [(var? p) (envlookup env (var-string p))]
[(int? p) p]
[(add? p) (let ([v1 (f env (add-e1 p))]
[v2 (f env (add-e2 p))])
(if (and (int? v1) (int? v2))
(make-int (+ (int-num v1) (int-num v2)))
(error "TTPL addition applied to non-number")))]
[(fun? p) (make-closure p env)]
[(closure? p) p]
[#t (error "bad TTPL expression")]))])
(f() p)))