【问题标题】:clojure require syntax rationaleclojure 需要语法原理
【发布时间】:2012-05-30 15:39:11
【问题描述】:

我很难理解(因此记住)这里描述的 clojure 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 函数和 ns 宏中的 :require 用法只是在光学上相似,但仍然如此。

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

(require '(clj-json.core))

但我不能这样做:

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

谁能回答这些问题:

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

我想知道为什么事情是这样的,或者是否在设计时没有注意到不一致。

【问题讨论】:

  • 如果您还没有看到,请查看 clojure-dev 列表中的 this thread。我发现它提供了很多信息。

标签: syntax clojure include quoting


【解决方案1】:
  1. 在第一个示例中,为什么需要引用向量?

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

这对您来说可能与直觉相反,但引用向量(或地图或集合)并没有错。我经常在 REPL 上快速测试一些东西,并且不想为 map 或 vector 中的每个关键字键入 :,例如:

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

而不是:

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

如果我只是想快速获取一些数据来测试某些东西,第一个输入速度会非常快。

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

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

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

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

啊,我查看了require 的文档并发现了。支持另一种形式:

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

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

【讨论】:

  • 好的,所以我刚刚意识到(在您的解释之后)(require ['clj-json.core :as 'json]) 有效(未引用的向量)但需要引用两次而不是一次(可能是为什么首选引用的向量)。这个世界只需要变得有意义,然后我就可以接受它。
  • 是的,我实际上正要编辑或评论该示例,认为它可能会有所帮助。有什么东西还是没有意义吗?
  • 最后一个例子为什么不允许(require '(clj-json.core :as json))?我认为允许这样做会使其他一些被接受的形式变得模棱两可……
  • 这是一个很晚的评论,但(require '(clj-json.core :as json)) 不允许的可能原因是require 表单中的列表被用作prefix lists。所以,(require '(clj-json.core :as json)) 将等同于 (require 'clj-json.core.:as 'clj-json.core.json),这没有任何意义。
猜你喜欢
  • 2023-04-08
  • 2011-05-04
  • 1970-01-01
  • 2022-08-05
  • 2021-08-04
  • 1970-01-01
  • 2023-03-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多