Well that is how I do it. Obviously the listing I sent is the detailed one,
nothing keeps you from writing a meta-macro to generate the sub macros:
defmodule Constants do
defmacro c name, value do
quote do
defmacro unquote(name) do
unquote(value)
end
end
endend
And use it like that to define your constants:
defmodule Constants.Vals do
require Constants
Constants.c val1, "val1"
Constants.c val2, "val2"end
To finally use them in your code:
defmodule Test do
require Constants.Vals
def match v do case v do
Constants.Vals.val1 -> "matched val1"
Constants.Vals.val2 -> "matched val2"
_ -> "no match"
end
endend
Metaprogramming makes you able to introduce any syntactic sugar you
like (more or less), you should take advantage of it.
Max
On 22 May 2016 at 15:54, Nytz12 <[email protected]> wrote:
> I see, not too fond of how much boilerplate is required for each constant,
> but perhpas this is the only way to get them in guards?
>
>
> On Sunday, May 22, 2016 at 12:35:24 PM UTC+2, max s wrote:
>
>> Hi,
>>
>> I use macros for such requirement in my own code:
>>
>> defmodule Constants do
>> defmacro val1 do
>> quote do
>> "val1"
>> end
>> end
>>
>> defmacro val2 do
>> quote do
>> "val2"
>> end
>> endend
>>
>>
>> And here's how it's used:
>>
>>
>> defmodule Test do
>> require Constants
>>
>> def match v do case v do
>> Constants.val1 -> "matched val1"
>> Constants.val2 -> "matched val2"
>> _ -> "no match"
>> end
>> endend
>>
>>
>> Max
>>
>>
>> On 22 May 2016 at 12:16, Nytz12 <[email protected]> wrote:
>>
>>> Hi
>>>
>>> I use the following pattern to define cross module constants
>>>
>>> defmodule Visitor do
>>>
>>> defmodule FilterTypes do
>>> def c_GREATER_THAN, do: "greater_than"
>>> def c_LESS_THAN, do: "less_than"
>>> def c_IS, do: "is"
>>> def c_IS_NOT, do: "is_not"
>>> end
>>> ...
>>>
>>> Which lets me do something like this from other modules
>>>
>>> Visitor.FilterTypes.c_GREATER_THAN # == "greater than"
>>>
>>> Problem is that I just discored that these 'constants', which are really
>>> function calls, cannot be used to do pattern match like:
>>>
>>> def filter(query, filter, field, value) do
>>> case filter do
>>> FilterTypes.c_GREATER_THAN -> greater_than(query, field, value)
>>> FilterTypes.c_LESS_THAN -> less_than(query, field, value)
>>> FilterTypes.c_IS -> is(query, field, value)
>>> FilterTypes.c_IS_NOT -> is_not(query, field, value)
>>> _ -> {:error, "unknown filter", filter}
>>> end
>>> end
>>>
>>> Is there a better approach i'm missing?
>>>
>>> --
>>> You received this message because you are subscribed to the Google
>>> Groups "elixir-lang-talk" group.
>>> To unsubscribe from this group and stop receiving emails from it, send
>>> an email to [email protected].
>>> To view this discussion on the web visit
>>> https://groups.google.com/d/msgid/elixir-lang-talk/ace6b869-dfce-4d3f-aeeb-2d9bc4583f03%40googlegroups.com
>>> <https://groups.google.com/d/msgid/elixir-lang-talk/ace6b869-dfce-4d3f-aeeb-2d9bc4583f03%40googlegroups.com?utm_medium=email&utm_source=footer>
>>> .
>>> For more options, visit https://groups.google.com/d/optout.
>>>
>>
>> --
> You received this message because you are subscribed to the Google Groups
> "elixir-lang-talk" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to [email protected].
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/elixir-lang-talk/d11f1487-1151-4c40-b9e3-b63d3deb67c0%40googlegroups.com
> <https://groups.google.com/d/msgid/elixir-lang-talk/d11f1487-1151-4c40-b9e3-b63d3deb67c0%40googlegroups.com?utm_medium=email&utm_source=footer>
> .
>
> For more options, visit https://groups.google.com/d/optout.
>
--
You received this message because you are subscribed to the Google Groups
"elixir-lang-talk" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/elixir-lang-talk/CAOPKHevpFLN4ELADhw4MRT8SLHGYsO%3D%3DCefyD_ndkqdo8kjBNw%40mail.gmail.com.
For more options, visit https://groups.google.com/d/optout.