(pieces 'apple) => (apple x)
Но это должно быть ((apple x))
, верно? Вы должны получить список, где первым и единственным элементом является список (apple x)
.
Предложения cond, завершающие рекурсию (exp - символ или ноль), возвращают элементы, которые должны быть в списке, в то время как предложение, которое повторяется в car
и cdr
, пытается создать список элементов. Поскольку pieces
может возвращать как элементы, так и списки элементов, довольно сложно составить список элементов из значений, которые возвращаются из него: когда вы делаете (list exp 'x b c)
, вы не знаете, b
и c
являются элементами, которые должны войти в список или списки элементов.
Если вы убедитесь, что pieces
всегда возвращает список элементов (например, (list (list exp 'x))
), это становится намного проще. Когда вы возвращаетесь к car
и cdr
, вы хотите сделать что-то вроде append
списков a
и b
и добавить в этот список «текущий» ((list exp 'x)
) элемент (возможно, с cons
или что-то).
Для второй части, pieces
должен знать, как он попал к текущему предмету. Вы можете сделать pieces
указанием «пути» к текущему элементу в качестве (возможно, необязательного) параметра. Если путь является списком, то при вызове pieces
на (car exp)
вы можете добавить символ car
к пути, который вы отправляете в качестве аргумента, а для (cdr exp)
вы можете добавить символ cdr
. И затем вы используете путь, чтобы создать что-то хорошее, чтобы заменить 'x
в (list exp 'x)
.