@doc """
Check if given id has 64-bit size
Examples:
> MyModule.has_64_bit_size(132700114308300801)
true
> MyModule.has_64_bit_size(35)
false
"""
def has_64_bit_size(id) do
bit_size(:binary.encode_unsigned(id)) == 64
end
I want to implement defmacro has_64_bit_size. What should it look like?
defmacro has_64_bit_size(id) do
quote do
bit_size(:binary.encode_unsigned(unquote(id))) == 64
end
end
I’m trying to thing of a use case where a macro would make more sense than just using the function you define but its not clear to me. Generally speaking, the first rule of macros in Elixir is don’t use macros. But of course when you need one, you need one!
Guards can only be composed of guard-safe functions and also with elixir >= 1.6 you want to use defguard instead of a macro to compose those. :binary.encode_unsigned/1 is not guard-safe though, so you cannot do what you want to do in a guard.
Since all you’re after is whether an int requires 64 bits, I think all you need is int > 9223372036854775807 since thats the maximum number that fits in 63 bits (if I’ve calculated correctly).