如何评估作为符号返回的过程

时间:2011-09-14 17:20:09

标签: scheme

我们正在处理类中的数据表示,我们必须将整数表示为diff树。我的归零? class我想实际评估diff-tree以查看它是否为0.但是我的所有过程都返回符号。我不知道如何让Scheme评估程序。

diff-tree :: =(one)| (diff diff-tree diff-tree)

(前身'(一))=(差异(一)(一))

所以,如果我有(is-zero? (predecessor '(one))) |注意:它必须将其作为符号

它会评估为(is-zero?'(diff(one)(one))) 我怎么得到它,以便我可以实际评估差异作为一个函数? 我已经(定义diff - )(定义(一)1)所以如果我只运行(diff(one)(one))

所有其他功能(例如前任)必须返回符号。

我不是很善于解释,但我希望我已经做了足够好的工作让人们理解。

注意:我创建了另一个函数,以递归方式运行diff树并对其进行求值。它不像我希望的那样好,但它会起作用。

(define evaluate
  (lambda (dt)
    (if (eqv? (car dt) 'diff)
        (- (evaluate (cadr dt))(evaluate (caddr dt)))
        1
        )))
(define is-zero?
  (lambda (dt)
    (if (= 0 (evaluate dt))
        #t
        #f
     )))

2 个答案:

答案 0 :(得分:0)

这是一个草图,无法访问Scheme编译器:)。

(define (list-eval l)
  (apply (car l) (map list-eval (cdr l))))

(define (is-zero? l)
  (= 0 (list-eval l)))

答案 1 :(得分:0)

我确信这个任务的想法是为你开发一个diff-trees的解释器或者(给出规范的“有趣的”)来开发在树上执行代数操作的函数,以保存“意“。

假设只编写一个返回整数的解释器是可以的 - 这显然是你想到的 - 你需要开发一个直截了当的(来自适当的HtDP章节)“函数一段自引用复合数据“(即你的差异树)。首先选择“解释”功能的名称和合同。那么,一些测试用例呢?