Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scope 为什么Julia宏中会出现未定义的错误_Scope_Macros_Julia - Fatal编程技术网

Scope 为什么Julia宏中会出现未定义的错误

Scope 为什么Julia宏中会出现未定义的错误,scope,macros,julia,Scope,Macros,Julia,我正在学习Julia,特别是我正在努力掌握宏,因此我发现,在破译宏的过程中,我在REPL中得到了以下行为: julia> macro once_then(expr::Expr) @assert expr.head == :while esc(quote $(expr.args[2]) # body of loop $expr # loop end) end @once_then

我正在学习Julia,特别是我正在努力掌握宏,因此我发现,在破译宏的过程中,我在REPL中得到了以下行为:

julia> macro once_then(expr::Expr)
         @assert expr.head == :while
         esc(quote
           $(expr.args[2]) # body of loop
           $expr # loop
         end)
       end
@once_then (macro with 1 method)

julia> i = 0
0

julia> @once_then while i < 10
       i += 1
       end
ERROR: UndefVarError: i not defined
Stacktrace:
 [1] macro expansion at ./REPL[34]:2 [inlined]
 [2] top-level scope at ./REPL[31]:5

julia> i
1
julia>宏一次\u然后(expr::expr)
@断言expr.head==:while
电子稳定控制系统
$(expr.args[2])#循环体
$expr#循环
(完)
结束
@一次\u然后(宏与1方法)
julia>i=0
0
茱莉亚>@一次,而我<10
i+=1
结束
错误:未定义错误:未定义
堆栈跟踪:
[1] 宏扩展在./REPL[34]:2[内联]
[2] 顶级作用域位于./REPL[31]:5
朱莉娅>我
1.
在循环的第一次迭代中,它显然可以访问
i
,因为它增加了它,但是
i
在第一次循环结束和第二次循环开始之间的某个地方变成了
Undef
ed? 从我所看到的,
esc
后面的括号应该包括循环结束之前的所有内容

实际上,我只是将代码复制粘贴到终端中,我从
@中得到相同的行为,直到在中找到
宏,所以我认为问题不会来自代码本身。。。有什么重要的东西我遗漏了吗


(顺便说一句,我正在运行1.0.4,所以它不应该是向后兼容性的问题…

您的宏很好。问题在于所涉及变量的范围。(有关更多信息,请参阅以下内容: 简而言之,
i=0
中的变量
i
位于全局范围内,其中循环位于局部范围内。在REPL中,您可以添加keywork
global
以使代码正常工作:

julia> @once_then while i < 10
       global i += 1
       end
julia>@once\u然后当我<10
全局i+=1
结束
另一个选项是在函数中执行所有这些操作,因此所有变量都具有局部作用域:

function fn()
i = 0
@once_then while i < 10
        i += 1
        end
    return i
end
函数fn()
i=0
@当我<10岁时
i+=1
结束
返回i
结束

那么,第二个链接中的示例是错误吗?