clojure需要语法基本原理

时间:2012-05-30 15:39:11

标签: syntax clojure include quoting

我很难理解(并因此记住)clojure需要语法:http://clojuredocs.org/clojure_core/1.3.0/clojure.core/require。它似乎既反直观又不统一。

例如,在下文中,为什么需要引用此向量:

(require '[clj-json.core :as json])

反直觉,因为通常在clojure中引用向量(引用列表并将向量视为数据)。

并且不均匀,因为在这种情况下,矢量未被引用:

(ns xxx 
    (:require [clj-json.core :as json]))

我意识到ns宏中的require函数和:require用法只是光学上相似,但仍然如此。

还有其他一些古怪的东西,例如我可以这样做:

(require '(clj-json.core))

但我不能这样做:

(require '(clj-json.core :as json))

有人可以回答这些问题:

  1. 在第一个例子中为什么需要引用向量?
  2. 为什么不需要在ns宏中引用它?
  3. 为什么列表符号不允许:as
  4. 我想知道为什么事情就是这样,或者是否在设计时没有发现不一致的原因。

1 个答案:

答案 0 :(得分:11)

  1. 在第一个例子中为什么需要引用向量?
  2. require是一个函数,因此您必须引用它们以防止评估。否则,将在当前上下文中查找这些符号,可能导致错误或可能出现意外行为。顺便说一句,我认为这不太正确:"反直觉,因为通常在clojure中引用向量(引用列表并将向量视为数据)。"

    这可能与您相反,但引用向量(或地图或集合)并没有错。我经常在REPL上快速测试某些内容时做,并且不想为地图或向量中的每个关键字键入:,例如:

    user=> '{a 1 b 2 c 3}
    

    而不是:

    user=> {:a 1 :b 2 :c 3}
    

    如果我只是想快速获取一些数据来测试某些内容,那么第一个输入的速度会非常快。

    1. 为什么不需要在ns宏中引用它?
    2. 宏不评估他们的论点,他们比正常的函数调用更懒惰,因此符号(clj-json.corejson)不需要引用以防止评估。

      1. 为什么列表符号不允许:as?
      2. 对不起,我不知道这个的答案。

        啊,我看了require的文档,然后发现了。还支持另一种形式:

        "以下内容将加载库clojure.zip和clojure.set 缩写为' s'。"

        (require '(clojure zip [set :as s]))