Я разрабатываю DSL в Clojure, который используется для управления генератором кода (, в данном случае для процедурного синтеза изображений -. клиск)и у меня возникли проблемы с разработкой наилучшего представления для промежуточных значений.
Первоначально DSL состоял из функций, которые возвращали одну или несколько форм, например. (иллюстративный)
(v+ 1.0 [1.0 'y])
=> ['(+ 1.0 1.0) '(+ 1.0 y)]
Затем эти функции можно было бы скомпоновать для создания более крупных блоков кода.
Это было просто, и полученные формы можно было напрямую вводить в генератор кода. Однако теперь я определил некоторые недостатки этого подхода,например, если есть необходимость передать некоторые вспомогательные данные (, например. объекты, которые не могут быть закодированы в таких формах, как BufferedImages, метаданные, полезные для оптимизации и т. д. ).
Я уверен, что в мире Лиспа эта проблема решена. -Какое промежуточное представление обычно является лучшим для такого типа DSL?