clojure 要求语法原理

2024-05-16

我很难理解(因此记住)此处描述的 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 函数和:requirens 宏内部的用法只是在视觉上相似,但仍然如此。

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

(require '(clj-json.core))

但我不能这样做:

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

有人可以回答这些问题吗:

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

我想知道事情之所以如此,是否有原因,或者是否在设计时没有注意到不一致。


  1. 在第一个例子中为什么需要引用向量?

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

这对您来说可能是违反直觉的,但是引用向量(或映射或集合)没有任何问题。我经常在 REPL 上快速测试某些东西时这样做,并且不想输入:对于地图或向量中的每个关键字,例如:

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

而不是:

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

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

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

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

  1. 为什么列表表示法不允许 :as?

抱歉,我不知道这个问题的答案。

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

“以下内容将加载库 clojure.zip 和 clojure.set 缩写为‘s’。”

(require '(clojure zip [set :as s]))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

clojure 要求语法原理 的相关文章

  • Java:扩展类并实现具有相同方法的接口

    可能无法完成以下操作 我收到编译错误 继承的方法 A doSomthing int 无法隐藏 B 中的公共抽象方法 public class A int doSomthing int x return x public interface
  • 使用 CounterClockwise 和 Eclipse 在 Clojure REPL 中进行评估

    我通常使用 Emacs 但受到启发再次尝试 CCW Eclipse 我有一个 Clojure 测试项目 其源文件 src user clj 包含以下内容 ns user println hi 我有一个 REPL 我从 Window gt S
  • Clojure 集合与序列的相等性

    我注意到 Clojure 1 4 似乎很乐意考虑向量等于seq相同的向量 但同样不适用于地图 1 2 seq 1 2 gt true 1 2 seq 1 2 gt false 为什么要这样的行为 这样会有所不同吗 Clojure 的 可以认
  • 在 PHP 中将 CSV 写入不带括号的文件

    是否有本机函数或实体类 库用于将数组写入 CSV 文件中的一行而无需封装 fputcsv将默认为 如果没有为封装参数传入任何内容 谷歌让我失望了 返回一大堆有关的页面的结果 fputcsv PEAR 的库做的事情或多或少与fputcsv 工
  • 在 SPSS 中生成语法的语法

    我正在尝试构建一个语法来在 SPSS 中生成语法 但我遇到了一些问题 我有一个包含元数据的 Excel 文件 我想使用它来创建一个语法来从中提取信息 就像这样 如果我有一个巨大的数据库 我只需要保持 Excel 更新 添加 删除变量 等等
  • 为什么我收到无法动态绑定非动态变量?

    我正在尝试使用 clojure tools trace 命名空间的 dotrace 函数 dotrace my function my function 5 但我收到了这个错误 IllegalStateException 无法动态绑定非动态
  • Clojure:只能从尾部位置重复

    我正在尝试递归地反转列表 但是我得到了Can only recur from tail position运行时 这到底意味着什么 如何改进我的代码才能使其正常工作 defn recursive reverse coll loop coll
  • 您可以将操作直接应用于map/reduce/filter 中的参数吗?

    map and filter通常可以与列表理解互换 但是reduce并不那么容易被交换map and filter 此外 在某些情况下我仍然更喜欢函数语法 但是 当您需要对参数本身进行操作时 我发现自己正在经历语法体操 最终必须编写整个函数
  • pandas dataframe 对列进行排序会引发索引上的 keyerror

    我有以下数据框 df peaklatency snr 0 52 99 0 0 1 54 15 62 000000 2 54 12 82 000000 3 54 64 52 000000 4 54 57 42 000000 5 54 13 7
  • 这些 Python 符号是什么:“[ [] ] * n”和“(i,)”

    有人可以澄清一下Python中的这两个符号吗 n 显然这会创建对同一对象的 n 个引用 在本例中是一个空列表 这在哪些情况下有用 i 我看到有些人使用这种 尾随逗号 表示法 例如 生成 0 1 2 n 1 的所有大小为 k 的子集 http
  • javascript 函数后面括号中的值

    我正在尝试重新利用我在 SO 的答案中找到的一些 Javascript 代码 但我想首先更好地理解它的语法 其大纲是 function root ns factory some code window detectZoom function
  • 如何在 Jetty 中以编程方式设置 gzip?

    我正在使用 Noir 和 clojure 编写一个网络应用程序 它使用 Jetty Jetty 有两种使用 gzip 的方法 一种用于静态 一种用于动态 它们在https stackoverflow com a 9113129 104021
  • to_proc 方法在 Ruby 中意味着什么?

    我正在学习 Rails 并关注这个线程 https stackoverflow com questions 1961030 我被困住了to proc方法 我认为符号只是字符串的替代品 它们就像字符串 但在内存方面更便宜 如果我还缺少任何其他
  • Smarty 3 如何与 Zend Framework 2 一起使用?

    我很久以前就使用过 PHP5 目前正在尝试刷新我的知识 并通过 Zend Framework 2 和 Smarty 3 的知识来增强它 以实现一个可能的项目 我目前正在尝试弄清楚如何使用 Smarty 3 作为 Zend Framework
  • 为什么没有参数标识符的函数在 C++ 中有效?

    给定一个 C 函数 其参数仅为类型且没有标识符 void foo1 int int int cout lt lt called foo1 我可以这样称呼它 int main foo1 10 10 10 为什么这是 C 中的有效构造 这只是
  • Clojure 符号名称中的美元符号 ($)

    我一直在编写 clojure 解析器并遇到以下语法 defn key Returns the key of the map entry added 1 0 static true java util Map Entry e e getKey
  • Linux/Ubuntu 目录位置 ~/.vim/syntax/

    文件夹的默认位置在哪里 vim syntax 在Linux系统上 我正在尝试添加一个 Python 插件 您正在寻找 runtimepath 选项 该文档非常详细 使用 help runtimepath 但我会尝试在这里总结一下 The 运
  • webjure 与 compojure?

    我听说过两个基于 Clojure 的 Web 应用程序框架 Webjure 和 Compojure 有人可以告诉我哪个更好吗 现在您可以添加Ring http groups google com group clojure browse t
  • 我可以在 Java 8 中使用 Clojure 函数作为 Lambda 函数吗?

    我在 Clojure 中使用了许多库来生成符合 Clojure lang IFN https github com clojure clojure blob master src jvm clojure lang IFn java 界面 它
  • 判断字符串是否包含有效的javascript代码

    我正在寻找一个C 返回的函数true如果字符串包含有效的 JavaScript 语法 例如 IsValidJavascript alert hello 会回来true but IsValidJavascript alertXXhelloZ

随机推荐