Ridefinire gli operatori per definire le funzioni
La ridefinizione degli operatori può far risparmiare parecchi byte tra parentesi e virgole.
Operatori unari ricorsivi
Per un esempio unario, confronta le seguenti implementazioni ricorsive della sequenza di 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
Provalo online!
L'operatore ridefinito mantiene la sua precedenza iniziale.
Nota che non potremmo semplicemente scambiarci !a favore ~, poiché ~è già definito per gli interi, mentre !è definito solo per i booleani.
Operatori binari
Anche senza ricorsione, la ridefinizione di un operatore è più breve della definizione di una funzione binaria. Confronta le seguenti definizioni di un semplice test di divisibilità.
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
Provalo online!
Operatori binari ricorsivi
Di seguito viene illustrato come ridefinire un operatore binario per calcolare la funzione 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
Provalo online!
Si noti che ^è ancora più lungo rispetto all'utilizzo di un identificatore regolare, poiché la sua precedenza è troppo elevata.
Come menzionato prima
m|n=m>0?m-1|(n<1||m|~-n):n+1 # 28 bytes
non funzionerebbe per argomenti interi, poiché |è già definito in questo caso. La definizione per numeri interi può essere modificata con
m::Int|n::Int=m>0?m-1|(n<1||m|~-n):n+1 # 38 bytes
ma è proibitivamente lungo. Tuttavia, esso fa lavoro se si passa un galleggiante come argomento sinistro e un intero come argomento di destra.