[eeps] Multi-Parameter Typechecking BIFs
Andras Georgy Bekes
bekesa@REDACTED
Sun Feb 22 12:51:03 CET 2009
> What we want, of course, is to say that the *whole* triple
> satisfies a named condition. And we can do that, right now,
> with macros.
>
> -define(mod_func_arity(M, F, A),
> is_atom(M), is_atom(F), is_integer(A), A >= 0).
>
> f(...{M,F,A}...) when ?mod_func_arity(M,F,A) ->
If you really want to say that the *whole* satisfies a named condition,
with some extra work you can write:
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-define(mod_func_arity(MFA),
is_atom(element(1,MFA)), is_atom(element(2,MFA)),
is_integer(element(3,MFA)), element(3,MFA) >= 0).
f(...MFA...) when ?mod_func_arity(MFA) ->
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
You *can* express an arbitarily complex pattern with a guard (without
being less efficient than a pattern).
Of course if you also want to have M,F and A seprately:
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
f(...{M,F,A}=MFA...) when ?mod_func_arity(MFA) ->
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
To me it communicates more clearly that MFA as a whole is a
mod_func_arity.
I'm not stating that this is better than abstract patterns. Abstract
patterns are better. Unfortunately, they don't exist (yet).
Georgy
More information about the eeps
mailing list