2012-03-28 6 views
2

Первый пользователь stackoverflow, но случайный lurker, надеюсь, вы, ребята, можете мне помочь.Пожалуйста, помогите мне понять схему: нет аргументов?

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

например: (0 0 0 0 0 1 0 1 0 1) -> (1 0 1 0 1)

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

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

Я получаю ошибку в DrRacket является:

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

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

EDIT

Хорошо, меняя на некоторые вещи, теперь я получаю «рассчитывает ввести в качестве 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))) 

Он работает, спасибо большое!

ответ

2

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

Это должно составить:

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

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


Хорошо, ОП спросил об общем истолковании синтаксиса Схемы.

  • a - символ, который ищется оценщиком и заменить его значением. Некоторые символы (например, 42) оценивают сами.

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

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

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

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

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

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

+0

@ Scheme.Is.Strange Извините, мой вызов '=' отключен. Проверьте обновленный пример. – new123456

+0

Да, ваш код идеален, не возражаете ли вы объяснить, как работает синтаксис схемы? Я знаю, что мой вопрос расплывчатый и многого требует, но только некоторые советы будут приятными. –

+0

Хорошо, я думаю, я познакомлюсь с Схемой, спасибо большое! –

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