Syntax clojure需要语法原理

Syntax clojure需要语法原理,syntax,clojure,include,quoting,Syntax,Clojure,Include,Quoting,我很难理解(并因此记住)此处描述的clojure require语法:。这似乎既违反直觉又不统一 例如,在以下情况下,为什么需要引用此向量: (require '[clj-json.core :as json]) 违反直觉,因为通常向量在clojure中不被引用(列表被引用,向量被视为数据) 和非均匀性,因为在这种情况下,向量不被引用: (ns xxx (:require [clj-json.core :as json])) 我意识到,ns宏中的require函数和:require

我很难理解(并因此记住)此处描述的clojure 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))
有人能回答这些问题吗

  • 在第一个示例中,为什么需要引用向量
  • 为什么不需要在ns宏中引用它
  • 为什么列表符号不允许
    :as
  • 我想知道为什么事情是这样的,或者在设计时没有注意到不一致性

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

    这可能与您的直觉相反,但是引用向量(或贴图或集合)并没有什么错。我经常在REPL上快速测试某些东西,不想为地图或向量中的每个关键字键入
    ,例如:

    user=> '{a 1 b 2 c 3}
    
    而不是:

    user=> {:a 1 :b 2 :c 3}
    
    如果我只是想快速获取一些数据来测试一些东西,那么第一个输入速度会稍微快一些

  • 为什么不需要在ns宏中引用它
  • 宏不计算它们的参数,它们比普通函数调用要慢一些,因此不需要引用符号(
    clj json.core
    json

  • 为什么列表符号不允许:as
  • 对不起,我不知道这个问题的答案

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

    “下面将加载clojure.zip和clojure.set库 缩写为‘s’。”


    如果您还没有看到clojure开发列表,请查看它。我发现它提供了很多信息。好吧,在你解释之后,我才意识到,
    (require['clj-json.core:as'json])
    是有效的(无引号的向量),但需要引用两次而不是一次(可能是带引号的向量更可取的原因)。这个世界只需要有意义,然后我就可以接受它。是的,我实际上只是想用这个例子来编辑或评论它,认为它可能会有所帮助。有些东西仍然没有意义吗?在最后一个例子中,为什么不允许
    (require'(clj-json.core:as json))
    ?我认为允许这样做会使其他一些被接受的形式变得模棱两可或其他什么……这是一个非常晚的评论,但不允许使用
    (require'(clj-json.core:as json))
    的可能原因是
    require
    形式中的列表被用作。因此,
    (require'(clj-json.core:as json))
    将等同于
    (require'clj json.core.:as'clj json.core.json)
    ,这毫无意义。
    (require '(clojure zip [set :as s]))