clojure - 打印 “fully expanded form before evaluation” 的 Clojure 函数?

标签 clojure read-eval-print-loop

是否有一个 Clojure 函数可以为任何函数做 macroexpand-all 为宏做的事情?

在 SICP 中,Abelson 和 Sussman 对此进行了演示,他们称之为“linear recursive process ”。

换句话说,如果我们给出:

(factorial 6)

该函数将打印(而不是求值):

(* 6 (* 5 (* 4 (* 3 (* 2 (1))))))

本质上,我试图在评估之前“查看”任何函数“构建”的数据结构。


我认为这对于初学者(我自己)来说是一种有趣的方式,可以在将内容传递给 Evaluator* 之前查看 Reader* 正在构建的内容。

*不确定我在这里使用的术语是否正确。

最佳答案

无需编程即可完成功能跟踪。例如,它在 Emacs 的 Cider 扩展中可用。 https://docs.cider.mx/cider/debugging/tracing.html

我已将阶乘程序加载到 Emacs 中,并将光标放在 factorial 函数上。

 (ns factorial.core
    (:gen-class))

 (defn factorial [n]
    (if (zero? n)
     1
     (* n (factorial (dec n)))))

 (defn -main
    "A factorial program."
    [& args]

    (let [n 6] 
       (println "The factorial of " n "is" (factorial n))))

             M-x cider-jack-in

 REPL:  (in-ns 'factorial.core)

             C-c M-t v, select factorial when prompted

        (factorial 3)

enter image description here

关于clojure - 打印 “fully expanded form before evaluation” 的 Clojure 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70911639/

相关文章:

clojure - 如何在Clojure中遍历一棵树,同时从每个节点节点收集值?

clojure - defmethod 捕获所有

Clojure:Webbit + Ring

python - 获取 Python 函数的调用字符串,如在命令行中键入的那样

javascript - 如何从 CoffeeScript 脚本中启动 CoffeeScript repl?

clojure - 在 Clojure 中管理代理线程池

Python:这会给我留下一个干净的环境吗?

node.js - Nodejs 中的自定义 REPL

node.js - 为 repl 提示( Node )添加颜色

javascript - 如何在 Clojurescript 中循环 JavaScript 对象并将每个对象插入数组