【问题标题】:Julia macros: @__FILE__ @__LINE__ in macroJulia 宏:@__FILE__ @__LINE__ 在宏中
【发布时间】:2017-06-09 08:59:35
【问题描述】:

这段代码:

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中格式化了你的代码。鉴于行号在这里很重要,请查看它以确保保留其含义。
  • @phg 在 julia # 标记评论的开始,而不是//。我建议您将重新格式化代码留给了解该语言的人 - 尽管我非常感谢您确实为提问者留下了评论。
  • @LyndonWhite 我知道朱莉娅。我也只是用很多其他语言编程;)感谢您的更正!
  • @phg 是的,老问题code-switching。我很清楚。
  • 嗨@phg 谢谢你的努力。

标签: macros julia


【解决方案1】:

以下内容将在当前的 Julia nightly 中起作用:

macro FL(message) 
    return :(@sprintf("%s:%d | %s", $(string(__source__.file)), $(__source__.line), $(esc(message)))) # line 2
end
println(@FL("m")) # line 4

以下implementation pull request 使这成为可能。不幸的是,在任何正式发布的版本中都不可能。

【讨论】:

  • 感谢您的回复。不幸的是,我并没有让 Julia 跑起来。我得到:命令行错误:选项“帮助列表”注册了不止一次! LLVM 错误:注册的命令行选项不一致。我会试着找出答案。
  • 这是由于在同一个进程中加载​​了多个 LLVM 版本。 IIRC 在 Julia 基础和 OpenCL.jl 中有未解决的问题(不确定是否有任何解决方案)。
【解决方案2】:

虽然可能有更优雅的方法可以做到这一点,但如果您不希望这阻碍您在其他方面的进展,为什么不将行号传递给宏...

macro FL(message, line)
    return @sprintf("%s:%d | %s", @__FILE__, line, message)
end
println(@FL("m", @__LINE__))

【讨论】:

  • 感谢您的回复。当然,这是一个解决方案。但我想避免这种情况,特别是因为我想添加@__FILE__。
  • 那么你也可以添加@__FILE__作为参数。
猜你喜欢
  • 2013-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-12
  • 1970-01-01
  • 2013-01-15
相关资源
最近更新 更多