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

Lambda 我试图为DrRacket(Scheme)中的距离公式创建一个函数,但每次运行它时都会出错,lambda,scheme,racket,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 我不知道我为什么会犯这个错误(我是一名学

这是我的密码

(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
我不知道我为什么会犯这个错误(我是一名学生,不熟悉这个计划)

提前谢谢

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

这对我有用。你弄错了语法。

为了说明错误,这里有一个正确缩进的版本:

(define CartDist
  (lambda X1 
    Y1 
    X2 
    Y2
    (sqrt (+ (sqr (- X2 X1)) (sqr (- Y2 Y1))))))
如果将其称为
(CartDist 0 0 3 4)
参数绑定
x1
将成为
(0 0 3 4)
,因为它是一个符号(rest参数)

y1
是要计算的函数中的第一个表达式,它将失败,因为它既不在词法范围内也不在全局范围内定义。与尾部表达式
(sqrt…
之前计算的其他变量相同。要解决此问题,您需要将参数放入列表中,以便在调用时它们成为boudn变量:

(define cart-dist
  (lambda (x1 y1 x2 y2)
    (sqrt (+ (sqr (- x2 x1)) 
             (sqr (- y2 y1))))))
我已经冒昧地更改了案例和名称,以遵循lisp风格。您还可以这样组合
定义
lambda

(define (cart-dist x1 y1 x2 y2)
  (sqrt (+ (sqr (- x2 x1)) 
           (sqr (- y2 y1)))))

请注意,这与上面的完全相同。初学者的书通常不使用这种方法,因为定义函数就是给函数对象加上一个名称,而且绑定与任何其他值绑定都处于相同的环境中,这让人感到困惑

除了其他正确答案之外,我还想尝试帮助您阅读原始错误消息。它所说的是,它期望lambda的形式是

(lambda (variable more-variable ...) expression)
将其与lambda进行比较:

(lambda X1 Y1 X2 Y2 (sqrt (+ (sqr (- X2 X1)) (sqr (- Y2 Y1))))))
你有什么不同吗?希望您能注意到预期的表单在
lambda
关键字后面有括号,并且您的程序缺少括号


希望这有帮助

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

(define (point x y)
  (cons x y))

(define (point-x p)
  (car p))

(define (point-y p)
  (cdr p))

(define (point-difference p1 p2)
  (point (- (point-x p1) (point-x p2))
         (- (point-y p1) (point-y p2))))

(define (cartesian-distance p1 p2)
  (let ((diff (point-difference p1 p2)))
    (sqrt (+ (sqr (point-x diff))
             (sqr (point-y diff))))))

(cartesian-distance (point 0 0) (point 3 4)) ;; => 5

或者,如果允许,您可以使用s来完成相同的任务

(struct point (x y) #:transparent)

(define (point-difference p1 p2)
  (point (- (point-x p1) (point-x p2))
         (- (point-y p1) (point-y p2))))

(define (cartesian-distance p1 p2)
  (let ((diff (point-difference p1 p2)))
    (sqrt (+ (sqr (point-x diff))
             (sqr (point-y diff))))))

(cartesian-distance (point 0 0) (point 3 4)) ;; => 5

谢谢你的帮助!