朱莉娅交换有什么问题!宏?

2023-12-23

我正在尝试写一个简单的swap!Julia 中的宏,了解宏系统。到目前为止,这是我的代码:

macro swap!(x, y)
    quote
        local tmp = $(esc(y))
        $x = $(esc(y))
        $y = tmp
    end
end

a = 1
b = 2

@swap!(a, b)

# prints: a: 1, b: 2
println("a: $a, b: $b")

这运行时没有错误,但实际上并没有更改值。 Julia 似乎没有一个只扩展宏而不执行它们的函数(据我所知),所以这很难调试。

REPL 中的等效引用似乎按预期工作:

julia> a = 1
1

julia> a_sym = :a
:a

julia> a_sym
:a

julia> b = 2
2

julia> b_sym = :b
:b

julia> eval(quote
       tmp = $a_sym
       $a_sym = $b
       $b_sym = tmp
       end)
1

julia> a
2

julia> b
1

我究竟做错了什么?


我想你可能想要像下面这样的东西,但被搞乱了hygiene http://julia.readthedocs.org/en/latest/manual/metaprogramming/#hygiene。诀窍是正确逃脱。

macro swap(x,y)
   quote
      local tmp = $(esc(x))
      $(esc(x)) = $(esc(y))
      $(esc(y)) = tmp
    end
end

这是扩展后的样子

julia> macroexpand(quote @swap(x,y) end)
quote  # none, line 1:
    begin  # none, line 3:
        local #189#tmp = x # line 4:
        x = y # line 5:
        y = #189#tmp
    end
end

效果

julia> x
1

julia> y
2

julia> @swap(x,y)

julia> x
2

julia> y
1

相比之下,您的宏在一个赋值中正确地转义了 y,但在其他 2 个语句中却没有转义,因此设置了引入变量的值,而不是预期的 x 和 y。

julia> macroexpand(quote @swap!(x,y) end)
quote  # none, line 1:
    begin  # none, line 3:
        local #208#tmp = y # line 4:
        #209#x = y # line 5:
        #210#y = #208#tmp
    end 
end
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

