"Traduttore, traditore"
(Это можно перевести как "переводчик, предатель", но это разрушает каламбур, что само по себе весело)
Трудно намекнуть на возможные исправления в вашем коде Clojure, потому что спецификация неясна: если вы будете следовать Корням Lisp к букве, вы собираетесь реализовать Lisp поверх Clojure, и subst
может быть похоже на то, что в книге. Но если вы хотите реализовать subst
, как это обычно используется в Лиспе, приведенный здесь код этого не сделает.
Несмотря на то, что Clojure имеет функции cons
и nil?
, они не означают одно и то же как в Common Lisp (соотв. cons
и null
): см. clojure: нет минусов для деталей. Прежде чем вы сможете перевести subst
, вы должны определить, что идиоматическое c нужно сделать в Clojure.
Обычно subst
используется для преобразования дерева , сделанного из минусы клетки; обратите внимание, например, что subst
не переходит в векторы, строки и т. д. c. Среди этих деревьев определенным подмножеством деревьев являются те, которые являются формами Лисп. Фактически, одним из важных вариантов использования subst
является поиск и замена форм во время генерации кода.
Если вы ограничитесь типом Clojure Cons
, вы не будете поддерживать код как данные, насколько я знаю. Так как в коде Clojure также используются векторы и карты, вам, вероятно, потребуется использовать такие объекты. Итак, как перевести subst
не так просто определить.
Возможной отправной точкой является чтение LispReader.java
, чтобы определить набор объектов, составляющих AST, и Посмотрите, какой вид кода вы хотите делать.
Мой совет - сначала изучать эти языки самостоятельно. Имея небольшой опыт работы с каждым из них, вы сможете лучше понять, насколько они похожи и насколько они отличаются друг от друга.