我的问题是关于构造带有副作用的lisp代码.我想到的具体例子来自Clojure,但我认为它可以适用于任何口齿不清.
在这种情况下,我正在与一个现有的库进行交互,该库需要按特定顺序调用某些函数.最后的函数调用创建了剩余程序所需的值.
代码如下所示:
(defn foo []
(let [_ procedure-with-side-effect
__ another-procedure-with-side-effect
value procedure-that-creates-the-value]
(do-something value)))
Run Code Online (Sandbox Code Playgroud)
这是有效的,一切都很好,除了我认为let块看起来很可怕.有一个更好的方法吗?
zck*_*zck 10
如果你不需要函数调用的中间值,你可以在函数体中放入一堆函数调用defn:
(defn foo []
(procedure-with-side-effect)
(another-procedure-with-side-effect)
(do-something (procedure-that-creates-the-value)))
Run Code Online (Sandbox Code Playgroud)
虽然这是此代码的最佳选择,但还有其他选择.您还可以在以下内容中放置任意数量的函数调用let:
(let [val 3]
(fun-call-1)
(fun-call-2)
(fun-call-3 val))
Run Code Online (Sandbox Code Playgroud)
如果您不想绑定任何值,可以使用do:
(do (fun-call-1)
(fun-call-2)
(fun-call-3))
Run Code Online (Sandbox Code Playgroud)
在Lisp中,每个函数体都是一组有序的形式.将返回最后一个表单的值.如果过程不使用中间结果值作为参数,LET则不需要a.如果procedure-that-creates-the-value不需要通过命名变量来记录,则也不需要LET绑定其值.
所以在Lisp中代码就是这样:
(defun foo ()
(procedure-with-side-effect)
(another-procedure-with-side-effect)
(do-something (procedure-that-creates-the-value)))
Run Code Online (Sandbox Code Playgroud)
我不是很有经验,但我会这样做:
(defn foo []
(procedure-with-side-effect)
(another-procedure-with-side-effect)
(let [value (procedure-that-creates-the-value)]
(do-something value)))
Run Code Online (Sandbox Code Playgroud)
要么
(defn foo []
(procedure-with-side-effect)
(another-procedure-with-side-effect)
(-> (procedure-that-creates-the-value)
do-something))
Run Code Online (Sandbox Code Playgroud)
要么
(defn foo []
(procedure-with-side-effect)
(another-procedure-with-side-effect)
(do-something (procedure-that-creates-the-value)))
Run Code Online (Sandbox Code Playgroud)
编辑:defn表达式用隐式包装do.