сумма квадратов макс 2 из 3 упражнений SICP - PullRequest
1 голос
/ 14 марта 2012

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

    (define (max2of3 x y z)
      (let ((first (max x y))
            (second (max first z)))
        (+ (* first first) (* second second))))

Но я получаю сообщение об ошибке ...

[2] (нагрузка "max2of3") Хорошо [3] (max2of3 1 2 3)

[ВМ ОШИБКА обнаружена!] Переменная не определена в лексической среде ПЕРВЫЙ

Хотя я понимаю, что ошибка вызвана тем, что интерпретатор не распознает переменную 'FIRST', я не понимаю, почему?

По определению из SICP:

Первая часть выражения let представляет собой список пар имя-выражение. Когда оценка оценивается, каждый Имя связано со значением соответствующего выражения. Тело пусть оценивается с эти имена связаны как локальные переменные

Разве это не означает, что конструкция let позволяет объявлять переменную в блоке объявлений?

Спасибо.

1 Ответ

1 голос
/ 14 марта 2012

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...