【问题标题】:Why do `vector` and `[...]` sometimes behave differently in Clojure?为什么`vector`和`[...]`有时在Clojure中表现不同?
【发布时间】:2015-12-09 23:37:31
【问题描述】:

在 Clojure 中,方括号是定义向量的简写:

user=> (vector 'a 'b 'c)
[a b c]
user=> ['a 'b 'c]
[a b c]

The documentation page for vector 谈到了定义向量的长方法和短方法。

但是,defndoseq 似乎有所不同。

user=> (doseq [x (range 1 4)] (printf "%d\n" x)) 
1
2
3
nil
user=> (doseq (vector 'x (range 1 4)) (printf "%d\n" x)) 
IllegalArgumentException doseq requires a vector for its binding in user:1 clojure.core/doseq (core.clj:2935)

造成这种差异的原因是什么?方括号是否在读者中被赋予了特殊地位,或者它们是某种特定形式的糖?

【问题讨论】:

    标签: vector syntax clojure syntactic-sugar


    【解决方案1】:

    vector 在宏扩展之后进行评估,而[] 在读取时评估,在宏扩展之前。在第二种情况下,doseq 宏看不到向量,它看到一个以符号 vector 开头的列表,因为宏在计算常规函数之前已展开。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-01
      • 2020-04-22
      • 1970-01-01
      相关资源
      最近更新 更多