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
...