Вы можете сделать что-то вроде следующего макроса, выбирая значение во время раскрытия, в зависимости от статически известного Symbol
:
julia> macro floop(selector::QuoteNode)
choices = Dict(:a => 5, :b => 10)
ex = :(1 + $(choices[selector.value]))
return ex
end
@floop (macro with 1 method)
julia> @macroexpand @floop(:a)
:(1 + 5)
julia> @macroexpand @floop(:b)
:(1 + 10)
julia> @floop(:c)
ERROR: LoadError: KeyError: key :c not found
Stacktrace:
[1] getindex(::Dict{Symbol,Int64}, ::Symbol) at ./dict.jl:477
[2] @floop(::LineNumberNode, ::Module, ::QuoteNode) at ./REPL[27]:3
in expression starting at REPL[33]:1
julia> s = :a; @floop(s)
ERROR: LoadError: MethodError: no method matching @floop(::LineNumberNode, ::Module, ::Symbol)
Closest candidates are:
@floop(::LineNumberNode, ::Module, ::QuoteNode) at REPL[1]:2
in expression starting at REPL[2]:1
Вам решать, как на самом деле хранить фактические значения. Глобальный словарь const
может быть опцией или просто цепочкой if
.
(в действительности могут быть иные вещи, чем Symbol
в QuoteNode
, но их трудно соединить в вызов макроса, и они также просто подняли бы KeyError
, поэтому я не включил дополнительную обработку этого.)