[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