Схема обучения или любой Лисп означает знакомство со структурой списка. Список (1 2 3)
может быть составлен как (cons 1 (cons 2 (cons 3 '())))
, и мне нравится думать, что элемент в списке, у которого нет .
, означает, что он есть, а у остальных есть дополнительный набор парантезов. Сделано рекурсивно! Таким образом:
'(1 2 3) ; ==
'(1 . (2 3)) ; ==
'(1 . (2 . (3))) ; ==
'(1 . (2 . (3 . ()))) ; ==> (1 2 3)
Я вижу точки, которых нет, когда вижу списки, поэтому я знаю, 3
равно caddr
, поскольку я прохожу . (
2 раза (dd
) и затем прыгаю в car
, таким образом caddr
.
Присоединение двух списков вместе означает копирование первого списка и замену ()
на второй список . Таким образом, append
можно определить как:
(define (my-append l1 l2)
(if (null? l1)
l2
(cons (car l1)
(my-append (cdr l1) l2))))
Замена одного элемента другим. Вам нужно сделать то же самое, НО вы сравниваете первый элемент в каждой итерации и на основании этого либо используете найденный элемент, либо замену. Если вы хотите сравнить строки, вам нужно использовать equal?
, так как (eqv? "hello" "hello") ; ==> #f
является действительным результатом.