【问题标题】:For Some Reason V is Unbound出于某种原因,V 不受约束
【发布时间】:2018-12-21 20:59:51
【问题描述】:

我正在浏览教程列表 (http://www.shido.info/lisp/scheme4_e.html)。我必须练习 2.4,这是我试图回答的问题。我已经看到了答案,所以我知道这是错误的答案。但我想让我的解决方案“工作”。我不得不使用后面练习中使用的语法来简化问题或我的答案。出于某种原因,当我尝试使用一些合理的参数执行主函数(ballthrow)时,解释器只是回来并说 v 是未绑定的并要求它的值。我正在使用 mit schemer。

(define pi (* 4 (atan 1.0)))
(define g 9.8)

; calculate the distance that a ball goes when thrown with an initial velocity

(define (d2r d)
    (* (/ d pi 180)))

(define (fftime v)
    (* (/ v 2 g)))

(define (dur v t)
    (* v t))

(define (hozvec v1 r)
    (* v1 (cos r)))

(define (vervec v1 r)
    (* v1 (sin r)))

(define (ballthrown v1 d1)
  (let ((h (hozvec v1 (d2r d1))) (v (vervec v1 (d2r d1)))
    (let ((t (fftime v)))))
       (dur h t)))

【问题讨论】:

    标签: scheme


    【解决方案1】:

    这里是 ballthrown 根据括号正确缩进。

    (define (ballthrown v1 d1)
      (let ((h (hozvec v1 (d2r d1)))
            (v (vervec v1 (d2r d1)))
            (let ((t (fftime v)))))
        (dur h t))) ; v and let is never used
    

    现在我刚刚在 DrRacket 中输入了这个并按下了 CTRL+i 并且它移动了 let 正下方 v 告诉我 let 是其中之一您在外部let 中进行的绑定。您是否看到 v 在按原样评估 v 时不存在?

    您可能在外部let 中缺少右括号,而在内部let 中的括号过多。这两个相互抵消。正确的版本是:

    (define (ballthrown v1 d1)
      (let ((h (hozvec v1 (d2r d1)))
            (v (vervec v1 (d2r d1))))
        (let ((t (fftime v)))     
          (dur h t))))
    

    我强烈建议您使用与括号匹配或更好的编辑器,该编辑器可以相应地缩进代码,以便您在出错时可以轻松查看。

    【讨论】:

    • 我在 DrRacket 中尝试过,但没有成功。它一直说缺少表达式主体。
    • 例如 (let ()) 没有正文,而 (let () 1) 有。
    • 成功了。当我尝试它时,我没有将括号放在正确的位置。谢谢老兄。
    猜你喜欢
    • 1970-01-01
    • 2015-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-15
    相关资源
    最近更新 更多