Для того, чтобы проиллюстрировать, что это неправильно, вот правильно отступ версия:
(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)))))
Обратите внимание, что это точно так же, как и выше. Начинающие книги обычно не используют это, поскольку это запутывает, поскольку определение функции - это поместить имя в объект функции, а привязка - в той же среде, что и любое другое связывание значений.
Спасибо за помощь! – bsalam