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 要求语法原理 的相关文章

  • 内存数据存储中有 Clojure 吗?

    我主要在 Node 中编程 并且喜欢文档存储 但我想首先对客户端和服务器之间的数据调用进行原型设计 我用过lowdb https github com typicode lowdb and da base https github com
  • 如何使用clojure中的map函数打印哈希映射列表的每个元素?

    我正在构建一个哈希映射列表 然后将其传递给另一个函数 当我尝试使用打印列表中的每个哈希映射时map它不工作 我可以打印完整列表或获取第一个元素等 defn m a println a map println a 以下仅适用于 repl m
  • 包含重复键的字典文字是否定义良好?

    如果我写d 0 1 0 2 Python 是否保证d 0 或者是 未定义的行为 当然 这不是你想要的ever编程时写的 不过这个问题大多是出于好奇 在本地 它似乎总是保存与该键最后一次出现关联的值 即2这里 不过 对于一些奇怪的代码生成情况
  • “敌人”不是在这个范围内宣布的吗?

    好的 这就是我的错误 Enemy 未在此范围内声明 错误位于 map h 文件中 即使 map h 包含敌人 h 如图所示 ifndef MAP H INCLUDED define MAP H INCLUDED include
  • Clojure MySQL 语法错误异常(“[...] 靠近 '???????????????' [...]”)

    除了建立连接之外 我在使用 clojure contrib sql 做任何事情时都遇到困难 我有一个 mysqld 在 localhost 3306 上运行 数据库名为clj db 用户 clj user localhost 和密码 clj
  • 在 fortran 子例程中包含 c/c++ 头文件

    我有一个用 C C 编写的库 其开发人员声明该库具有 Fortran 接口 该接口将被启用 包括头文件 h 并调用经典子例程 我想编译我的 Fortran 程序并链接该库 该库已经过测试并且可以工作 这是主程序 Main program I
  • VHDL - ror 和 rol 操作

    我怎么解决这个问题 reg 变量定义为 signal reg STD LOGIC VECTOR 7 downto 0 00000001 下面代码中ror操作有问题 错误信息是 Line 109 Syntax error near ror L
  • 如何迭代 Bash 中变量定义的数字范围?

    当范围由变量给出时 如何在 Bash 中迭代数字范围 我知道我可以做到这一点 在 Bash 中称为 序列表达式 文档 http www gnu org software bash manual bashref html Brace Expa
  • 与 Perl 和 Ruby 比较的相似语言特性 __END__

    背景 Perl 和 Ruby 有 END and DATA 允许将任意数据直接嵌入源代码文件中的标记 尽管这种做法可能不适合通用编程用途 但它对于例行任务的 一次性 快速脚本非常有用 问题 还有哪些其他编程语言支持相同或类似的功能 它们是如
  • 如何解构向量以用作函数参数

    在 Python 中 您可以将列表或元组传递给函数并让函数解压参数 我怎样才能在 Clojure 中做到这一点 下面是一些 Python 代码示例 def f a b c d print a a print b b print c c pr
  • Clojure 的分析工具?

    有谁知道 Clojure 有一个好的分析工具或库吗 我更喜欢可以从 REPL 中使用的东西 类似于 with profiling 过去是在 Allegro Common Lisp 中 有什么类似的事情吗 或者您是否有过与 Clojure 配
  • 从外部 clojar 导入/使用资源

    我想做的是将一个大文件 MIDI 声音字体 打包到一个独立的 Maven repo clojar 中 然后能够以编程方式将其拉下来并从单独的项目中使用它 事实证明 这个看似简单的任务比我想象的要复杂 理想的情况是 如果有一种方法可以直接访问
  • 全局变量的问题

    我在 PHP 中包含页面时遇到问题 图片显示了我想做的事情 我想在我的 index php 页面中包含水平和垂直菜单 但现在我只能包括其中之一 在 global php 中有数据库名称 密码和定义我现在使用的语言的变量 我包含了所有衍生词
  • 将嵌套映射分解为键值对

    我想将 Clojure 中的嵌套映射分解为一系列键值对 例如 我们有这张地图 a b c d e f g h i j 分解后的地图应如下所示 a b c d e f g h i j d e f g h e f g h i j 输出的顺序并不
  • 我在 php 中执行的这个 include 语句有什么问题吗? [关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 我希望这篇文章发布在我的网站上 但它给出了错误 解析错误 语法错误 第 1 行 opt lampp htdocs whi
  • 在 Clojure 中的函数上使用“apply”时,如何显式指定名称空间?

    这里的 graph 是高阶函数 它返回一个在其范围内设置了配置的函数 ns bulbs neo4jserver graph defn out1 Test func that simply returns out1 config out1 d
  • SyntaxError:创建类实例时语法无效[关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我在 Python shell 3 3 2 中运行这段代码 但它给了我SyntaxError invalid syntax cla
  • 如何将 clojure Web 应用程序部署到 Amazon EC2(AWS Elastic Beanstalk + Leiningen + Compojure + Ring + Tomcat)

    如题 我的IDE是intellij idea 12 1 4 我需要什么工具包或插件才能 将 Clojure Web 应用程序部署到 Amazon EC2 有任何链接或参考或分步解决方案吗 谢谢 如果您只是部署一个 war 文件 没有其他自定
  • 大括号语法 ${var%.*} 是什么意思?

    我正在查看一些旧代码并遇到了以下语法 extractDir downloadFileName tmp 我发现搜索的唯一信息是指命令列表 但这只是一个变量 这个大括号语法在 bash 中意味着什么 在这种背景下 它是一个参数替换 http w
  • 在yaml中写入#(在字符串中)

    我是新使用 yml 文件 用于我的框架中的翻译 我试图在翻译中添加一个 将是一个推特分享 blabla 这可能吗 因为文件将其翻译为评论 只需将值放在单引号或双引号内 它就不会被视为注释 就像是 en twitter share hasht

随机推荐