不知道这个网站上是否有人碰巧知道 $vau 演算,但无论如何,由于某种原因,这个片段会导致无限循环,我不确定这是否是由于我使用的 $vau 实现,或者某些代码片段本身的错误。
($begin
(display "hello world")
($define! $lambda
($vau (ptree . body) static-env
(wrap (eval (list* $vau ptree #ignore body)
static-env))))
($define! $cond
($vau clauses env
($define! aux
($lambda ((test . body) . clauses)
($if (eval test env)
(apply (wrap $sequence) body env)
(apply (wrap $cond) clauses env))))
($if (null? clauses)
#inert
(apply aux clauses))))
($define! $if
($vau (x y z) env
($cond ((eval x env) (eval y env))
(#t (eval z env)))))
($if 0
(display "1")
(display "2")
)
(display "end")
)
可以找到 $vau 的完整描述 https://klisp.org/wp-content/uploads/2023/07/jshutt.pdf 和 https://ftp.cs.wpi.edu/pub/techreports/ pdf/05-07.pdf
我正在使用 Vau 的 JavaScript 实现:https://github.com/tonyg/js-vau/blob/master/vau2.js
我很抱歉没有发现代码或实现中的问题,但以下修改后的代码似乎按上面示例中的预期工作(输出 2?)。然而,括号实际上没有正确关闭,定义
)
的$cond
,如下评论)
($begin
($define! $lambda
($vau (ptree . body) static-env
(wrap (eval (list* $vau ptree #ignore body)
static-env))))
($define! $cond
($vau clauses env
($define! aux
($lambda ((test . body) . clauses) #ignore
($if (eval test env)
(eval (cons $sequence body) env)
(apply (wrap $cond) clauses)))
($if (null? clauses) #inert (apply aux clauses))))
($define! $if
($vau (x y z) env
($cond ((eval x env) (eval y env))
(#t (eval z env)))))) ;; The last one is actually the closing parentheses of "$define! $cond"
($if 0
(print "1")
(print "2")
)
)
那么,可能是解析错误导致的?
我使用
te
评估脚本时,报了未定义变量的错误,所以我将其替换为print
。