Clojure的需要语法理由(clojure require syntax rationale)

2019-07-29 15:44发布

我有一个很难理解(并因此记住)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]))

我认识到,需要功能和:require使用的NS宏内部只有光学相似,但仍。

还有古怪的其他作品还有,比如我可以这样做:

(require '(clj-json.core))

但我不能这样做:

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

有人能回答这些问题:

  1. 在第一个例子为何矢量需要加引号?
  2. 为什么它不需要在NS宏被引用?
  3. 为何列表表示不允许:as

我不知道是否有原因,事情会是这样的,或者如果不一致只是在设计时注意到。

Answer 1:

  1. 在第一个例子为何矢量需要加引号?

require是一个函数,所以你必须引用它们,以防止评价。 否则,这些符号将在当前背景下抬头,可能导致出现错误或可能意外行为。 顺便说一句,我认为这不太对劲:“反直觉的,因为通常向量不Clojure中引用(清单进行报价和载体被视为数据)。”

这可能是直觉上你,但有什么不妥报价载体(或地图或套)。 我经常在迅速在REPL测试的东西,不希望输入:在地图或载体,例如每个关键字:

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

而不是:

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

首先是非常稍快打字,如果我只是想快速得到一些数据来检验的东西。

  1. 为什么它不需要在NS宏被引用?

宏不评价他们的论据,这些人都有点懒比普通函数调用,因此符号( clj-json.corejson )不需要被引用,以防止评价。

  1. 为何列表表示不允许:作为?

对不起,我不知道这个问题的答案之一。

嗯,我看了看在文档的require和发现。 有支持的另一种形式:

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

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


文章来源: clojure require syntax rationale