朱莉娅交换有什么问题!宏? 的相关文章

  • 从 Julia 中的文本文件读取数据矩阵

    我有一个包含矩阵的文本文件 我想在朱莉娅中将其作为矩阵来阅读 文本文件如下 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0 0 0 1 1 0 在 matlab 中 您可以执行以下操作来创建矩阵M
  • 如何在 Julia 中保存文件

    在某些时候 我认为 Julia v0 7 你可以做 save savepath thingtosave为了使用 Julia 保存文件 我尝试在 v0 7 上运行它 看看是否收到弃用警告 但即使在 0 7 上 它也说 save未定义 如何使用
  • 如何驯服 Windows 标头(有用的定义)?

    在其中一个答案中this https stackoverflow com questions 1394132 macro and member function conflict问题jalf https stackoverflow com
  • 获取参数类型的参数

    假设我定义了一个这样的类型 type Point Tx Ty end 然后我创建一个这种类型的变量 例如 a Point Int64 something 现在 我只知道我可以获得以下类型a by typeof a 那是 Point Int6
  • 并行模拟写入同一文件

    我的目标是在集群上并行运行 10 000 个左右的 Julia 编码模拟 每个模拟独立于所有其他模拟 每个模拟都有一个要输出的数字 以及有关哪个模拟产生该数字的 3 列信息 因此 强制每个模拟打印在单独的文件上对我来说听起来有点愚蠢 我可以
  • 使用另一个宏(c 预处理器)生成宏的名称[重复]

    这个问题在这里已经有答案了 我可以使用宏生成函数的名称 该宏取自生成函数名称的 C 预处理器定义 https stackoverflow com questions 1253934 c pre processor defining for
  • Julia:将数组数组转换为二维数组

    我有一个数组d包含一个浮点数组 julia gt d 99 element Array Array Float64 1 1 我正在尝试将其转换为二维数组 并且我成功地实现了我的目标 data Array Float64 length d l
  • 我的钳位宏有问题

    我的钳位宏有问题 当我的值超过 10 并且我的最高值超过 17 时 它会停止工作 任何想法 define CLAMP value low high value lt low low value gt high high value 我建议使
  • 在 Julia 中解压缩元组数组

    假设我有一个元组数组 arr 1 2 3 4 5 6 使用 python 我可以做zip arr 1 3 5 2 4 6 朱莉娅中与此等效的是什么 作为 splatting 的替代方案 因为这非常慢 您可以执行以下操作 unzip a ma
  • 在 scala 宏中使用 LabelDef (2.10)

    我正在尝试 scala 2 10 宏功能 我使用时遇到问题LabelDef但在某些情况下 在某种程度上 我偷看了编译器的代码 阅读了摘录米格尔 加西亚的论文 http lampwww epfl ch magarcia但我还是卡住了 如果我的
  • 朱莉娅在矩阵中查找(行,列)而不是索引

    在 Julia 中 您可以通过以下方式找到矩阵中元素的坐标 julia gt find x gt x 2 1 2 3 2 3 4 1 0 2 3 element Array Int64 1 2 4 9 这些值是正确的 但我更希望得到 row
  • 如何编写 Clojure 宏来从字符串创建正则表达式?

    我正在创建一个方便的宏 部分便利在于可以仅使用字符串来指定正则表达式 而不是使用 re 表示法 我无法弄清楚的一部分是如何让宏获取字符串并将其重写为 Clojure 正则表达式 例如 生成 re 符号 我认为这是一个语法 转义问题 我的第一
  • 在 clojure 中,使用递归实现宏时如何进行代码模板化

    我正在尝试实现一个宏 以递归地将中缀列表转换为前缀列表 我遇到一个问题如下 this works defmacro recursive infix form list second form first form if not seq nt
  • 在 Julia 中保存和检索字典的正确方法是什么?

    我已经看到 Julia 充分解释了 MAT 文件 这些文件中的结构可以毫无问题地作为字典读取 现在我创建了自己的字典 其结构如下 String String gt Int Int Int 在每个条目上 我可以保存它writedlm它产生了一
  • 使用 Pkg.add 时出现 julia 错误

    我刚刚在ubuntu中安装了julia 在添加包时发现了一些问题 julia gt Pkg Add Gadfly ERROR UndefVarError Add not defined 我也尝试更新 julia 但弹出错误 julia gt
  • 内联函数与预处理器宏

    内联函数与预处理器宏有何不同 预处理器宏只是应用于代码的替换模式 它们几乎可以在代码中的任何地方使用 因为在任何编译开始之前它们都会被替换为扩展 内联函数是实际函数 其主体直接注入到其调用站点中 它们只能在适合函数调用的地方使用 现在 就在
  • 如何终止 Julia 中的任务/协程?

    using HttpServer http HttpHandler do request Request response Response show request Response Hello there end http events
  • Julia 中基准和时间宏的区别

    我最近发现两个宏之间存在巨大差异 benchmark 和 time 在内存分配信息和时间方面 例如 benchmark quadgk x gt x 0 1 BenchmarkTools Trial memory estimate 560 b
  • 如何将缺失值插入到 Julia 的数据框中

    df3 10 A missing df3 15 B missing df3 15 C missing 即使 NA 也不起作用 我收到错误 方法错误 不能convertMissings Missing 类型的对象到 Int64 类型的对象 这
  • 如何使用 Julia 查找矩阵中的连通分量

    假设我有以下矩阵 此处用 Julia 语言定义 mat 1 1 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 1 1 将一组值为 1 的相邻元素视为一个 分量 如何识别该矩阵有 2 个分量以及每个分量由哪些顶点组成 对于矩

