Julia宏:@__FILE__ @__LINE__在宏中的应用

6
这段代码:
macro FL(message) 
    return @sprintf("%s:%d | %s", @__FILE__, @__LINE__, message) # line 2
end
println(@FL("m")) # line 4

打印 fl.jl:2 | m。我怎样才能使它打印 fl.jl:4 | m


嗨@Rolf,我用Markdown格式化了你的代码。请检查以确保意思得到保留,因为这里的行号很重要。 - phipsgabler
1
@phg 在Julia中,#符号表示注释,而不是//。 我建议您将代码重新格式化留给熟悉该语言的人--虽然我很感谢您为提问者留下了评论。 - Frames Catherine White
@LyndonWhite 我确实了解Julia。但我也使用很多其他编程语言 ;) 感谢您的纠正! - phipsgabler
啊,是的,好老的代码切换问题。我很了解它。 - Frames Catherine White
嗨 @phg,感谢你的努力。 - Rolf Wester
2个回答

5
以下内容适用于当前的Julia夜间版:
macro FL(message) 
    return :(@sprintf("%s:%d | %s", $(string(__source__.file)), $(__source__.line), $(esc(message)))) # line 2
end
println(@FL("m")) # line 4

这是由以下的实现拉取请求实现的。不幸的是,在任何官方发布的版本中都不可能实现。

谢谢您的回复。不幸的是,我无法运行Julia nighly。我收到以下错误信息:CommandLine Error: Option 'help-list' registered more than once! LLVM ERROR: inconsistency in registered CommandLine options. 我会尝试找出问题所在并解决它。 - Rolf Wester
这是由于在同一进程中加载了多个LLVM版本。我记得Julia基础和OpenCL.jl中存在相关问题(不确定是否有任何解决方案)。 - Isaiah Norton

3
尽管可能有更优雅的方法来实现这一点,但如果您不想因此而阻碍其他方面的进展,为什么不只是将行号传递给宏呢...
macro FL(message, line)
    return @sprintf("%s:%d | %s", @__FILE__, line, message)
end
println(@FL("m", @__LINE__))

谢谢您的回复。当然,这是一个解决方案。但我想避免这种情况,特别是因为我想添加@__FILE__。 - Rolf Wester
然后你也可以将@__FILE__作为参数添加。 - houtanb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接