如何编写 body 包含用户定义符号的宏?
How to write a macro whose body contains a user defined symbol?
我打算创建一个具有以下行为的宏:
@pass_symbol sym func
扩展为:
func(:sym)
以下实验没有产生任何结果:
macro pass_symbol(symarg, funcarg)
quote
$funcarg($symarg)
# turns into `func(sym)`
# which results in an error
# as `sym` is not defined
end
end
macro pass_symbol(symarg, funcarg)
quote
# combinations of
$funcarg($(Symbol(symarg)))
# or
$funcarg(Symbol(symarg))
# turns into `func(Symbol(sym))`
# which for the same reason detailed
# above results in an error
end
end
macro pass_symbol(symarg, funcarg)
quote
$funcarg(:$symarg)
# I wished to escape the ":"
# so that it would expand into func(:sym)
# but it didn't manage to
# evaluate `:` and `$` separately
end
end
我确实尝试了更多恶作剧。
最终,我找到了这个:
macro pass_symbol(symarg, funcarg)
str = ":$symarg"
quote
$funcarg($(Meta.parse(str)))
end
end
但我对此并不满意,因为我觉得必须有一种更惯用的方法来实现这一点。
请随意建议一个更合适的标题,因为我找不到任何与使用 google 相关的内容,我希望它具有良好的 search-ability。
macro pass_symbol(symarg, funcarg)
quote
$funcarg($(Expr(:quote, (symarg))))
end
end
或者更简洁:
macro pass_symbol(symarg, funcarg)
quote
$funcarg($(QuoteNode(symarg)))
end
end
但我仍然不确定为什么 QuoteNode
按照文档实现了预期的行为:
A quoted piece of code, that does not support interpolation. See the manual section about QuoteNodes for details.
或者如果有办法解决这个问题:
$funcarg(:$symarg)
我打算创建一个具有以下行为的宏:
@pass_symbol sym func
扩展为:
func(:sym)
以下实验没有产生任何结果:
macro pass_symbol(symarg, funcarg)
quote
$funcarg($symarg)
# turns into `func(sym)`
# which results in an error
# as `sym` is not defined
end
end
macro pass_symbol(symarg, funcarg)
quote
# combinations of
$funcarg($(Symbol(symarg)))
# or
$funcarg(Symbol(symarg))
# turns into `func(Symbol(sym))`
# which for the same reason detailed
# above results in an error
end
end
macro pass_symbol(symarg, funcarg)
quote
$funcarg(:$symarg)
# I wished to escape the ":"
# so that it would expand into func(:sym)
# but it didn't manage to
# evaluate `:` and `$` separately
end
end
我确实尝试了更多恶作剧。 最终,我找到了这个:
macro pass_symbol(symarg, funcarg)
str = ":$symarg"
quote
$funcarg($(Meta.parse(str)))
end
end
但我对此并不满意,因为我觉得必须有一种更惯用的方法来实现这一点。
请随意建议一个更合适的标题,因为我找不到任何与使用 google 相关的内容,我希望它具有良好的 search-ability。
macro pass_symbol(symarg, funcarg)
quote
$funcarg($(Expr(:quote, (symarg))))
end
end
或者更简洁:
macro pass_symbol(symarg, funcarg)
quote
$funcarg($(QuoteNode(symarg)))
end
end
但我仍然不确定为什么 QuoteNode
按照文档实现了预期的行为:
A quoted piece of code, that does not support interpolation. See the manual section about QuoteNodes for details.
或者如果有办法解决这个问题:
$funcarg(:$symarg)