Я реализую похожий на схему lisp, который в какой-то момент будет скомпилирован в некоторую форму байт-кода, которую можно увидеть здесь .К сожалению, я закодировал себя в какую-то дыру и не уверен, как из нее выбраться.По сути, с учетом лямбды, которая выглядит следующим образом (внешний b преднамеренно не используется):
(lambda (a b) (lambda (c) (+ a c)))
Мой код выдает это дерево синтаксиса:
[
type: :lambda,
args: [[type: :word, val: 'a'], [type: :word, val: 'b']],
body: [
[
type: :lambda,
args: [[type: :word, val: 'c']],
body: [
[
type: :expr,
val: [
[type: :word, val: '+'],
[type: :word, val: 'a'],
[type: :word, val: 'c']
]
]
]
]
]
]
К сожалению, когда я на самом деле получаюгенерируя байт-код, будет непросто создать замыкания, необходимые для этих лямбд (насколько я могу судить).В идеале я хотел бы создать дерево, которое выглядит следующим образом:
[
type: :lambda,
args: [[type: :word, val: 'a'], [type: :word, val: 'b']],
closure: [],
body: [
[
type: :lambda,
args: [[type: :word, val: 'c']],
closure: [[type: :word, val: 'a']],
body: [
[
type: :expr,
val: [
[type: :word, val: '+'],
[type: :word, val: 'a'],
[type: :word, val: 'c']
]
]
]
]
]
]
Достаточно легко определить, должен ли данный параметр быть частью замыкания, посмотрев, отображается ли оно в env,однако, поскольку я просто вызываю Enum.map
поверх body , я не уверен, как вернуть эту информацию обратно в мой лямбда-объект.Мне не нужен конкретный код для того, чтобы это исправить, но общие указания / подсказки / толчки в правильном направлении были бы хороши (я знаю, что это немного расплывчато, но я не совсем уверен, как сделать более конкретный тестдело за этим).