我很难理解(因此记住)此处描述的 clojure require 语法:http://clojuredocs.org/clojure_core/1.3.0/clojure.core/require 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]))
我意识到 require 函数和:require
ns 宏内部的用法只是在视觉上相似,但仍然如此。
还有其他一些奇怪的事情,例如我可以这样做:
(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
and json
) 不需要引用来防止评估。
- 为什么列表表示法不允许 :as?
抱歉,我不知道这个问题的答案。
啊,我查看了文档require
并发现。支持另一种形式:
“以下内容将加载库 clojure.zip 和 clojure.set
缩写为‘s’。”
(require '(clojure zip [set :as s]))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)