我想形成像

julia> ex = :(a[$i,$j] + b[$i,$j])

因为我对编写一个程序很感兴趣,该程序能够编写一个方程式系统,其中用户仅给出方程式的结构,然后julia明确编写涉及的代码块。 更笼统地说,我想将函数嵌入表达式中,例如

julia> ex = :(a[$myfunc(i,j),$j] + b[$i,$j])

在评估第一行代码后,我得到

ERROR: UndefVarError: i not defined
 in eval(::Module, ::Any) at ./boot.jl:226

另一方面,如果我写

julia> ex = :(a[i,j] + b[i,j])
:(a[i,j] + b[i,j])

julia> for i in 1:2
           for j in 1:2
               println(eval(ex))
           end
       end
ERROR: UndefVarError: i not defined
 in eval(::Module, ::Any) at ./boot.jl:226
 [inlined code] from ./boot.jl:225
 in anonymous at ./<no file>:4294967295
 in eval(::Module, ::Any) at ./boot.jl:226

在这种情况下如何进行插值?

#1楼 票数:3

eval在全局范围内工作,因此它不能引用任何局部变量。 但是,您可以做的是将该表达式插入到要在全局范围内执行的较大代码段中:

julia> a = [1 2; 3 4]
       b = [5 6; 7 8]
       ex = :(a[i,j] + b[i,j]);

julia> @eval for i in 1:2
                  for j in 1:2
                      println($ex)
                  end
              end
6
8
10
12

@eval宏是引用传递的语法并将其传递给eval()函数的简单@eval 定义一个自定义函数可能会更好:

julia> @eval function f()
              for i in 1:2
                  for j in 1:2
                      println($ex)
                  end
              end
       end
f (generic function with 1 method)

julia> f()
6
8
10
12

有关eval的常见警告:适用于任何通过的代码,它们都可以被恶意制作为恶意或令人惊讶的事情。 或者只是使程序崩溃。

  ask by user2820579 translate from so

未解决问题?本站智能推荐:

1回复

如何插入Julia“for”表达式中?

我正在基于Python的列表理解编写一个@vcomp ( vector comprehension )宏,该宏带有条件子句以简洁的方式过滤元素。 macro vcomp(comprehension::Expr, when::Symbol, condition) comp_head, com
1回复

转义Julia中宏生成宏中的表达式

我想在 Julia 中编写一个宏来生成许多宏 应该生成宏 反过来应该定义为 我已经成功地解决了这个问题的第一部分,但是@macroexpand显示内部变量x没有正确转义,如果我使用局部变量调用该方法,则会导致UndefVarErrors 。 而我想要的是 我的代码是
1回复

模块中Julia宏中的表达式和变量的范围

出于某种原因,我不得不在宏中加上quote ... end块,并且ex以编程方式生成。 此代码有效。 当宏被放入模块时,它不再起作用: 它说: 我想我应该把esc放在某个地方,以评估模块外主作用域中的表达式ex 。 我应该怎么处理这个?
1回复

如何在Julia中查找和替换AST的子表达式

假设我有一个像:(Main.i / (0.5 * Main.i * sin(Main.i)) 。 我想将Main.i每次出现Main.i为其他符号。 朱莉娅有惯用的方法吗?
1回复

Julia网络表达式Flux

学习 Julia 元编程以通过表达式自动构建 ANN。 虽然一切都适用于推理,但向后阶段会引发错误: LoadError:无法区分外来调用表达式下一个代码显示了问题出现的位置。 虽然 eval(net(x)) 运行良好,但由于某种原因,它在梯度计算阶段会引发错误。
1回复

在Julia中编写一个返回多个顶级表达式的宏

我正在尝试编写一个为类型层次结构定义多种方法的宏。 我想要实现的是一种任意枚举类型层次结构的方法,通过为类型树中的每个结构定义一个order()方法。 返回的表达式似乎不在顶层计算。 有没有办法返回多个顶级表达式? 所需的行为是为层次结构中的每种类型创建一个方法,例如,考虑 应该编写一个方法orde
1回复

引用表达式中的Julia全局变量引发UndefVarError

以下代码失败并显示有意义的错误消息。 将 x 的范围声明为 local 使事情起作用: 但是,由于某种原因,这不起作用:
2回复

Julia局部变量未在表达式eval中定义

鉴于以下功能, 如果我然后跑 我收到一条错误消息,说b未定义。 为什么这不起作用? 我怎样才能使这项工作?