Сначала.Синтаксические скобки []
и ()
имеют одинаковое значение.Таким образом, если вы хотите добавить 3
и 5
, вы можете написать [+ 3 5] ; ==> 8
.Программисты используют разные, чтобы сделать код понятнее.В дополнение к этому, я бы сказал, что отступ - это самый важный навык для освоения, и вы должны использовать редактор, который сделает это за вас.Я использую DrRacket, но если вы больше человек из Emacs, вам следует добавить поддержку Scheme.
Есть много проблем с вашим кодом, в основном из-за лишних / отсутствующих скобок.например.ваш let
источник вашей ошибки:
(let ([buck1] ; make variable buck1 as ??
(bucket-val bucket1)) ; make variable bcuket-val as bucket1
([buck2] (bucket-val bucket2))) ; call buck2 and call the result
Заметили, что вы смешиваете [
и (
?Тело вызывает процедуру и вызывает результат.На языках Алгола вы получаете то же самое, если вы делаете buck()(bucket-val, bucket1)
. if
неверен и находится вне let
, и поэтому они не могут использовать созданные локальные переменные.Вместо этого вы пытаетесь сравнить 3 значения с equal?
, что не сработает, и у вас нет последовательного и альтернативного выражения (then / else)Некоторые из реализаций могут там не потерпеть неудачу, но это не переносимый код Схемы.
В своем описании вы не упоминаете, что ваша процедура возвращает процедуру, которая выполняет свою работу при вызове.Двойной lambda
диктует это.(define (test x) (lambda ...))
- это то же самое, что и (define test (lambda (x) (lambda ...))))
, то есть процедура, возвращающая процедуру, а не "какая из них имеет более высокое значение".