“do”特殊形式是什么?

3

文档说明:

(do exprs*)
依次评估表达式并返回最后一个表达式的值。如果没有提供任何表达式,则返回nil。

然而,我刚刚做了这个:

(defn blah []
  (print "how")
  (print "now")
  (print "brown")
  (print "cow")
  (+ 1 1))

导致结果如下:

hownowbrowncow2

那么这个东西为什么还需要呢?
(注意保留HTML标签)
2个回答

4

一般来说,do 是一种特殊的形式,允许按顺序执行多个表达式,可能会产生副作用,因为 do 形式返回其最后一个表达式的评估结果,所以没有理由将其与纯函数一起使用。简单来说,你可以将 do 看作是非纯代码的某种包装器。在每个 Lisp 中都有这种形式的类似物,例如在 Common Lisp 中它被称为 progn

do 在以下宏中隐式使用:defn, when, when-not 等。

从实际角度来看,您可以在if语句中使用它(请参见Tomo的答案),并且在编写具有“body”参数的宏时非常方便(例如在defn函数的主体中)。


你有没有想过为什么 do 被实现为特殊形式而不是宏?我认为,实现这样一个宏非常容易... - neoascetic

2

您可以在表单中使用它,例如if,该表单仅采用单个s-exp作为“then”或“else”。

(if (= a b)
    (do (println "Yes") (something))
    (do (println "No") (something-else)))

2
我想补充一下,在defn(或when)中隐含了一个隐式的do操作。 - Thumbnail

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接