scheme - 条件 “and”的方案表示法

标签 scheme syntax-error racket

对于SICP类(class),我们正在学习Scheme,并且有一个作业要求我们检查点是否在轴线对齐的矩形中。我这样做是这样的:

(define in-rect?
  (lambda (px py rx1 ry1 rx2 ry2) 
    (<= (* (- px rx1) (- px rx2)) 0) and
    (<= (* (- py ry1) (- py ry2)) 0))) 

我根据以前的C习惯进行了此操作,但在那里忘记了波兰记号。我们的在线辅导老师程序使用的解释器按照我的意图“正确”运行了此代码。但是,对于AFAIK,“和”的这种用法在语法上应该是错误的。当我尝试运行时,DrRacket指出语法错误。

然后,如何评估在线辅导员上每个测试用例的正确值?此选项是否也有效?

最佳答案

and的语法与大多数表达式相同–它使用前缀表示法;它也可以有零个或多个参数,这些参数不一定是 bool(boolean) 表达式:

(and <exp1> <exp2> <exp3> ...)

对于您的代码,它应该如下所示:
(define in-rect?
  (lambda (px py rx1 ry1 rx2 ry2) 
    (and (<= (* (- px rx1) (- px rx2)) 0)
         (<= (* (- py ry1) (- py ry2)) 0))))

至于您的代码为何似乎可以在在线辅导老师中工作的原因,是因为解释器可能会使用三个表达式(第一个lambda表达式,特殊格式的begin,第二个<=表达式)在隐式and中评估<=的主体,因此只返回了最后一个条件。尽管很奇怪,但是它根本没有用,因为没有参数的and通常会出现“语法错误”或类似的错误-这完全取决于它的实现方式,但似乎不符合标准的解释器。

为了确保一切都清楚,请看一下documentation,因为and的行为与您期望的略有不同(来自C背景)。请记住,在第一个错误条件下and会短路:
(and (+ 1 1) #f (/ 1 0)) ; will work without a division by zero error
             ^
   evaluation stops here
=> #f

并注意and返回它遇到的最后一个表达式的值,因为在Scheme中,任何未明确指定#f的东西都被视为true:
(and #t (* 2 3) (+ 1 1))
                   ^
         evaluation stops here
=> 2

关于scheme - 条件 “and”的方案表示法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19210353/

相关文章:

recursion - 方案反转列表

swift - 方案 : possible in Swift? 中可爱的 lambda 技巧

arrays - 在mips中初始化数组时显示错误

php - PHP脚本打印不执行

scheme - Racket - 当有契约(Contract)时无法通过地点 channel 发送预制结构

list - 删除列表中的重复元素

scheme - 在方案中实现 powerset

ruby - 第1行: syntax error, unexpected tIDENTIFIER, expecting end-of-input的Gemfile语法错误

list - Racket 列表与 r6rs 不兼容?

functional-programming - (Chez) 计划基准?