Пусть NODE будет функцией с STORE в ее закрытии. Все листы графа имеют STORE, который представляет собой одно значение (постоянное или переменное), а все внутренние узлы имеют STORE, представляющий собой список, содержащий:
- Символ, представляющий функцию (' + '*' cos 'sin et c)
- Список из одного или нескольких узлов, представляющих потомков этого узла.
- Функция упрощения (которая не имеет отношения к моему вопросу).
Предположим, [[(NODE f)]] = [[(f STORE)]] , если f - это процедура, а STORE - это STORE в закрытии NODE.
Я пытаюсь найти способ пройти по этому дереву и напечатать выражение, которое можно оценить с помощью (eval) . Я подошел близко, но я просто не могу заставить его работать.
Вот мой код:
(define repr
(lambda(store)
(if (is_leaf? store)
store
(list (car store)
(repr_helper (cadr store) repr)))))
(define repr_helper
(lambda(f_list arg)
(cond ((null? f_list) '())
(else (cons ((car f_list) arg) (repr_helper (cdr f_list) arg))))))
Простой пример: Предположим, дерево с одним добавлением 4 аргументов (создает + узел с 4 дочерними элементами, все из которых являются листьями).
((Add 10 'x 'y 'z) repr)
Вывод: '(+ (10 xyz)).
Ожидаемый результат: '(+ 10 xyz)
Как видите, проблема связана с дополнительными скобками внутри выражения. Вы можете представить, что это еще хуже для более сложных примеров. Я понимаю, где я создаю список и почему в нем есть скобки, но я не могу найти способ удалить его, правильно вывести значения.