【问题标题】:Why is do a special form?为什么是做一个特殊的表格?
【发布时间】:2015-10-27 17:54:40
【问题描述】:

在 Clojure 中,为什么do 是一种特殊的形式,而不是这样实现的函数?

(defn do [& exprs]
  (last exprs))

【问题讨论】:

  • 几乎是重复的,但对于 CL:stackoverflow.com/questions/17137542/…,虽然那里的答案不适用于这里。
  • 我错了吗,因为我看不出该代码如何等同于“do”...
  • @JustAnotherCurious 自己试试看。 :)

标签: function clojure special-form


【解决方案1】:

基本的顺序执行语义

fn(好吧,fn*)实际上重用了 do 背后的逻辑,就像其他带有正文的形式一样——let*、letfn*、try。由于其中有几个,因此让它们重用基本的“按顺序评估表达式”逻辑是有意义的;并且由于这本身对更复杂的特殊形式的上下文之外的用户代码很有用,因此将其公开为 do 是有意义的。

如果fn* 是基本的特殊形式,那么顺序评估表达式将涉及进行函数调用——这种低级工具的开销是不可接受的。

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

顶级do

此外,顶级dos 会被编译器特别处理

(do
  (foo)
  (bar))

在顶层(并且仅在顶层)等价于

(foo)
(bar)

——也就是单独写出的各个表达式。这允许宏输出(代码等价于)多个顶级表达式。

以这种方式解释对某些特殊函数的顶级调用并非不可能,但为此目的使用特殊形式会明显更简洁。

【讨论】:

猜你喜欢
  • 2010-09-13
  • 1970-01-01
  • 2013-03-21
  • 1970-01-01
  • 2013-06-12
  • 2011-11-18
  • 2019-02-03
  • 1970-01-01
  • 2011-03-27
相关资源
最近更新 更多