当前位置: 首页 > 知识库问答 >
问题:

用Julia中的eval处理varargs

胡禄
2023-03-14

我刚开始利用朱莉娅。我试图使用eval(在Julia中)来定义函数中的一组变量。假设我想设置v1等于2:

function fun_test(varargs...)
  v1 = 0;

  if length(varargs) > 0
    j = collect(linspace(1,length(varargs)-1,length(varargs)/2));

    for i in j
      expr_vargs = parse("$(varargs[i]) = $(varargs[i+1]);");
      eval(expr_vargs);
    end
  end

  println(v1)

end

调用函数为:

fun_test("v1", "2");

它不起作用,因为println返回0(v1的初始值)。但是,如果我在Julia的终端中运行一个类似的eval调用,那么它就可以工作了。

能否请您澄清一下为什么不起作用以及如何修复?

共有1个答案

竺捷
2023-03-14

eval在toplevel范围内运行,而不是在函数范围内运行。不能在函数范围内动态更新绑定。在不知道您的精确用例的情况下,我怀疑有一种方法可以在没有动态重新绑定的情况下完成事情。特别是,v1v2等可能最好做成数组,v

然而,如果您确实必须这样做,您可以始终将v1定义为子模块中的全局变量:

module FunTest
v1 = 0
function fun_test(varargs...)

  if length(varargs) > 0
    j = collect(linspace(1,length(varargs)-1,length(varargs)/2));

    for i in j
      @eval $(varargs[i]) = $(varargs[i+1])
    end
  end

  println(v1)

end
export fun_test
end
using .FunTest
fun_test(:v1, 2)  # result: 2

(我还修改了您的代码,以避免解析ing字符串,这最好通过表达式插值来完成。)

 类似资料:
  • Julia有一个非常好的特性,可以访问自己的语法树,这使得以编程方式生成新函数变得很容易,但它比普通的Julia代码慢得多。 例如: 有没有办法给提供与普通Julia代码相同的速度? @Ivarne建议我提供我的项目的细节。我想使用Julia的元编程功能来计算符号导数并运行它们。 我编写了一个函数,它接受and表达式和一个参数,并返回一个新表达式,该表达式是相对于的导数。不幸的是,结果需要太长时间

  • 我很难处理压缩文件,例如:

  • 本文向大家介绍说说你对eval的理解相关面试题,主要包含被问及说说你对eval的理解时的应答技巧和注意事项,需要的朋友参考一下 不安全的, 容易出错, 因为你不知道你传入的参数是什么鬼 性能底下. 某种情况下跟new Function(), setTimeout, setInterval类似 不利于代码可维护性, 可拓展性 不是在无可奈何的情况下, 请不要使用

  • 本文向大家介绍Shell中eval的用法示例,包括了Shell中eval的用法示例的使用技巧和注意事项,需要的朋友参考一下 功能说明:告知shell取出eval的参数,重新运算求出参数的内容。 语  法:eval [参数] 补充说明:eval可读取一连串的参数,然后再依参数本身的特性来执行。 参  数:参数不限数目,彼此之间用分号分开。 1.执行命令行之前扫描它两次,再次运算求出参数的内容。 将

  • 问题内容: 我在玩耍时偶然发现了Python中的一个函数。我想不出需要此功能的情况,除了可能是语法糖。谁能举一个例子? 问题答案: 并且是一种方便快捷的方法,可以动态地获取一些源代码,也许要稍加修改然后再执行- 但是,它们从来不是最好的方法,尤其是在生产代码中,而不是“快速而又简单”脏”的原型&c。 例如,如果我不得不处理这样的动态Python源代码,那么我会使用ast模块-比得多(比它更安全(您

  • 本文向大家介绍Python中的exec、eval使用实例,包括了Python中的exec、eval使用实例的使用技巧和注意事项,需要的朋友参考一下 通过exec可以执行动态Python代码,类似Javascript的eval功能;而Python中的eval函数可以计算Python表达式,并返回结果(exec不返回结果,print(eval("…"))打印None); 这里有个scope(命名空间,