请在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)`,然后接收f的AST,就像`tools.analyzer`做的那样。
通过结合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
...