Схема Обход и печать DAG в глубину первым способом - PullRequest
0 голосов
/ 29 марта 2020

Пусть NODE будет функцией с STORE в ее закрытии. Все листы графа имеют STORE, который представляет собой одно значение (постоянное или переменное), а все внутренние узлы имеют STORE, представляющий собой список, содержащий:

  1. Символ, представляющий функцию (' + '*' cos 'sin et c)
  2. Список из одного или нескольких узлов, представляющих потомков этого узла.
  3. Функция упрощения (которая не имеет отношения к моему вопросу).

Предположим, [[(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)

Как видите, проблема связана с дополнительными скобками внутри выражения. Вы можете представить, что это еще хуже для более сложных примеров. Я понимаю, где я создаю список и почему в нем есть скобки, но я не могу найти способ удалить его, правильно вывести значения.

1 Ответ

1 голос
/ 29 марта 2020

Попробуйте изменить часть, которая составляет список, например:

(define repr
  (lambda (store)
    (if (is_leaf? store)
        store
        (cons (car store)
              (repr_helper (cadr store) repr)))))

Нам просто нужно добавить новый элемент в начало списка, возвращаемого repr_helper, вызов cons сделает свое дело.

...