Hello, how can i write a macro that takes four argument , namely a Dict , a key ( of arbitaray type) , and two expressions such that if the Dict contains the key , its value is bound to the local variable it within the first experssion which is evaluated; if
the key cannot be found, the second expression is evaluated.
If I understand your question correctly, you just need a function like this:
f(d, key, a, b) = (key ∈ d) ? a : b
Not sure I understand the question correctly either, but I’d rather think that this is the desired behavior:
function foo(dict, key, found, default)
haskey(dict, key) ? found(dict[key]) : default()
end
julia> d = Dict(:x => 42)
Dict{Symbol,Int64} with 1 entry:
:x => 42
# If the value exists, double it; otherwise return 0
julia> foo(d, :x, val->2val, ()->0)
84
julia> foo(d, :y, val->2val, ()->0)
0
If I’m correct and you’re indeed referring to anaphoric macros, I don’t think they are considered very idiomatic in Julia. In cases like these, I think the idiomatic solution would be to use anonymous functions like in the proposal above.
In an ideal world, the arguments to foo
would be to ordered in such a way that it could be called with a do
block. But this is only practical when there is only one argument that is a function (in which case this argument must be placed first). See for example the following method of get
:
get(f::Function, collection, key)
yea am referring to anaphoric macros
Anaphoric macros