Я написал процедуру для вычисления суммы квадратов первой и второй самый большой из 3-х цифр, как показано ниже ...сумма квадратов макс 2 3 SICP упражнения
(define (max2of3 x y z)
(let ((first (max x y))
(second (max first z)))
(+ (* first first) (* second second))))
Но я получаю ошибка, когда я выполнить его ...
[2] (нагрузка "max2of3") OK [3] (max2of3 1 2 3)
[VM произошла ошибка!] Переменная не определена в лексической среде FIRST
Хотя я понимаю, что ошибка вызвана тем, что интерпретатор не распознает переменную «FIRST», я не понимаю почему?
По определению из SICP:
Первая часть выражения, пусть список имя-экспрессирующих пар. Когда значение let оценивается, каждое имя связано со значением соответствующего выражения. Тело let оценивается с помощью эти имена связаны как локальные переменные
Не означает, что это означает, что конструкция 'let' объявляет переменную в блоке объявления?
Спасибо.
да, я прыгнул gun..should прочитанного следующий абзац в тексте «значения переменных вычисляются вне аренды. Это важно, когда выражения, которые обеспечивают значения для локальных переменных зависят от переменных с теми же именами, что и локальные переменные » – sachinrahulsourav
Приправленные схемы/Лисперс использовали бы' let * 'вместо вложенных' let '. ('let *' - это макрос, который просто расширяется до вложенных 'let's.) –
ok, я использовал конструкцию let *: ' (define (max2of3 xyz) (let * ((first (max xy)) (второй (максимальный первый z))) (+ (* сначала первый) (* вторая секунда)))) ' \t Но это дает мне результат 50, когда я звоню (max2of3 3 5 2)? Его оценка до (+ 25 25) как-то .. Что не так с этим кодом? – sachinrahulsourav