在Julia宏中获取函数名:带关键字参数的函数为何显示异常?
关键字参数函数中宏获取函数名异常的问题
我编写了一个宏,通过存储在字典中的错误消息模板简化代码,该宏会自动插入抛出错误的函数名(参考discourse及@__FUNCTION__相关内容)。
exception = Dict(:foo => ("bar ~", ArgumentError)) macro ⛔(id) msg, type = exception[id] quote msg = replace($msg, "~" => StackTraces.stacktrace()[1].func) throw($type(msg)) end end
在使用位置参数的函数f中运行正常:
f(x, p) = p < 5 ? x : @⛔ foo f(1, 10) #> ERROR: ArgumentError: bar f
但在使用关键字参数的函数g中,函数名显示为#g#N(N为会话中第N个求值表达式,重定义g会递增该数字):
g(x; p = 3) = p < 5 ? x : @⛔ foo g(1, p = 10) #> ERROR: ArgumentError: bar #g#N
我使用@macroexpand对比两者生成的代码未发现差异,困惑:函数g与f相比究竟有何不同?
内容的提问来源于stack exchange,提问作者Donald Seinen
相关产品推荐
相关产品推荐

