Macros 宏来捕获Julia赋值中的错误

Macros 宏来捕获Julia赋值中的错误,macros,julia,Macros,Julia,在使用Julia宏时,我似乎又回到了尝试和错误编程,这也不例外。我试图编写一个简单的宏,捕捉表达式中的任何错误,并在表达式失败时设置一个标志。这是一个宏,因为我希望在调用上下文中计算可能包含一个或多个赋值语句的表达式。比如说: macro flag_errors(ex) broken = false esc(quote try $(ex) catch broken = true end

在使用Julia宏时,我似乎又回到了尝试和错误编程,这也不例外。我试图编写一个简单的宏,捕捉表达式中的任何错误,并在表达式失败时设置一个标志。这是一个宏,因为我希望在调用上下文中计算可能包含一个或多个赋值语句的表达式。比如说:

macro flag_errors(ex)
    broken = false
    esc(quote
        try
            $(ex)
        catch
            broken = true
        end
    end) 
end
我尝试了多种嵌套esc函数的方法,但尚未找到一种在调用环境中正确计算赋值的方法:

julia> @flag_errors a=2
2

julia> a
a not defined

julia> @flag_errors a=2+"X"
true

julia> a
a not defined

julia> broken
broken not defined
julia>@flag_errors global a = 2
a

julia>a
2

写这个宏的正确方法是什么?try块是问题的根源吗?

我认为try块是罪魁祸首,因为它引入了一个新的作用域块。一般来说,需要一些非常严肃的元编程来分析ex中的赋值才能撤销它。为什么需要它?

我认为try块是罪魁祸首,因为它引入了一个新的作用域块。一般来说,需要一些非常严肃的元编程来分析ex中的赋值才能撤销它。你为什么需要它?

我同意Toivo的观点,这是一个范围问题。例如,运行以下代码可在全局环境中正确分配:

julia> @flag_errors a=2
2

julia> a
a not defined

julia> @flag_errors a=2+"X"
true

julia> a
a not defined

julia> broken
broken not defined
julia>@flag_errors global a = 2
a

julia>a
2
因此,如果您对全球环境中存在的问题感到满意,那么这就解决了问题。如果这已经在另一个作用域函数中,那么我们必须进行进一步的实验


干杯。

我同意托沃的观点,这是一个范围问题。例如,运行以下代码可在全局环境中正确分配:

julia> @flag_errors a=2
2

julia> a
a not defined

julia> @flag_errors a=2+"X"
true

julia> a
a not defined

julia> broken
broken not defined
julia>@flag_errors global a = 2
a

julia>a
2
因此,如果您对全球环境中存在的问题感到满意,那么这就解决了问题。如果这已经在另一个作用域函数中,那么我们必须进行进一步的实验


干杯。

这里有一些问题。一个是有两个名为break的不相关变量,一个在宏中,一个在引用体中。另一个原因是缺少表达式-应将其插值为$escex,以便向宏扩展器指示应在宏调用方的上下文而不是宏定义上下文中对其求值。最后是Toivo提到的范围问题。使其表现为不在新块中所需的范围分析甚至可能不可行;我不完全确定。

这里有一些地方不对劲。一个是有两个名为break的不相关变量,一个在宏中,一个在引用体中。另一个原因是缺少表达式-应将其插值为$escex,以便向宏扩展器指示应在宏调用方的上下文而不是宏定义上下文中对其求值。最后是Toivo提到的范围问题。使其表现为不在新块中所需的范围分析甚至可能不可行;我不完全确定。

我正在尝试捕捉设置块中的错误,以便在extras/test.jl中进行增强。理想情况下,捕获错误的方式应确保测试套件报告不会中断。我正在尝试捕获设置块中的错误,以便在extras/test.jl中进行增强。理想情况下,错误的捕获方式应确保测试套件报告不会中断。