gpt4 book ai didi

lisp - DrRacket 中的简单嵌套评估

转载 作者:太空宇宙 更新时间:2023-11-03 18:51:09 26 4
gpt4 key购买 nike

所以我正在为我的编程语言课做一些练习题,其中一项作业是创建一个脚本“MyEval”,它允许您进行简单的嵌套加法和乘法。因此,例如程序将能够执行此 (MyEval '(1 +(3 *4))) 或更深入的操作,但无需执行减法或超过 2 个数字和运算符。所以没那么复杂。然而,我的头脑很困惑,我希望得到一些指导。这是我目前所拥有的

#lang racket
(define ns (make-base-namespace))
(define (MyEval lis)
(cond
[(and ; neither is a list and can be evaluated
(not(list? (car lis)))
(not(list? (caddr lis)))
)
(eval (cons (cadr lis) (list (car lis) (caddr lis)) ) ns)]

[(list? (car lis))
(MyEval (car lis))]

[(list? (caddr lis))
(MyEval (caddr lis))]

) ;end of cond
) ;end of define

但正如你们可能注意到的那样,这只会解决最后一个内括号,所以如果我执行 (MyEval '(1 + (1 + 2))) 我会得到 3,而不是 4。感谢任何指导或提示,我不知道我的标题是否准确,但如果不合适请告诉我。

谢谢!

最佳答案

通常一个好的计划是先写一些单元测试。函数应为某些输出返回什么的示例。也试着考虑边界或极端情况。例如:

(require rackunit)
(check-equal? (my-eval '(1 + (3 * 4)))
13)
(check-equal? (my-eval '(20 + 20))
40)
(check-equal? (my-eval 1)
1)

当然,这些最初都会失败。但您的目标是让它们通过。

接下来,您不需要使用 eval,也不应该使用。您几乎不想在现实生活中使用 eval。 (另外,你练习的重点不就是实现(某些)eval 实现的内容吗?)

最后,除非你有一个禁止它的类分配,否则我建议使用 match 而不是 carcadr 等。使用 匹配,就是:

(define (my-eval x)
(match x
[(list lhs '* rhs) (* (my-eval lhs) (my-eval rhs))]
[(list lhs '+ rhs) (+ (my-eval lhs) (my-eval rhs))]
[(list) (list)]
[_ x]))

您还可以对 match 模式使用准引号,我通常觉得这样更简洁。等价的,那样:

(define (my-eval x)
(match x
[`(,lhs * ,rhs) (* (my-eval lhs) (my-eval rhs))]
[`(,lhs + ,rhs) (+ (my-eval lhs) (my-eval rhs))]
[`() `()]
[_ x]))

虽然有些人不喜欢涉及的 `,,但我更喜欢那些 list

关于lisp - DrRacket 中的简单嵌套评估,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16689618/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com