0x07.闭包与可变量 - 实现一个解释器 in Racket


前言

继续解释器实现系列,本文将添加对闭包和可变量的支持。

目标

  • 实现闭包(Closure)
  • 支持可变量赋值
  • 处理变量作用域

核心实现

1. 闭包数据结构

(define-type Closure
  [closure (params : (listof symbol)) 
           (body : ExprC) 
           (env : Env)])

2. 变量赋值

(define-type ExprC
  [numC (n : number)]
  [idC (s : symbol)]
  [appC (fun : ExprC) (args : (listof ExprC))]
  [plusC (l : ExprC) (r : ExprC)]
  [multC (l : ExprC) (r : ExprC)]
  [lamC (params : (listof symbol)) (body : ExprC)]
  [setC (var : symbol) (val : ExprC)] ; 新增赋值表达式
  [seqC (es : (listof ExprC))])      ; 新增序列表达式

3. 环境扩展

(define-type Binding
  [bind (name : symbol) (val : (boxof number))]) ; 使用box包装值

测试用例

;; 测试闭包
(test (interp (appC (lamC '(x) (plusC (idC 'x) (numC 1))) (list (numC 5)))
              (list (bind 'y (box 10))))
      => 6)

;; 测试变量赋值
(test (interp (seqC (list (setC 'x (numC 5)) (idC 'x)))
              (list (bind 'x (box 0))))
      => 5)

总结

通过引入闭包和可变量,我们的解释器现在支持更复杂的编程模式,包括函数式编程和命令式编程特性。