对于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/