随机推荐

  • setThemingColor 仅适用于叶节点 dbId

    从文档看来 您应该能够使用任何 dbId 调用 setThemingColor 但它似乎只有在您传递的 id 是叶节点时才有效 它是否正确 还有什么方法可以批量调用此方法 或者一次只能调用一个叶节点 我想将 dbId 数组传递到该方法中 是
  • 左偏和右偏?

    我读过一篇关于部分统一 http eed3si9n com herding cats partial unification html作者提到了左偏和右偏数据类型 有人可以向我解释一下吗 左偏和右偏数据类型 与什么有关系功能1 Is Eit
  • Flutter:popAndPushNamed 参数传递到新页面?

    我正在 Flutter 上编写一个应用程序 我需要执行 popAndPushNamed 但我还需要将参数传递给我正在推送的页面 我能怎么做 是否有另一种方式来弹出和推送 或者我必须寻找不同的解决方案 这件事让我发疯 提前致谢 为了将数据发送
  • 自动解除 JQuery 中事件处理程序的绑定

    是否可以对 JQuery 说 嘿 在添加此事件处理程序之前取消绑定任何事件处理程序 而不显式调用 unbind 就像是 jq selector click function true 其中 true 表示我想取消绑定设置到该元素的所有单击处
  • Ansible自动为用户生成随机密码

    我正在尝试创建将创建用户列表的剧本 但是 我还想为每个用户生成随机密码 生成密码后 我希望在剧本文件旁边有一个包含 username new generated pa ssword 键值的文本文件 是否可以在不开发新模块的情况下做到这一点
  • 如何从 Windows 8 应用程序访问 SQL Server?

    我意识到我的 Windows 8 应用程序无法访问本地 SQL Server 实例 相反 我在 Azure 中有一个 SQL Server 在 SQL Server Management Studio 中 我只需更改查询字符串并像其他数据库
  • SVN - 拒绝、更改和恢复到以前的版本

    我们有一个有几个用户的 SVN 存储库 一名用户意外删除了一个目录并签入了更改 我可以直接签出旧版本并重新签入 但我不想丢失 SVN 中目录的版本信息 我如何拒绝更改 如果您使用命令行 典型的方法是进行 反向合并 例如 如果版本 125 是
  • SAS 无效“闰年”日期问题 yymmdd8

    我正在阅读一些原始数据 其中有几个错误的日期 具体来说 有人在非闰年键入了 2 月 29 日 例如 data null input test yymmdd8 format test date9 cards 20270229 run 客户希望
  • Android 的浮动窗口与 FLAG_SHOW_WHEN_LOCKED 结合失败

    我的应用程序在锁定屏幕之前向用户显示一个对话框 这是一个包含 DialogFragment 的简单 Activity 来自支持库 因为该应用程序在 2 2 上运行 由于显示这些对话框的实际活动不是 Android 标准的浮动窗口 getWi
  • (java.lang.String) 无法应用于 (java.lang.Object)

    我有一个名为的监听器类TopicS我试图从一个名为 readMessages 的 gui 中调用它 当我尝试使用以下方法运行 TopicS 类时 private void jButton1ActionPerformed java awt e
  • FFMPEG 抽屉式滤波器。十六进制颜色结果与输入值不匹配

    我正在尝试使用使用特定十六进制颜色输入的绘图盒过滤器创建边框 但是我得到的结果与我设置的值不匹配 考虑以下生成 600x600 样本的代码 ffmpeg i 0 jpg vf drawbox x 0 y 0 w 600 h 600 colo
  • Visual Studio SSDT 数据库项目 (.sqlproj) 构建 - 使用 CLI 生成 .dacpac,无需 MSBUILD (msbuild.exe)

    看起来好像dotnet CLI根据以下内容 不支持数据库项目 sqlproj https github com dotnet sdk issues 8546 https github com dotnet sdk issues 8546 就
  • 如何在 SQL 中解码 XML 实体?

    如何转换 解码文本 1594 1604 1575 1605 1581 1587 1610 1606 格式为普通文本 我正在使用 SQL Server 2012 我只想将它们全部更新为普通文本 由于某种原因 Jeroen 的答案似乎在 SQL
  • libGDX(Android 和 iOS 项目)中是否有推送通知的方法?

    有人知道是否可以使用 RoboVM libGDX 项目在 Android 和 iOS 中添加推送通知 如 Amazon Simple Notification Service 如果可能的话 是否有任何好的教程或好的提示如何实现这些事情 我会
  • 矩阵乘法 Prolog

    我在网上找到了 Prolog 中矩阵乘法的代码 有使用Prolog经验的人可以给我解释一下吗 SWI Prolog has transpose 2 in its clpfd library use module library clpfd
  • 如何在C# winforms中调用表单上多个文本框控件的Text_Changed事件

    我的表格大约有 20 个TextBox控制 我想开火Text Changed事件 而无需为每个单独的文本框添加事件 有没有办法循环遍历文本框来触发此事件 我想做的是在文本更改时清除标签控件 对于错误描述 我使用标签控件来显示消息 而不是显示
  • 在没有新初始化的情况下使用类中的数据

    我有一个 TabBar 布局 在 主页 选项卡中我有一个 连接 按钮 按下该按钮时会向 TransferViewController 类发送一个操作以创建 GameKit 会话 然后我有另一个名为 发送 的选项卡 其中有一个按钮 上面写着
  • Laravel Vue.js API:axios 的 PUT 方法不会向控制器发送任何数据

    我正在尝试使用 Laravel 和 Vue js 中的 API 更新模型中的一些数据 但我不能这样做 因为 axios 不会向服务器发送任何数据 我在发送之前检查数据并且它们存在 我使用 FormData append 添加所有字段 我在发
  • 如何在 Java 中加密/解密文件中的文本

    我的代码有问题 当我加密数据时 例如 在本例中 我使用接收者的公钥加密的模拟密钥 然后保存到文本文件中 当我读取该文本文件并尝试解密它时 使用接收者的私钥 我得到了不同的密钥 因此我无法使用它来解密加密的消息 发件人代码 import ja
  • 朱莉娅交换有什么问题!宏?

    我正在尝试写一个简单的swap Julia 中的宏 了解宏系统 到目前为止 这是我的代码 macro swap x y quote local tmp esc y x esc y y tmp end end a 1 b 2 swap a b