Ваша ошибка в том, что вам не хватает оператора, может быть cons
. Если вы посмотрите на следствии:
((cdr (car list1))(second (cdr list1)))
Так Схема ожидает (корд (список автомобилей)), чтобы быть процедурой, так как он находится в позиции оператора в форме, но так как это не вы получите сообщение об ошибке. Кроме того, (cdr (car x))
== cdar
не будет брать второй элемент в каждом элементе, кроме хвоста каждого элемента. cadar
- это то, что вы ищете.
(define (second list1)00+
(if (null? (cdr list1))
(cons (cadar list1) '())
(cons (cadar list1) (second (cdr list1)))))
Это не удастся для пустого списка. Чтобы это исправить, пусть consequemt заботиться о каждом элементе и базового случая только остановить:
(define (second list1)
(if (null? list1)
'()
(cons (cadar list1) (second (cdr list1)))))
Результат для списка будет то же самое. Существует процедура, называемая map. Он поддерживает несколько аргументов списка, но для одного из них:
(define (map fun lst)
(if (null? lst)
'()
(cons (fun (car lst)) (map fun (cdr lst)))))
Похоже, что знакомы? Оба составляют список на основе каждого элемента, но map
является общим. Таким образом, мы должны попытаться сделать (fun (car lst))
так же, как (cadar lst)
.
(define (second lst)
(map cadr lst)) ; (cadr (car x)) == (cadar x)
У вас есть это. Chris beat me to it, но я хотел бы прокомментировать один из других ответов, который использует аббревиатуру second
. Он определен в racket/base и библиотеке SRFI-1, но он не упоминается в последних отчетах Схемы. То есть для некоторых реализаций может потребоваться импортировать дополнительную библиотеку для ее работы.
что не так с кодом? –
Я получаю это..приложение: не процедура; ожидаемая процедура, которая может быть применена к аргументам : '((3 1)) аргументы ...: ' ((2 3)) – dionysosz
Отформатируйте код разумным способом (т.е. строки, содержащие только парсеры) и проблема будет легче обнаружить. –