clojure需要语法基本原理

Kev*_*vin 17 syntax clojure include quoting

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

例如,在下面的原因中,为什么需要引用此向量:

(require '[clj-json.core :as json])
Run Code Online (Sandbox Code Playgroud)

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

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

(ns xxx 
    (:require [clj-json.core :as json]))
Run Code Online (Sandbox Code Playgroud)

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

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

(require '(clj-json.core))
Run Code Online (Sandbox Code Playgroud)

但我不能这样做:

(require '(clj-json.core :as json))
Run Code Online (Sandbox Code Playgroud)

有人可以回答这些问题:

  1. 在第一个例子中为什么需要引用向量?
  2. 为什么不需要在ns宏中引用它?
  3. 为什么列表符号不允许:as

我想知道为什么事情就是这样,或者是否在设计时没有发现不一致的原因.

mic*_*kig 11

  1. 在第一个例子中为什么需要引用向量?

require是一个函数,所以你必须引用它们以防止评估.否则,将在当前上下文中查找这些符号,可能导致错误或可能出现意外行为.顺便说一下,我认为这不太正确:"反直觉,因为通常在clojure中没有引用向量(列表被引用,向量被视为数据)."

这可能与你相反,但是引用向量(或映射或集合)没有任何问题.我经常在REPL上快速测试某些东西时做,并且不想为:地图或向量中的每个关键字键入a ,例如:

user=> '{a 1 b 2 c 3}
Run Code Online (Sandbox Code Playgroud)

而不是:

user=> {:a 1 :b 2 :c 3}
Run Code Online (Sandbox Code Playgroud)

如果我只是想快速获取一些数据来测试某些内容,那么第一种输入速度要快得多.

  1. 为什么不需要在ns宏中引用它?

宏不评估它们的参数,它们比普通函数调用更懒惰,因此不需要引用符号(clj-json.corejson)来阻止评估.

  1. 为什么列表符号不允许:as?

对不起,我不知道这个的答案.

啊,我看了一下文档require,发现了.还有另一种形式支持:

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

(require '(clojure zip [set :as s]))
Run Code Online (Sandbox Code Playgroud)

  • 好吧所以我刚刚意识到(在你的解释之后)`(require ['clj-json.core:as'json])`工作(未引用的向量)但需要引用两次而不是一次(可能为什么引用的向量是首选).世界只需要有意义,然后我就可以接受它. (3认同)
  • 这是一个很晚的评论,但不允许 `(require '(clj-json.core :as json))` 的可能原因是 `require` 形式的列表被用作 [前缀列表](http:/ /clojure.org/reference/libs#_prefix_lists)。所以,`(require '(clj-json.core :as json))` 将等价于 `(require 'clj-json.core.:as 'clj-json.core.json)`,这是没有意义的。 (2认同)