2017-02-11 5 views
-1

Вот мой код.Я пытаюсь создать функцию для формулы расстояния в DrRacket (Scheme), но я получаю ошибку каждый раз, когда я запускаю ее

(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 

Я не имею ни малейшего понятия, почему я получаю эту ошибку (я студент и новичок схема)

Заранее спасибо!

ответ

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

Это работает для меня. Вы перепутали синтаксис.

+0

Спасибо за помощь! – bsalam

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

Обратите внимание, что это точно так же, как и выше. Начинающие книги обычно не используют это, поскольку это запутывает, поскольку определение функции - это поместить имя в объект функции, а привязка - в той же среде, что и любое другое связывание значений.

0

В дополнение к другим правильным ответам, я хотел бы попытаться помочь вам прочитать исходное сообщение об ошибке. Что это говорит, что он ожидает, что лямбда, чтобы быть в форме

(lambda (variable more-variable ...) expression) 

Сравните это с вашей лямбда:

(lambda X1 Y1 X2 Y2 (sqrt (+ (sqr (- X2 X1)) (sqr (- Y2 Y1)))))) 

делать какие-либо различия бросаются в глаза? Надеюсь, вы заметите, что ожидаемая форма имеет круглые скобки сразу после ключевого слова lambda и что ваша программа их не хватает.

Надеюсь, это поможет!

0

я мог бы рекомендовать использовать некоторые абстракции данных для поддержания практичности вашей процедуры

(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 

Или, если это разрешено, вы можете использовать struct с, чтобы сделать то же самое

(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 
Смежные вопросы