Racket - 制作关闭和应用关闭

标签 racket interpreter value-of

所以我对 Racket 相当缺乏经验,但正在编写一个解释器。

我一直无法深入了解闭包到底是什么,或者如何定义/解释“apply-closure”或“make-closure”。

我正在编写一个带有匹配等的值解释器。

任何帮助将不胜感激。

类里面给出的例子 -

(define value-of
 (lambda (exp env)
  (match exp
  [`,b #:when (boolean? b) b]
  [`,n #:when (number? n)  n]
  [`(zero? ,n) (zero? (value-of n env))]
  [`(sub1 ,n) (sub1 (value-of n env))]
  [`(* ,n1 ,n2) (* (value-of n1 env) (value-of n2 env))]
  [`(if ,test ,conseq ,alt) (if (value-of test env)
                              (value-of conseq env)
                              (value-of alt env))]
  [`(begin2 ,e1 ,e2) (begin (value-of e1 env) (value-of e2 env))]
  [`(random ,n) (random (value-of n env))]
  [`,y #:when (symbol? y) (apply-env env y)]
  [`(lambda (,x) ,body) (make-closure x body env)]
  [`(,rator ,rand) (apply-closure (value-of rator env)
                                  (value-of rand env))])))

最佳答案

考虑这个例子:

(define x 42)
(define f (lambda (y) (+ y x))
(f 1)

问题是:计算 (f 1) 时需要提供哪些信息? 以某种方式需要存储 if x 的值以供以后使用。 一种解决方案是在闭包中存储整个环境的副本。

(struct closure (args env expression))
(define f (make-closure '(y) the-environment '(+ y x))

更好的解决方案是分析表达式并仅在闭包中存储自由变量。有关详细信息,请参阅 SICP 或 EoPL。

关于 Racket - 制作关闭和应用关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39774932/

相关文章:

javascript - 递归使用 eval() 是检查程序执行的好方法吗?

java - Enum.valueOf(String) 方法从何而来?

struct - 如何在 typed/racket 中使用默认值初始化结构体?

scheme - SimplyScheme程序中的错误

方案获取列表中的最后一个元素

scala - 在 Spark 脚本中放入 Scala 解释器?

recursion - 新方案/ Racket : Heavy use of recursion a way of life or am I just going through a typical phase

c# - 解释 Jint 的工作原理

java - 为什么 valueOf(null) 调用构造函数 valueOf(char[])

java - parseInt 导致 android 应用程序崩溃