2015-04-27 2 views
1

Я пытаюсь взять две пары «(a. B)» (c. D) и ввести их в уравнение.Ввод пар в уравнение для схемы

(define dist 
    (lambda (pr) 
(sqrt (+ (expt (- (car pr) (car pr) 2)(expt (- (cdr pr) (cdr pr) 2))) 

Я пробовал это и несколько других способов, но я просто получаю ошибки.

Мое фактическое уравнение, похоже, работает с числами, но я не уверен, как я должен вводить две пары, или если я даже должен использовать уравнение, подобное тому, которое у меня есть. Я взволнован. Я думаю об этом все неправильно, и ничто в моей книге не упоминает, как иметь дело с двумя парами, и мой учитель не ответит. Я так смущен, любые советы или объяснения будут замечательными.

EDIT: Я должен отметить, что, чтобы проверить мой код у меня есть цифры вместо букв в парах, например:

(dist '(2 . 5) '(3 . 1)) 

Я пытался сделать его универсальным, так как любое число должно иметь возможность работать с кодом. Извините за путаницу.

ответ

0

процедура Пример:

(lambda (a b) 
    (+ a b)) 

Здесь a и b два аргумента. Их имена объявляются в списке формальных параметров, и они используются этими именами в теле. То, что a и b могут быть числами, могут быть видны только тем, как они используются в теле процедуры, но сам формальный список параметров ничего не говорит о типе. Они могут быть парами, и + может быть лексически связанной процедурой, которая делает что-то совершенно иное, чем добавление чисел.

В вашей процедуре вы определили одну связанную переменную pr. Кажется, что код является парой, так как вы применяете к нему как car, так и cdr. Если вам нужно добавить другую пару, вы должны добавить ее в список формальных параметров с выбранным вами именем (например, pr) и использовать это имя в теле процедуры.

Подробнее о формате lambda expressions in the R6RS standard.

0

Вы показали функцию dist, которая принимает два аргумента:

(dist '(2 . 5) '(3 . 1)) 

, где первый аргумент является '(2 . 5) и второй аргумент '(3 . 1). Но вы определили функцию dist, которая принимает один аргумент, который вы назвали pr. Это не сработает - одно определение аргумента, но приложение с двумя аргументами.

Как насчет:

(define dist 
    (lambda (arg1 arg2) 
    (let ((x1 (car arg1)) 
      (y1 (cdr arg1)) 

      (x2 (car arg2)) 
      (y2 (cdr arg2))) 

     (sqrt (+ (expt (- x2 x1) 2) 
       (expt (- y2 y1) 2))))))