Clojure可以通过宏生成函数吗?

2023-12-19

我正在尝试通过宏生成 fn。但是我遇到了一个奇怪的问题。 代码在这里。

(defmacro test2 [lmk]
   (fn [lmk2] (println lmk lmk2)))
((test2 12) 13) ;;----->Error
(defmacro test3 []
   (fn [lmk] (println lmk)))
((test3) 12) ;;----->OK
(defmacro test4 []
   `(fn [lmk] (println lmk)))
((test4) 12) ;;----->Error

我知道 defn 可以很好地工作。我只是想知道为什么我不能在这里使用 defmacro。以及为什么 test3 工作良好,但 test2 失败。


在 test2 中,在编译之前,将调用 test2 宏(lmk 尚未编译或评估) - 因为没有语法引用,这实际上会评估 fn 形式并返回一个函数对象(lmk 关闭)。因此,您可以将表单 (fn-object 13) 传递给compiler,我认为这正在走一条意想不到的道路(不确定那到底是什么)。有趣的是,这有效:

(def f (test2 12))
(f 13)

在 test4 中,语法引用将导致每个 lmk 符号在命名空间中解析,因此这就是该错误的根源。你真的想要对这些进行 autogensyming:

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

Clojure可以通过宏生成函数吗? 的相关文章

  • 如何解构向量以用作函数参数

    在 Python 中 您可以将列表或元组传递给函数并让函数解压参数 我怎样才能在 Clojure 中做到这一点 下面是一些 Python 代码示例 def f a b c d print a a print b b print c c pr
  • 如何在 repl 中加载新的 clojure 库

    所以我有这个工作流程问题 我很高兴在我的 clojure 项目 repl 上打字 并意识到我需要另一个不在我的库中的库project clj 在这种情况下 我需要tools cli图书馆 我打开project clj在我的编辑器中添加一个条
  • 在 Android 上运行 Java 字节码 - DalvikVM 之上的 Sun JVM

    由于 java 实现 OpenJDK 和Android的虚拟机DalvikVM是开源的 因此必须可以在Google的DalvikVM之上实现Sun的JavaVM 这将使运行基于 JVM 的应用程序和语言成为可能 Clojure Jython
  • C++ 编译时类型注册技巧

    我有以下情况 假设我有一堆类型 函子 我想在编译期间注册 编译它们 最好是像 boost mpl vector 这样的东西 你知道有什么技巧可以做得很好吗 我的愿望是拥有实现函子类型和注册文件的 hpp 文件 其中宏将类型引入编译中 例如
  • Clojure 中的宏和函数

    我在这个 Clojure 教程中读到了以下行 http java ociweb com mark clojure article html Macros http java ociweb com mark clojure article h
  • Leiningen 在哪里安装 clojure 库?

    第一次运行lien 它会安装clojure 但是要安装吗 似乎并不在 图书馆 图书馆 lein clojure jar 和贡献 jar 在 Unix OS X 标题 上是否有固定位置 Leiningen使用maven 或者更准确地说 是实现
  • 调用 Clojure 高阶函数

    如果我定义一个返回如下函数的函数 defn add n n fn x x n 然后我可以将结果分配给一个符号 def add 1 add n 1 并称其为 add 1 41 gt 42 我如何调用结果 add n 1 而不将其分配给新符号
  • Objective-C:在哪里定义宏以便随处可用?

    我有一个 iOS 应用程序 它在许多视图控制器中使用相同的字符串 数字等 所以我认为最好在一个文件中定义这些常量并在所有视图控制器实现中使用它 优点是更改一个数字 我只需要做一次 而不是在所有视图控制器中都使用该数字 实际上 我的 h 文件
  • 用于解析 Rust 中的匹配臂的递归宏

    我正在尝试编写一个宏来将一组规则扩展为执行标记匹配的代码 但无法在不导致宏扩展错误的情况下生成正确的代码 我知道我可以通过其他方式处理这个问题 但这里的关键问题不是如何解析令牌 而是如何编写一个可以使用匹配臂递归扩展令牌树的宏 这个想法是我
  • 具有多个以逗号分隔的值的宏实际上意味着什么?

    当我在招聘过程中尝试进行技术考试时 我遇到了一个包含宏的问题 如下所示 define random 2 4 这是什么意思 如何为单个宏定义两个带有逗号的值 它实际上取代了所有出现的token https en cppreference co
  • 如何将目录添加到 Clojure 的类路径?

    我已使用 Maven 将库安装到 m2 repository 目录中 我想将该路径添加到默认的 Clojure 类路径中 我找不到如何执行此操作的文档 有什么提示吗 Cheers clj Clojure 1 4 0 user gt requ
  • 如何在 Access 2010 中创建自定义 ID

    这个问题的标题可能不准确 因为我不确定如何提出这个问题 有没有办法让 AC 2010 中的 ID 字段具有常量部分 然后是用户将输入的 ID 的一部分 示例 EMP9066 我希望 ID 的 EMP 部分始终保持不变 用户不应更改它 并且
  • Clojure 宏总是泄漏吗?

    如果你读过这个问题宏 gt 带有匿名函数 https stackoverflow com questions 10740265 macro with anonymous functions 10740411 comment13981517
  • 如何在数组类型上调度多方法

    我正在研究一种多方法 需要更新序列中一堆不同事物的哈希值 看起来相当简单 直到我尝试输入 X 数组的类型 defmulti update hash class 2 type byte 1 gt java lang Byte defmetho
  • 让宏“返回”一个值

    我正在使用宏 我认为它工作得很好 define CStrNullLastNL str char nl strrchr str n if nl nl 0 所以它可以将字符串中的最后一个换行符归零 实际上它用于在 fgets 留下的换行符上切断
  • 是否可以将预处理器条件放入 C 宏中?

    有没有办法编写一个 C 预处理器宏 根据它接收的参数扩展到不同的东西 define foo 1 foo name 2 foo 期望的结果 1 int name 2 ignore 是的 我知道宏是邪恶的 我问这个主要是出于好奇 为了扩展 Ga
  • 在vim中的所有缓冲区中运行宏

    我知道关于 bufdo命令 并试图将其与我录制的宏结合起来 a 在我加载的每个头文件的正确位置添加 include 但是 我找不到在每个缓冲区上运行宏的简单方法 有没有办法通过ex模式来执行宏 这就是 bufdo需要 或者我还缺少另一个命令
  • C 中的未命名参数

    在 C 中 与 C 不同 函数定义的所有参数都必须命名 而不是消除 未使用的参数 错误 void a 或公开使用 attribute unused 我创建了以下宏 define UNUSED2 var uniq UNUSED line va
  • 获取表达式类型的宏

    Question 我正在尝试编写一个 C 宏 它需要type or type name作为输入 并给出type作为输出 例如 REMOVE NAME int 应该int REMOVE NAME int aNumber 也应该是int 我设法
  • 如何匹配宏中的特征边界?

    我正在尝试匹配泛型类型的特征边界 macro rules test where bounded type ident bound tt gt Dummy expansion for test struct Foo

随机推荐

  • findViewById如何初始化视图

    我刚刚为那些被 findViewById 困惑的人写了一个答案 我意识到我的理解存在差距 这个问题只是出于知识和好奇心 考虑一下 button Button findViewById R id button findViewById返回一个
  • MySQL DATE_ADD 不起作用

    我有两列 开始时间和持续时间 我正在尝试计算结束时间 问题是我得到空结果 我已经尝试了几件事 DATE ADD startTime INTERVAL duration MINUTE AS endTime DATE ADD startTime
  • 将 pthread 作为输入并将其挂起的函数

    我正在尝试从 POSIX 中的 ExpressLogic 移植实时 Thread Metric 以便为我的论文对 Linux Xenomai 和 RTAI 的 PREEMPT RT 补丁进行基准测试 他们提供了一个具有以下函数的 C 源文件
  • 使用 Apache .htaccess 限制直接文件访问

    如何限制对每个具有 inc 的文件的直接访问 在文件名中 基本上我这样做是为了指出必须仅包含特定文件 已经使用 Apache 和 mod rewrite 来实现基本的 SEO 目的 这 有点 超出了我的知识范围 希望 htaccess 应该
  • Android Studio 上的省电模式未禁用

    我多次尝试在 Android Studio 1 2 1 1 上禁用省电模式以激活 Code Complete 功能 但没有禁用 我在 Windows 7 上运行工作室 可能是什么问题呢 请有人帮忙 你可以试试这个 您还可以检查文件菜单上的省
  • JavaScript 切换

    我制作了一个 JavaScript 函数来隐藏单击按钮时的链接及其在该函数中的工作 但是当它
  • 在参数数组中传递整数数组

    我正在尝试在 pg promise 的参数数组中传递参数数组 如建议的那样pg promise 文档 https github com vitaly t pg promise wiki Learn by Example passing ar
  • C++奇怪的问题,未定义的引用

    出现错误 neljastest cpp 对 Vector2 Vector2 float float 的未定义引用 内尔贾斯特 cpp include
  • 注入 EntityManager 对比实体管理器工厂

    一个很长的问题 请耐心等待 我们正在使用 Spring JPA 来构建 Web 应用程序 我的团队正在争论注射问题EntityManagerFactory in the GenericDAO APPFUSE 提供的基于 Generics 的
  • 是否可以向凸起按钮添加自定义悬停颜色?

    在处理一个使用 Material UI 组件库的项目时 我收到了一个自定义按钮悬停颜色的请求 该颜色超出了 MUI 主题的正常约定 我在 凸起按钮 源代码中找到了这个相关的代码块 https github com callemall mat
  • Spark SQL 中的 INSERT IF NOT EXISTS ELSE UPDATE

    Spark SQL 中是否有执行 INSERT IF NOT EXISTS ELSE UPDATE 的规定 我有 Spark SQL 表 ABC 其中有一些记录 然后我有另一批记录 我想根据它们是否存在于该表中来插入 更新该表中 我可以在
  • Matplotlib imshow() 翻转 x 和 y 轴

    我在用着pyplot with matplotlib 我想将一些数据显示为图像 当我使用imshow 数据与我想要的查看方式翻转 我如何切换 x 轴和 y 轴imshow 或到numpy在我将其发送到之前的数组imshow 即我希望水平轴是
  • 如何在 Xcode 中的 CALayer 上方制作按钮或标签?

    在我的故事板中 我添加了一个按钮和一个标签 在我的 ViewController 中 我以编程方式定义了一个 CALayer 并将其作为子层添加到 ViewController 的视图中 当我测试应用程序时 子层位于按钮和标签上方 但我想将
  • 无法在 Fedora 上安装 GDB

    如何在 Fedora Linux 机器上下载并安装 GDB GNU 调试器 我尝试从 gnu 网站下载 7 1 包 但在安装过程中失败 configure然后make命令 请分享我可以获得相关信息的来源 Thanks 我发现这个教程可能对安
  • 如何实现一个具有一次读取 4 位节点的二进制 trie?

    我正在尝试找到一种方法inline某种意义上的二进制字典树 基本上 二进制 trie 为二进制数中的每个槽都有一个节点 在 0 上向左分支 在 1 上向右分支 您将如何构造它以便一次读取 4 位而不是 1 似乎每个 trie 节点中有 16
  • 记录 Xamarin 未处理(Android 未捕获)异常

    我想记录未处理的异常 但我看到关于是否以及如何可能实现的信息存在冲突 我了解 Xamarin 提出了AndroidEnvironment UnhandledExceptionRaiser or AppDomain CurrentDomain
  • 了解 Python ReportLab 中的表坐标系

    我无法理解坐标系ReportLab表格样式 根据他们的文档 每个命令的第一个元素是其标识符 第二个和第三个参数确定单元格 受负坐标影响的单元格的坐标 从 Python 索引中的限制值 坐标给出为 列 行 紧随其后 电子表格 A1 模型 但不
  • RabbitMQ 消息传递 - 初始化消费者

    我想使用 RabbitMQ 将对象的状态连续广播给可能正在侦听的任何消费者 我想对其进行设置 以便当消费者订阅时它将获取最后一个可用状态 这可能吗 使用自定义最后值缓存交换 例如https github com squaremo rabbi
  • 无法在 Mac OS 10.8 中从终端使用 svn 命令

    Team SVN 命令在终端中运行良好 我已经卸载并安装了最新版本的 svnclient 从那时起 我无法从我的 mac 终端访问 svn 命令 以下是我在终端中看到的错误消息 dyld 未加载库 opt local lib libssl
  • Clojure可以通过宏生成函数吗?

    我正在尝试通过宏生成 fn 但是我遇到了一个奇怪的问题 代码在这里 defmacro test2 lmk fn lmk2 println lmk lmk2 test2 12 13 gt Error defmacro test3 fn lmk