Замена первого вхождения элемента в списке

Я пишу функцию 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! (с которым я незнаком), я consY в список, исключая 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. Это не тот же список. Это, вероятно, хорошо, но использование набора! в вашей первой попытке предполагается, что, возможно, вы хотели изменить список, который был передан в качестве ввода.

Другие вопросы по тегам