2013-04-24 4 views
2

Я новичок в схеме, и я пытаюсь написать процедуру, которая всегда находит первый элемент хвоста списка. Это важно при рекурсивных вызовах.Создание процедуры, которая принимает список как аргумент

Вот моя процедура:

(define second (lambda (x) (car(cdr(x)))) 

и это, как я стараюсь, чтобы проверить это работает ли это правильно или нет:

>(define x (list 1 2 3 4)) 
>(second x) 

и это ошибка:

procedure application: expected procedure, given: (1 2 3 4) (no arguments) 

=== context === 
stdin::184: second 
/usr/share/racket/collects/racket/private/misc.rkt:85:7 

В чем может быть проблема? Можете ли вы дать мне вдохновение? Является ли мое определение «вторым» неправильным или что?

Заранее спасибо.

+0

Вы используете это в DrRacket? Если это так, вы должны увидеть красную подсветку в области, где происходит ошибка. Вы видите это? – dyoo

+0

Нет, я пытался это сделать на терминале – user2870

+0

Если можно, попробуйте запустить Drracket; дополнительная поддержка, которую он предоставляет, должна быть полезна, когда вы изучаете язык. – dyoo

ответ

3

В вашем коде есть лишняя пара скобок. Это фиксирует это:

(define second (lambda (x) (car (cdr x)))) 

Чтобы было ясно, что это не так: (cdr(x)). Правильная форма: (cdr x). Помните, что всякий раз, когда вам нужно применить функцию f к аргументу x, правильный способ: (f x).

+0

wow большое спасибо. я очень ценю тебя :) – user2870

+0

Всегда мое удовольствие :) –

0

Схема использует S-выражения, поэтому вместо car(x) вы должны использовать (car x). В вашем случае это означает (car (cdr x)), а не car(cdr(x)).

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