请分享您的想法,参加2024 Clojure状态调查!

欢迎!请参考关于页面以了解更多关于这个工作方式的信息。

0 神投票
Clojure

如何从一个函数中解析抽象语法树?例如,给定

 (defn f [x]
     (/ (- 1.0 (Math/exp (- x))) 2.0))

有没有什么方法可以将其解析成列表这样的数据结构?

[:op "/" [:op "-" 1.0 [:op "Math/exp" [:op "-" x]]] 2.0]

谢谢!

顺便说一句,我明白这几乎是相同的。我在尝试学习Clojure,这似乎是一个简单的问题,但我找不到解决方案。

1 回答

+2 神投票

你好!有一个用于此类任务的非常有用的库叫做tools.analyzer,它可能会对你有所帮助。链接是https://github.com/clojure/tools.analyzer

谢谢!这已经很相近了,到目前为止我还没有找到实现的方法。具体来说,我想将一个函数名插入到解析函数中,例如`(parse f)`,并像`tools.analyzer`那样接收到f的AST。
您可以通过结合 tools.analyzer 与 clojure.repl/source 函数来实现非常接近该行为的功能。
太棒了!在这里找到了一个解决方法,使用 clojure.repls/source-fn:clojureverse.org/t/how-to-print-a-source-of-a-function-passed-as-a-parameter/6160/4
...