我正在尝试在DrRacket(Scheme)中为距离公式创建一个函数,但每次运行它时都会出错

时间:2017-02-11 17:11:35

标签: lambda scheme racket

这是我的代码。

(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

我不知道为什么我会收到这个错误(我是学生并且是计划新手)

提前致谢!

4 个答案:

答案 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风格。您也可以像这样组合definelambda

(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)

我可能会建议使用一些数据抽象来保持程序的实用性

TestAuthorizer

或者,如果允许,您可以使用struct来完成同样的事情

LiveAuthorizer