这是我的代码。
(define CartDist
(lambda X1 Y1 X2 Y2
(sqrt (+ (sqr (- X2 X1)) (sqr (- Y2 Y1))))))
(CartDist 0 0 3 4)
以下是我在运行时在交互窗格中收到的错误:
lambda: expected (lambda (variable more-variable ...) expression), but found something else
我不知道为什么我会收到这个错误(我是学生并且是计划新手)
提前致谢!
答案 0 :(得分:1)
(define (sqr x) (* x x))
(define (cart-distance x1 x2 y1 y2)
(sqrt (+ (sqr (- x2 x1)) (sqr (- y2 y1)))))
(define cartDistance (lambda (x1 x2 y1 y2)
(sqrt (+ (sqr (- x2 x1)) (sqr (- y2 y1))))))
这对我有用。你搞砸了语法。
答案 1 :(得分:0)
为了说明错误,这里是一个正确的缩进版本:
(define CartDist
(lambda X1
Y1
X2
Y2
(sqrt (+ (sqr (- X2 X1)) (sqr (- Y2 Y1))))))
如果你称之为(CartDist 0 0 3 4)
,则绑定x1
的参数变为(0 0 3 4)
,因为它是一个符号(一个休息参数)。
y1
是要评估的函数中的第一个表达式,它将失败,因为它既未在词法范围内定义,也未在全局范围内定义。与尾部表达式(sqrt ...)
之前评估的其他变量相同。要解决此问题,您需要将参数放在列表中,以便在调用它们时成为boudn变量:
(define cart-dist
(lambda (x1 y1 x2 y2)
(sqrt (+ (sqr (- x2 x1))
(sqr (- y2 y1))))))
我冒昧地改变案例和名称以遵循lisp风格。您也可以像这样组合define
和lambda
:
(define (cart-dist x1 y1 x2 y2)
(sqrt (+ (sqr (- x2 x1))
(sqr (- y2 y1)))))
请注意,这与上面的完全相同。初学者书通常不会使用它,因为它很容易混淆,因为定义一个函数是为函数对象命名,并且绑定与任何其他值绑定在同一环境中。
答案 2 :(得分:0)
除了其他正确答案之外,我还想尝试帮助您阅读原始错误消息。它的含义是它希望lambda的形式为
(lambda (variable more-variable ...) expression)
将此与您的lambda进行比较:
(lambda X1 Y1 X2 Y2 (sqrt (+ (sqr (- X2 X1)) (sqr (- Y2 Y1))))))
你有什么不同吗?希望您注意到预期的表单在lambda
关键字后面有括号,并且您的程序缺少它们。
希望这有帮助!
答案 3 :(得分:0)