【问题标题】:Why does require in the ns form behave different from the require function为什么 ns 形式的 require 行为与 require 函数不同
【发布时间】:2010-09-15 16:58:54
【问题描述】:

当我需要 ns 表单中的库时,我得到:

test> (ns test (:require '(clojure.contrib [logging :as log] [sql :as sql]) ))
lib names inside prefix lists must not contain periods
[Thrown class java.lang.Exception]

当我使用 require 函数时,它按预期工作。

test> (require '(clojure.contrib [logging :as log] [sql :as sql]) )
nil

ns 的文档指的是 require 函数的文档,但由于它们的行为不同,这有点令人困惑。

【问题讨论】:

    标签: clojure


    【解决方案1】:

    ns 表单是一个宏,因此它不需要您使用 ' 来引用提供的序列。

    来自 Clojure 文档的示例:

    (ns foo.bar
        (:refer-clojure :exclude [ancestors printf])
        (:require (clojure.contrib sql sql.tests))
        (:use (my.lib this that))
        (:import (java.util Date Timer Random)
           (java.sql Connection Statement)))
    

    【讨论】:

    • 哎呀,又被这个“功能”咬了……谢谢!
    • 是的,不是很一致。不过,一般的指导原则是,使用 ns 而不是直接使用 import、require 等总是更好。您可能应该将单个表单视为低级原语,并专门使用 ns。
    • 令我惊讶的是宏不支持引用的形式以保持一致性。我必须深入研究这个晚上才能弄清楚为什么会这样。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-24
    • 1970-01-01
    • 2011-04-17
    • 2016-03-09
    • 2013-03-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多