Схема: присвоение переменной - PullRequest
0 голосов
/ 18 октября 2018

Ведро - это предложение шаров, например: RWWBRRRG B.

Каждый цвет шара имеет значение, например: R (красный = 3) W (белый = 1)

Необходимая процедурапринимает два параметра bucket1 и bucket2 и сравнивает значения двух сегментов и выводит, какое из них имеет более высокое значение, или если оно имеет связь.В этой процедуре используется другая процедура, называемая bucket-val, которая вычисляет значение сегмента.

Я пытаюсь создать переменную в процедуре с именами buck1 и buck2, чтобы упростить код, когда я выполняю свои операторы if вдно.Однако я получаю сообщение об ошибке:

let: неверный синтаксис (не идентификатор и выражение для привязки) в: (buck1)

(define (bucket-val bucket)
  (+ (* (count-balls 'R bucket) (ball-val 'R))
     (* (count-balls 'W bucket) (ball-val 'W))
     (* (count-balls 'B bucket) (ball-val 'B))
     (* (count-balls 'G bucket) (ball-val 'G))))


(define (judge bucket1 bucket2)
  (lambda(buck1 buck2)
    (let ([buck1] (bucket-val bucket1))
      ([buck2] (bucket-val bucket2)))
    (if (equal? b1 b2 'truuuue))))

1 Ответ

0 голосов
/ 18 октября 2018

Сначала.Синтаксические скобки [] и () имеют одинаковое значение.Таким образом, если вы хотите добавить 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 ...)))), то есть процедура, возвращающая процедуру, а не "какая из них имеет более высокое значение".

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