澄清Clojure“用作”语义

时间:2015-06-04 19:04:52

标签: clojure

(use '[clojure.string :as str])的效果似乎是将所有内容从clojure.string加载到当前命名空间而没有命名空间限定。 (use '[clojure.string :as str :only (join)])的效果似乎只是加载到当前名称空间中,使得{1}}前缀可以访问clojure.string名称空间的其余部分。有没有办法简单地使用str/前缀访问整个clojure.string命名空间,而不选择任何我想直接导入当前命名空间的名称?

2 个答案:

答案 0 :(得分:2)

require是引用其他命名空间的首选方法。您可以使用:as为您需要的命名空间提供前缀。您可以使用:refer将特定符号引用到命名空间中,而无需限定。如果要将所有符号导入命名空间,可以使用:all代替符号名称,但应限制其使用。

use不再使用太多而且被避免了,因为它使得更难理解不合格符号的来源。我甚至没有意识到use可以提供:as,它没有在文档字符串中列出。

答案 1 :(得分:0)

请注意,Clojure源代码文件与REPL中使用的格式不同,如果混淆了它们可能会造成混淆。在源代码文件中,使用ns宏:

(ns example.core
  (:require [clojure.string    :as str]
            [datomic.api       :as d] ))

所以我们使用:require 关键字(带冒号),并且命名空间规范向量是不加引号的。与您在repl上输入的内容相比:

(require '[clojure.string :as str])

我们调用require 函数(没有冒号),因此必须引用名称空间规范向量。