Помогите, пожалуйста, понять схему: нет аргументов? - PullRequest
2 голосов
/ 29 марта 2012

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

Итак, первая часть моего задания - отбросить все «ведущие нули» в списке.

ex: (0 0 0 0 0 1 0 1 0 1) -> (1 0 1 0 1)

Чтобы сделать это, я подумал использовать оператор IF, чтобы проверить, является липервый элемент был 0 или нет, и рекурсивно вызывал остальную часть списка, пока не было больше ведущих нулей.Поскольку я практически не представляю, как программировать в Scheme, через поиск в Интернете я придумал то, что вы видите ниже.Однако когда я запускаю его, DrRacket говорит мне, что аргументов нет - я предполагаю, что это либо синтаксическая ошибка ... либо, скорее всего, я понятия не имею, что я делаю.Так что, если бы вы могли мне помочь, я был бы очень признателен!

    >(define zz
    >  (lambda (n)
    >    (if (= (car (n)) 0)
    >        (zz (cdr (n)))
    >        ((n)))))
    >
    >(remove '(0 0 0 0 1 0 1 0))

Ошибка, которую я получаю в DrRacket:

"применение процедуры: ожидаемая процедура, учитывая: (00 0 0 1 0 1 0) (без аргументов) "

Опять же, большое спасибо!(PS Извините, если форматирование немного странное ...)

РЕДАКТИРОВАТЬ

Хорошо, изменив некоторые вещи, я теперь получаю тип "ожидает" в качестве 1-го аргумента, задано: (0 0 0 0 0 1 0 1 0); другие аргументы: 0 "ошибка помечена в моем операторе if.

    >(define zz
    >  (lambda n
    >    (if (= (car n) 0)   <----- here
    >        (zz(cdr n))
    >        (n))))

EDIT 2

    >(define zz
    >  (lambda (n)
    >    (if (= (car n) 0)
    >        (zz (cdr n))
    >        n)))

Работает, большое спасибо!

1 Ответ

2 голосов
/ 29 марта 2012

(num) неверно - вы пытаетесь вызвать 42 или что-то еще как команду. (Кроме того, ваш синтаксис if отключен; возможно, вы захотите прочитать больше кода, чтобы лучше понять синтаксис).

Это должно скомпилировать:

(define remove
  (lambda (num)
    (if (= (car num) 0)
      (remove (cdr num))
      num)))

Скобки в Лиспе предназначены для вызова функций, если они не используются в кавычках.


Ладно, ОП спросил об общем изложении синтаксиса для Схемы.
  • a - Символ, который ищется оценщиком и заменяет его значение. Некоторые символы (такие как 42) оценивают сами себя.

  • 'a - Это "цитирует" символ и преобразует его в (quote a). quote предотвращает оценку его аргумента - вместо этого возвращается значение a. Not строка "a", not результат поиска a, a. Это также работает для списков ('(1 2 3))

  • (if <expr> <true-value> <false-value>) - оценивает <expr>, проверяет, является ли его значение достоверным или нет, и выполняет соответствующее значение.

  • (cond (<expr> <true-value>) ... (else <false-value>)) - выполняется через его аргументы и оценивается car, чтобы определить, верно ли это. Если это так, возвращается значение оценки cdr. В противном случае он переходит к следующему значению.

  • (define <name> <expr>) - Устанавливает значение оценки второго аргумента для имени первого аргумента.

  • (lambda <arg-list> <body>) - Создает процедуру, которая является результатом привязки передаваемых аргументов к именам, присутствующим во втором аргументе, и оценки третьего аргумента.

  • (<func> <arg1> <arg2> ... <argn>) - Если оценщик обнаруживает, что ни один из вышеприведенных шаблонов не соответствует, то он вызывает car списка как функцию с аргументами в cdr.

...