2012-03-13 5 views
1

Я написал процедуру для вычисления суммы квадратов первой и второй самый большой из 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' объявляет переменную в блоке объявления?

Спасибо.

ответ

1

Проблема в том, почему оценка (second (max first z)))first не входит в сферу действия.

Как указано в определении, это имя доступно только в теле let. На этом этапе среда выполнения пытается разрешить имя во внешней области, где оно не определено, следовательно, ошибка.

Примечание: вложенный let решает эту проблему.

+0

да, я прыгнул gun..should прочитанного следующий абзац в тексте «значения переменных вычисляются вне аренды. Это важно, когда выражения, которые обеспечивают значения для локальных переменных зависят от переменных с теми же именами, что и локальные переменные » – sachinrahulsourav

+1

Приправленные схемы/Лисперс использовали бы' let * 'вместо вложенных' let '. ('let *' - это макрос, который просто расширяется до вложенных 'let's.) –

+0

ok, я использовал конструкцию let *: ' (define (max2of3 xyz) (let * ((first (max xy)) (второй (максимальный первый z))) (+ (* сначала первый) (* вторая секунда)))) ' \t Но это дает мне результат 50, когда я звоню (max2of3 3 5 2)? Его оценка до (+ 25 25) как-то .. Что не так с этим кодом? – sachinrahulsourav

Смежные вопросы