为什么这个 $vau 演算片段会导致无限循环?

问题描述 投票:0回答:1

不知道这个网站上是否有人碰巧知道 $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.pdfhttps://ftp.cs.wpi.edu/pub/techreports/ pdf/05-07.pdf

我正在使用 Vau 的 JavaScript 实现:https://github.com/tonyg/js-vau/blob/master/vau2.js

lambda-calculus
1个回答
0
投票

我很抱歉没有发现代码或实现中的问题,但以下修改后的代码似乎按上面示例中的预期工作(输出 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

© www.soinside.com 2019 - 2024. All rights reserved.