【问题标题】:Scheme not returning 0 false方案不返回 0 false
【发布时间】:2021-12-29 15:08:33
【问题描述】:
(define repl (lambda (env)
    (let* (
        (dummy1 (display "cs305> "))
        (expr (read))
        (new-env (if (define-stmt? expr)
            (extend-env (cadr expr) (s6-interpret (caddr expr) env) env) env)
        )
        (val 
          (cond
             ((define-stmt? expr) (cadr expr))
             ((and (if-stmt? expr) (= (cadr expr) 0) ) (cadddr expr))
             ((and (if-stmt? expr) (not(= (cadr expr) 0)) ) (caddr expr))
             (else (s6-interpret expr env))
          )
        )
        (dummy2 (display "cs305: "))
        (dummy3 (display val))
        (dummy4 (newline))
        (dummy4 (newline)))
    (repl new-env))))

应该是这样的

cs305> (if (- 5 x) (+ x 1) (* x 2))
cs305: 10

但我得到6,但它应该是0,因为x 被定义为5。这里的函数有什么问题?

【问题讨论】:

  • 所有这些dummyX 变量有什么意义?如果您想在不使用结果的情况下执行表达式,只需将它们放在let 的正文中即可。
  • 我是新手,这是一个家庭作业,这就是我们有假人的原因。所以if-stmt 行是正确的,对吧?我如何在这里使用 let?你能证明我真的很想学习@Barmar
  • 为什么需要if-stmt?的特殊条件s6-interpret不知道如何解释if表达式?

标签: scheme


【解决方案1】:

在处理if 语句时,您需要解释条件和选定的结果。我不确定您为什么没有收到来自(= (cadr expr) 0) ) 的错误,因为(cadr expr) 是一个列表,而不是一个数字。

(define repl (lambda (env)
  (display "cs305> ")
  (let* (
         (expr (read))
         (new-env (if (define-stmt? expr)
                      (extend-env (cadr expr) (s6-interpret (caddr expr) env) env)
                      env)
                  )
         (val 
          (cond
           ((define-stmt? expr) (cadr expr))
           ((if-stmt? expr)
            (if (= (s6-interpret (cadr expr) env) 0)
                (s6-interpret (cadddr expr) env)
                (s6-interpret (caddr expr) env)))
           (else (s6-interpret expr env))
           )
          ))
    (display "cs305: ")
    (display val)
    (newline)
    (newline))
  (repl new-env)))

【讨论】:

    猜你喜欢
    • 2015-06-21
    • 1970-01-01
    • 2016-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-05
    • 2013-10-30
    相关资源
    最近更新 更多