Lisp/Clojure中的副作用

mun*_*unk 5 lisp clojure

我的问题是关于构造带有副作用的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)


Rai*_*wig 6

在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)


dea*_*ost 5

我不是很有经验,但我会这样做:

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