【问题标题】:How do I evaulate a procedure that's returned as a symbol如何评估作为符号返回的过程
【发布时间】:2011-11-17 05:36:28
【问题描述】:

我们在课堂上处理数据表示,我们必须将整数表示为差异树。对于我的零?我想实际评估差异树以查看它是否为 0。但是我的所有程序都返回符号。我不知道如何让 Scheme 评估程序。

差异树 ::= (一) | (diff diff-tree diff-tree)

(前身'(一)) = (diff(一)(一))

所以如果我有(is-zero? (predecessor '(one))) |注意:它必须把它当作一个符号

它将评估为 (is-zero? '(diff (one)(one))) 我如何得到它以便我可以实际评估差异作为一个函数? 我已经有 (define diff -) (define (one) 1) 所以如果我只是运行 (diff (one)(one))

所有其他函数,例如前置函数,都必须返回一个符号。

我不太擅长解释,但我希望我做得足够好让人们理解。

注意:我创建了另一个函数,它递归地遍历差异树并对其进行评估。它没有我想要的那么好,但它会起作用。

(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
     )))

【问题讨论】:

    标签: scheme


    【解决方案1】:

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

    (define (list-eval l)
      (apply (car l) (map list-eval (cdr l))))
    
    (define (is-zero? l)
      (= 0 (list-eval l)))
    

    【讨论】:

    • 谢谢。我忘记了申请和映射程序。
    • 您不能应用符号,只能应用程序。如果正如 OP 所说,它是一个符号,那么您需要 eval 它来获取程序,然后才能应用它
    • 哎呀,呸。不要使用评估。你的教授不会喜欢它(我不会)。
    【解决方案2】:

    在我看来,这项任务的想法是让您为差异树开发一个解释器,或者(鉴于规范的“有趣”性)开发对保留“树”的树执行代数操作的函数意义。”

    假设只需编写一个返回整数的解释器就可以了——这显然是你的想法——你需要在一块自引用复合数据”(即您的差异树)。它首先为您的“解释”功能选择名称和合同。那么,一些测试用例呢?

    【讨论】:

    • 任务是将所有整数的表示定义为差异树。然后我不得不将该表示转换为实现零、零、前任和后继函数的实现。起初我定义的是零?通过检查两个孩子是否彼此相等,但使用 diff-tree 实现,有无数种方法来表示每个数字(1 可以表示为 (diff 1 0), (diff 2 1), ( diff 3 2) 等等。所以我知道的唯一检查是否为零的方法是实际评估 diff-tree。
    • 好的,听起来不错。所以你想开发一个解释器,将差异树映射到数字。根据我之前的建议:选择一个名字,写下合同(提示:它出现在前一句中)。然后,编写一些测试用例。
    猜你喜欢
    • 1970-01-01
    • 2013-05-28
    • 1970-01-01
    • 1970-01-01
    • 2014-10-13
    • 1970-01-01
    • 1970-01-01
    • 2012-03-10
    • 1970-01-01
    相关资源
    最近更新 更多