【问题标题】:Scheme: Not a procedure (Dr. Racket)方案:不是程序(Racket 博士)
【发布时间】:2017-04-09 20:24:35
【问题描述】:

我正在使用 R5RS 方案在 Racket 博士中运行此程序,并在 (+ 1 IntDivide((- x y) y)) 行上遇到此错误:

"应用程序:不是一个程序;期望一个程序可以是 应用于给定的参数:5 个参数...:"

该过程应该使用减法返回两个整数之间的除商。由于这是一个家庭作业问题,我不会问我的解决方案是否正确(我可以稍后调试),而是问是什么导致了这个错误。这似乎通常是由多余的括号引起的,但我似乎找不到它们。任何帮助将不胜感激。

(define IntDivide (lambda (x y)
  (if (eqv? (integer? x) (integer? y))
    (begin
      (if (= y 0)
        (begin
          (write "Can't divide by zero") (newline)
          -1
        )
      )

      (if (= (- x y) 0)
        1
      )

      (if (< x y)
        0
      )

      (if (> x y)
        (+ 1 IntDivide((- x y) y))
      )
    )
  )
  (write "Please only input integers")
))

提前致谢!

【问题讨论】:

  • IntDivide 不应该在右边的() 里面吗?
  • 没错!我想在盯着太久之后你会得到隧道视觉。
  • 我写 Clojure 的时间已经够久了,一看到((,我就立刻产生了怀疑。有效代码可以连续包含 2 个左括号,但在 90% 的情况下,这是一个错误。请注意这一点。

标签: scheme r5rs


【解决方案1】:

除了将运算符移动到括号内之外,您还需要将if 替换为cond

(define IntDivide
  (lambda (x y)
    (if (eqv? (integer? x) (integer? y))
      (cond ((= y 0) (write "Can't divide by zero")
                     (newline)
                     -1)
            ((= x y) 1)
            ((< x y) 0)
            ((> x y) (+ 1 (IntDivide (- x y) y))))
      (write "Please only input integers"))))

您现在拥有的方式以及内部 if 表达式将无法正常工作,因为它们不会自动返回。他们只是评估然后结果被丢弃。

【讨论】:

  • 感谢您的回复。我昨天解决了这个问题。 ifs 是旧尝试的残余,但很高兴了解 ifs 的工作原理。
  • 为什么要停在那里?如果你否定它,if 可能是cond 的第一个词。
【解决方案2】:

调用 IntDivide 的方式与调用任何其他函数的方式相同。

(+ 1 (IntDivide (- x y) y))

【讨论】:

  • 主要面部手掌时刻。感谢您的快速回复。
  • @KnightArtorias 我无法告诉你在 Scheme 和其他语言之间来回切换时我做了多少次。
  • @KnightArtorias 此外,您确实需要切换到 cond 结构,如 Brendan 的回答中所述。我只用这个修复程序运行了你的代码,它为大多数输入返回""Please only input integers"
  • @BilltheLizard 当我尝试用 python 帮助某人时,我总是以( 开头。很难挽回。
猜你喜欢
  • 2018-11-07
  • 1970-01-01
  • 2023-03-26
  • 2015-07-21
  • 1970-01-01
  • 2017-01-22
  • 2014-11-25
  • 2018-05-05
  • 1970-01-01
相关资源
最近更新 更多