Замена первого вхождения элемента в списке
Я пишу функцию replaceFirst(X Y L)
который заменяет только первое вхождение X на Y в списке L.
Вот что я сделал до сих пор:
(define replaceFirst( lambda (X Y L)
(cond
( (null? L) '() )
( (equal? (car L) X) (set! Y (cdr L)) )
( #t (replaceFirst X Y (cdr L)) )
)
))
который дает ошибку In procedure setter: Wrong type argument in position 1: #<procedure car (_)>
РЕДАКТИРОВАТЬ
Я придумал решение:
Во-первых, если X
является первым элементом, вместо использования set!
(с которым я незнаком), я cons
Y
в список, исключая X
,
В противном случае я cons
первый элемент списка с функцией, вызываемой рекурсивно в остальной части списка.
(define replaceFirst( lambda (X Y L)
(cond
( (null? L) '() )
( (equal? (car L) X) (cons Y (cdr L)) )
( #t (cons (car L) (replaceFirst X Y (cdr L))) )
)
))
1 ответ
В тебе пункт:
( (equal? (car L) X) (set! Y (cdr L)) )
Что на самом деле возвращает функция? И если Y должен заменить X, если вы знаете, что (car L) равно X, что для вас сделает установка переменной Y, равной остальной части списка?
Ваше обновление в порядке, но обратите внимание, что оно возвращает новый список, такой как L, но в котором первое вхождение X было заменено на Y. Это не тот же список. Это, вероятно, хорошо, но использование набора! в вашей первой попытке предполагается, что, возможно, вы хотели изменить список, который был передан в качестве ввода.