为什么要做一个特殊的表格?

Sam*_*tep 6 function clojure special-form

在Clojure中,为什么是do一个特殊的形式,而不是像这样实现的功能?

(defn do [& exprs]
  (last exprs))
Run Code Online (Sandbox Code Playgroud)

Mic*_*zyk 6

基本的顺序执行语义

fn(当然,fn*)实际上重用背后的逻辑do,因为这样做等形式与机构- ,let*,.letfn* try由于存在其中的几个,因此让它们重用基本的"按顺序计算表达式"逻辑是有意义的; 并且由于这本身对于更复杂的特殊形式的上下文之外的用户代码是有用的,因此将其公开为有意义do.

如果fn*是基本的特殊形式,顺序计算表达式将涉及进行函数调用 - 这种开销对于这种低级设施是不可接受的.

(另一方面,用隐式dos中包裹它们的主体的宏替换其他特殊形式不会引入任何开销.然而,在Clojure编译器的上下文中,它也不会是一个巨大的胜利 - 在至少这一点已经相当干了.)

顶层 do

此外,顶级dos由编译器专门处理

(do
  (foo)
  (bar))
Run Code Online (Sandbox Code Playgroud)

在顶级(并且仅在顶级)相当于

(foo)
(bar)
Run Code Online (Sandbox Code Playgroud)

- 也就是说,单独写出的个别表达.这允许宏输出(代码相当于)多个顶级表达式.

以这种方式解释对某些特殊功能的顶级调用是不可能的,但是为此目的使用特殊形式是非常清晰的.