Redéfinir les opérateurs pour définir les fonctions
La redéfinition des opérateurs peut économiser beaucoup d'octets entre parenthèses et virgules.
Opérateurs unaires récursifs
Pour un exemple unaire, comparez les implémentations récursives suivantes de la séquence de Fibonacci:
F(n)=n>1?F(n-1)+F(n-2):n # 24 bytes
!n=n>1?!~-n+!(n-2):n # 20 bytes
!n=n>1?!~-n+!~-~-n:n # 20 bytes
Essayez-le en ligne!
L'opérateur redéfini conserve sa priorité initiale.
Notez que nous ne pouvons pas simplement échanger !
en faveur de ~
, car ~
est déjà défini pour les entiers, tandis que !
n'est défini que pour les booléens.
Opérateurs binaires
Même sans récursivité, la redéfinition d'un opérateur est plus courte que la définition d'une fonction binaire. Comparez les définitions suivantes d'un test de divisibilité simple.
f(x,y)=x==0?y==0:y%x==0 # 23 bytes
(x,y)->x==0?y==0:y%x==0 # 23 bytes
x->y->x==0?y==0:y%x==0 # 22 bytes
x\y=x==0?y==0:y%x==0 # 20 bytes
Essayez-le en ligne!
Opérateurs binaires récursifs
Ce qui suit illustre comment redéfinir un opérateur binaire pour calculer la fonction Ackermann:
A(m,n)=m>0?A(m-1,n<1||A(m,n-1)):n+1 # 35 bytes
^ =(m,n)->m>0?(m-1)^(n<1||m^~-n):n+1 # 36 bytes
| =(m,n)->m>0?m-1|(n<1||m|~-n):n+1 # 34 bytes
m\n=m>0?~-m\(n<1||m\~-n):n+1 # 28 bytes
Essayez-le en ligne!
Notez que ^
c'est encore plus long que d'utiliser un identifiant régulier, car sa priorité est trop élevée.
Comme mentionné précédemment
m|n=m>0?m-1|(n<1||m|~-n):n+1 # 28 bytes
ne fonctionnerait pas pour les arguments entiers, car il |
est déjà défini dans ce cas. La définition des entiers peut être modifiée avec
m::Int|n::Int=m>0?m-1|(n<1||m|~-n):n+1 # 38 bytes
mais c'est trop long. Cependant, il fait le travail si on passe un flotteur comme argument gauche et un entier comme argument droit.