Clojure 在 `let` 绑定中打印值

nha*_*nha 5 clojure

在绑定内打印值的惯用方法是什么let

当我开始使用 Clojure 进行开发时,我在 REPL 中编写代码,然后将其转换为简单的let表达式。作为一个初学者,我在这个(简单的)转换阶段经常犯错误。

(let [a (aFn ...)
       b (bFn ... a)]
   ;; error above
)
Run Code Online (Sandbox Code Playgroud)

所以我会把它改回类似的东西,基本上是内联的东西:

(println "a is"    (aFn ...))
(println "b is" (bFn ... (aFn ...)))
(let [a (aFn ...)
       b (bFn ... a)]
   ;; ...
)
Run Code Online (Sandbox Code Playgroud)

由于 Clojure 的出色性能(不变性、引用透明性......),它在大多数情况下都可以工作。

现在我做了一些事情:

(let [a (aFn ...)
       _ (println "a is" a)
       b (bFn ... a)
      _ (println "b is" b)]
   ;; ...
)
Run Code Online (Sandbox Code Playgroud)

这是一个进步,但仍然感觉很笨拙。执行此操作的正确方法是什么?

cor*_*ump 3

您可以定义一个返回其参数的打印函数:

(defn cl-print [x] (doto x (print)))
Run Code Online (Sandbox Code Playgroud)

然后,只需封装表达式即可:

(let [a (cl-print (aFn ...))
      b (cl-print (bFn ... a))]
   ...)
Run Code Online (Sandbox Code Playgroud)