2013-02-16 1 views
3

В настоящее время я выполняю упражнение 1.3 из книги sicp. Вот описание проблемы:Ошибка: не удается связать имя в нулевой синтаксической среде

Define a procedure that takes three numbers as arguments and returns the sum of the squares of the two larger numbers.

Я попытался решить эту проблему с помощью следующего кода

(define (square x) (* x x)) 

(define (sq2largest a b c) 
     ((define large1 (if (> a b) a b)) 
     (define small (if (= large1 a) b a)) 
     (define large2 (if (> c small) c small)) 
     (+ (square large1) (square large2)))) 

Когда я побежал в мит-схеме, я получаю следующее сообщение об ошибке:

;Can't bind name in null syntactic environment: large1 #[reserved-name-item 13]

Ошибка при запуске этой ошибки не дает много результатов. Кто-нибудь знает, что не так с моим кодом? (Я не знаком с Схемой)

ответ

3

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

+0

Удаление внутренних скобок действительно сработало, но я не понимаю, как это решает проблему. Синтаксис define (define ). Я думал, что мне придется группировать все под вместе, следовательно, добавочную пару круглых скобок. –

+1

@KietTran Основная форма 'define' действительно' '(define )'. Но вы используете вариант для определения функций, '(define () )'. У вас были дополнительные парсеры для ''. Кстати, эта вторая вариация для определения функций - это просто сахар для первичной формы: это сокращенное выражение для '(define (lambda ()). Другими словами,« определение функции »означает определение переменной, значение которой равно «лямбда» вместо (скажем) числа или строки. –

3

Я попытаюсь разрушить структуру вашей sq2largest процедуры:

Основная структура:

(define (sq2largest a b c) 
    ; Body) 

Тело Вы написали:

((define large1 (if (> a b) a b)) ; let this be alpha 
(define small (if (= large1 a) b a)) ; let this be bravo 
(define large2 (if (> c small) c small)) ; let this be charlie 
(+ (square large1) (square large2)) ; let this be delta) ; This parentheses encloses body 

Таким образом, Тело структурировано как:

(alpha bravo charlie delta) 

Что переводят: «Пропустить bravo, charlie и delta в качестве аргументов в альфа».

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

Скобки являются значимыми в схеме (и большинство, если не все, Lisps), поскольку они определяют сферу действия процедуры и обеспечивают соблюдение [1] порядка применения операций.

[1] «Не может возникнуть двусмысленность, поскольку оператор всегда является самым левым элементом, а вся комбинация разделена круглыми скобками». http://mitpress.mit.edu/sicp/full-text/sicp/book/node6.html

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