如何在 Clojure 中获取参数名称?

2023-12-06

我想从函数内部获取函数外部定义的 var 的名称。该名称应该是我在原始定义范围内使用的名称,而不是我实际尝试使用该名称的任何嵌套绑定。

所以我想做一些类似的事情(学术示例):

(defn f1 [x1] (println "hello, you passed var name >>" (get-var-name x1) "<<")
(defn f2 [x2] (f1 x2))
(defn f3 [x3] (let [zzz x3] (f2 zzz))
(def my-var 3.1414926)
(f3 my-var)
user> hello, you passed var name >>my-var<<

我可以根据我发现的一些东西来执行这个宏:

(defmacro get-var-name [x]
  `(:name (meta (var ~x))))

当从 REPL 调用时,这可以工作,但是当从“内部”范围调用时,编译器会阻塞,例如

(defn another-func [y]
  (get-var-name y))

编译器显示“无法解析 var y”。(macroexpand...)显示它试图在当前命名空间中查找局部变量 y,而不是当前命名空间中的原始变量。我认为(var...) 仅查找命名空间变量,因此这会阻止宏在函数或另一个绑定(例如let.

I think我不得不从定义变量的同一范围手动获取变量名称并将其作为额外参数传递。是否有一种更优雅的方法来通过绑定链将 var 名称信息传递到使用它的地方?那可就太糟糕了。

thanks


无法获取外部作用域中使用的 var 的名称在函数内- 该函数仅接收value在运行时作为参数传递,而不是 var 本身。

您唯一可以做的就是在每个级别使用宏而不是函数。这允许您在编译时通过不同的宏传递 var 本身:

(defmacro f1 [x1] `(println "hello, you passed var name >>" ~(str x1) "<<"))
(defmacro f2 [x2] `(f1 ~x2))
(defmacro f3 [x3] (let [zzz x3] `(f2 ~zzz)))

(f3 my-var)
=> hello, you passed var name >> my-var <<

这非常丑陋 - 您当然不希望仅仅为了获得此功能而使用宏编写所有代码!尽管在某些特殊情况下这可能是有意义的,例如如果您正在创建某种基于宏的 DSL。

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

如何在 Clojure 中获取参数名称? 的相关文章

  • Google Test 宏似乎不适用于 Lambda 函数

    所以 我有以下代码 无论 Interpolator 类的细节是什么 在这种情况下它都不应该抛出异常 这就是我想要测试的 TEST errorhandlingInterpolator toolargeInput const size t nu
  • var 与具体类型的使用[重复]

    这个问题在这里已经有答案了 我已经在 stackoverflow 中检查了 5 个或更多关于 var 使用的帖子 但我仍在寻找有关 var 使用的答案 我习惯使用 Concrete 类型而不是 var 但是我的 Resharper 抱怨要更
  • Clojure 中的快速素数生成

    我一直在努力解决欧拉计划 https projecteuler netClojure 中的问题得到了改善 我已经遇到过几次素数生成问题 我的问题是它花费的时间太长了 我希望有人能帮助我找到一种有效的方法 以 Clojure 的方式做到这一点
  • Common Lisp 反引号/反引号:如何使用?

    我在使用 Lisp 的反引号读取宏时遇到问题 每当我尝试编写一个似乎需要使用嵌入式反引号的宏时 例如 w x y 来自保罗 格雷厄姆的ANSI 通用 Lisp 第 399 页 我不知道如何以编译的方式编写代码 通常 我的代码会收到一整串错误
  • 如果未定义则跳过函数调用

    我有一个由不同模块组成的程序 模块通过函数调用互连 例如 State Init 调用各个模块的 init 函数 应可以禁用模块 从编译中排除 最简单的方法是使用预处理器定义 但这会生成大量代码 IF MODULE XXX COMPILE r
  • 为什么这个 Clojure 程序在可变数组上运行如此慢?

    剧透警告 这是 代码降临 第六天的第一部分 我试图解决this http adventofcode com day 6Clojure 和 Scala 中的问题 Scala 程序在我的 Macbook Air 上运行良好 几秒钟内就完成了 然
  • C 相当于 C++ decltype

    在我的 C 项目中 有一个由另一位同事创建的结构体 其中包含一些函数指针 struct tools int tool a int int int 我无权更改此结构和相关文件 现在我正在使用该结构进行编码 我必须定义一个函数 其返回类型和参数
  • 最好的 AutoHotKey 宏? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 在 Android 上运行 Java 字节码 - DalvikVM 之上的 Sun JVM

    由于 java 实现 OpenJDK 和Android的虚拟机DalvikVM是开源的 因此必须可以在Google的DalvikVM之上实现Sun的JavaVM 这将使运行基于 JVM 的应用程序和语言成为可能 Clojure Jython
  • 调用 Clojure 高阶函数

    如果我定义一个返回如下函数的函数 defn add n n fn x x n 然后我可以将结果分配给一个符号 def add 1 add n 1 并称其为 add 1 41 gt 42 我如何调用结果 add n 1 而不将其分配给新符号
  • 如何在 REPL 中显示 Clojure 中函数的定义?

    我正在寻找让 REPL 打印函数当前定义的能力 有什么办法可以做到这一点吗 例如 给定 defn foo if true true 我想说类似的话 print definition foo 并得到一些类似的东西 foo if true tr
  • Common Lisp 中的原子和 Clojure 中的原子有什么区别?

    下列page http clojure org atoms讨论原子在 Clojure 中的工作原理 它并没有详细说明 Clojure 和其他 lisp 方言中原子之间的差异 Common Lisp 中的原子和 Clojure 中的原子之间的
  • 浏览器显示 clojure 环中不存在 access-control-allow-origin 标头

    我通过客户端浏览器向服务器发出请求 如下所示https example com bar https example com bar 但出现错误 Access to XMLHttpRequest at https example com ba
  • Rust 中声明变量的宏?

    在 C 中 可以编写声明变量的宏 如下所示 define VARS a b c int a b c 当然 这不是您通常想要做的事情 在实际的例子中 我希望开始工作 但它并不那么简单 define VARS data stride a b c
  • 如何将目录添加到 Clojure 的类路径?

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

    为什么该语言的名称是 Clojure 我用谷歌搜索了一下 在 clojure 中询问 到目前为止 还没有运气 Rich Hickey 他是 Clojure 的设计者 对此的评论是 wiki 上的第一个参考链接 您是否根据以 closure
  • 如何在 Access 2010 中创建自定义 ID

    这个问题的标题可能不准确 因为我不确定如何提出这个问题 有没有办法让 AC 2010 中的 ID 字段具有常量部分 然后是用户将输入的 ID 的一部分 示例 EMP9066 我希望 ID 的 EMP 部分始终保持不变 用户不应更改它 并且
  • 使用 clojure read/read-string 函数,我如何将 .clj 文件读入对象列表

    正如标题 如果我这样做 read string slurp somefile 这只会给我文件中的第一个对象 这意味着如果 somefile 如下所示 a obj b obj 然后我只得到 a obj 作为结果 我如何获得所有对象的列表 像这
  • 如何在数组类型上调度多方法

    我正在研究一种多方法 需要更新序列中一堆不同事物的哈希值 看起来相当简单 直到我尝试输入 X 数组的类型 defmulti update hash class 2 type byte 1 gt java lang Byte defmetho
  • 协议中的提示返回类型在 Clojure 中是否有任何影响?

    您可以在协议中暗示返回类型 defprotocol Individual Integer age this 并且编译器将使您的方法符合 defrecord person Individual String age this one Comp

随机推荐

  • 将 xterm 嵌入到 QWidget 中并与其通信

    我想嵌入一个xterm into a pyqt4小部件并与其进行通信 特别是我希望能够打印到它并在其上执行命令 这样在执行命令后它会像普通 shell 一样返回到普通用户提示符 考虑以下最小示例 我怎样才能让它发挥作用 usr bin en
  • 无法通过EC2实例中的公共IP访问我的elasticsearch

    我已经在我的EC2实例上部署了elasticsearch 7 3版本 服务 当我安装后curl localhost 9200它给了我正确的响应 但是当我通过点击请求访问相同的服务时 http public ip address ec2 in
  • jdbc 小程序出现 NoClassDefFoundError

    我使用 Eclipse 创建了一个小程序 package gui public class MyApplet extends JApplet 该小程序需要两个外部 jar proj jar 和 firebirdsql full jar jd
  • Oracle SQL 触发器自动设置列值

    我正在写一个Oracle触发器 该触发器应自动将 productId 列的值设置为刚刚插入的行的 oid 我写的触发器是 create or replace trigger MyProduct id trg after insert on
  • gnuplot 上的 x 轴值

    我正在使用 gnuplot 我的数据集如下所示 1 0 530000 0 510000 2 0 420000 0 310000 4 0 400000 0 160000 8 0 390000 0 070000 16 0 390000 0 04
  • 信用卡号码验证器无法正常工作

    def checksum card without check card without check card without check 1 1 def numbers string return int x for x in strin
  • 在 Bash 中从 $PATH 变量中删除路径的最优雅的方法是什么?

    或者更一般地说 如何从 Bash 环境变量中以冒号分隔的列表中删除项目 我以为几年前我已经看到了一种简单的方法 使用更高级的 Bash 变量扩展形式 但如果是这样 我已经忘记了它 谷歌的快速搜索令人惊讶地发现很少有相关结果 而且没有一个我称
  • 具有 ObservableCollection 和 INotifyPropertyChange 的 Json.Net 类层次结构被序列化但未反序列化

    我发现自己对此有点迷失 老实说 如果只是类结构与 JSON 错误不匹配 我真的看不到错误 但我对此表示怀疑 因为它与我用来创建 JSON 的类结构完全相同 如果有人能指出我正确的方向 我将不胜感激 我创建了一个 dotnetfiddle 以
  • 当 UIAlertController 处于活动状态时,VoiceOver Z 手势不会触发

    我正在尝试使用 Z 手势来关闭 UIAlertController 我有一个非常简单的应用程序 它有一个带有 1 个按钮的单一视图 点击按钮会出现警报 我已经实施了 BOOL accessibilityPerformEscape NSLog
  • 如果在框列表上单击,如何添加选定的按钮?

    我从这里得到参考 https bootstrap vue js org docs components card card groups https bootstrap vue js org docs components button p
  • 在 C# 中从 C++ 代码中获取对象功能

    我有一个用 C 编写的函数 它调用旧库中的一些函数 该函数创建一些内存 进行调用并销毁内存 为了优化这一点 我将创建一个对象 该对象将保留分配的内存 直到该对象被销毁 不过 我将从 C 调用此函数 并且不相信我可以导出类 而只能导出函数或变
  • 如何在 C# Asp.net 中取消注册 Page.ClientScript

    我正在将 java 脚本注册到我的 Asp net 代码隐藏文件中 该文件工作正常 现在 我在同一页面上有一些更新面板 问题是每当任何更新面板中有任何更改时 都会自动调用此脚本 有什么办法可以阻止这种情况发生吗 我无法从我的页面中删除更新面
  • 如何在PHP中显示或预览上传的图像,而不保存到数据库?

    我的项目实际上涉及2个页面 第1页是一个表单 用于将上传的图像提交到第2页action 2page php 并将显示和预览图像 它应该在客户端服务器上运行 这意味着不涉及将图像文件保存到其中并将特定图像检索回我想要执行的页面的数据库 实际上
  • WELD-001409 不明确的依赖关系

    我想将我的 ejb ProfileEJB 注入到我的 jsf 托管 bean SampleController 中 如下所示 Stateless LocalBean public class ProfileEJB PersistenceCo
  • 我想创建一个 DeskBand。我必须使用 C++ 吗?

    我想创建一个 DeskBand 来在 Windows 任务栏上显示一些信息 但我正在努力在 C 中实现我需要的功能 我接触C 已经有10 15年了 过去 7 年我一直在 NET 中工作 在你说之前 我知道 DeskBands 已被弃用 但建
  • 在 pandas 中保存跳过行并读取 csv

    我有一个清单跳过行 说 1 5 10 gt 行号 当我将其传递给熊猫read csv 它会忽略这些行 但是 我需要将这些跳过的行保存在不同的文本文件中 我浏览了 pandas read csv 文档和其他几篇文章 但不知道如何将其保存到文本
  • 使用 Java URLConnection 进行 Cookie 管理

    我对 android 编程相当陌生 最近成功实现了 HTTP Post 请求 却发现我的 cookie 没有存储在后续的 Post Get 请求之间 我浏览了互联网 找到了一些 Android 的 Apache 客户端和 Java 的 Ht
  • Facebook Like 按钮,用于来自其自己的 ios 应用程序的应用程序的一个 Facebook 页面

    我正在寻找在我的 ios 本机应用程序中显示 Like 按钮 该应用程序的用户已经通过 Facebook 帐户连接到应用程序 stackoverflow 上有几个与 Facebook Like Button 相关的问题 但这些问题并不特定于
  • 可以在一页上使用相同的 schema.org 标记两次吗?

    在产品页面上 我在不同位置对一种产品有两个聚合评级 这意味着它们包含相同的信息 由于用户体验原因 我希望在该页面上出现两次 但我不确定是否可以每次都使用 schema org 标记它们 或者这是否是无用的重复 想知道是否有解决方案itemr
  • 如何在 Clojure 中获取参数名称?

    我想从函数内部获取函数外部定义的 var 的名称 该名称应该是我在原始定义范围内使用的名称 而不是我实际尝试使用该名称的任何嵌套绑定 所以我想做一些类似的事情 学术示例 defn f1 x1 println hello you passed