TL; DR è val name <-
più leggibile di name val <-
?
Sto progettando un linguaggio semi-concatenativo, postfisso. Non ho pensato molto allo stile in cui sono assegnate le variabili, e ora vedo che ci sono due (principali) modi per farlo. In origine, l'assegnazione di una variabile assomiglia a:
variable value <-
Quindi, ecco un programma di esempio per un algoritmo fisher-yates implementato in questa lingua:
{ arr :
n arr size <-
0 n 2 - i [
j i n .. randin <-
arr arr [i j nswap] apply <-
] for
arr isolate
} shuf def
Non hai proprio bisogno di conoscere le specifiche, ma voglio indicare tre linee dove avviene l'assegnazione delle variabili:
n arr size <-
j i n .. randin <-
arr arr [i j nswap] apply <-
Ho aggiunto spazi bianchi per compensare quello che penso sia un po 'illeggibile. Tuttavia, non avendo utilizzato molti linguaggi postfini leggibili, non sono sicuro di ciò che è considerato leggibile. Quindi, ho inizialmente definito l'assegnazione delle variabili in modo che rappresentasse più strettamente l'assegnazione di una variabile convenzionale, in questo modo:
my language: a 4 <-
conventional: a <- 4
Tuttavia, dopo aver effettivamente scritto alcuni programmi brevi relativi, mi sento come se la leggibilità potesse essere migliorata avendo il nome adiacente all'assegnazione, allo stesso modo in cui 2 3 * 4 +
è più leggibile di 4 2 3 * +
, poiché avendo solo 2 gli elementi sulla "pila della tua mente" alla volta ti permettono di valutarlo come un normale problema di matematica. Quindi, il programma rivisto sarebbe:
{ arr :
arr size n <-
0 n 2 - i [
i n .. randin j <-
arr [i j nswap] apply arr <-
] for
arr isolate
} shuf def
Che sembra più leggibile.
(Salta in fondo alla domanda vera e propria, sto solo spiegando il programma originale in dettaglio da qui a lì per chi lo desidera.)
Bene, quindi un commento sembra (* ... *)
. Ora, ho aggiunto commenti che spiegano il programma.
(* { name : ...} begins a lambda that takes a single argument
'name' from the stack when executed. *)
{ arr :
(* let n be the length of the array *)
n arr size <-
(* from 0 to n - 2, using 'i' as a variable... *)
0 n 2 - i
(* ...execute a simple func, which has 'i' in scope *)
[
(* set j to a random index, i <= j < n *)
j i n .. randin <-
(* applies the stack operation 'nswap' to the array,
swapping elements 'i' and 'j'. *)
arr arr [i j nswap] apply <-
] for
(* make arr the only thing on the stack for a return value *)
arr isolate
(* close the lambda and define as a function 'shuf' *)
} shuf def
(* example usage *)
(1 2 3 4 5) shuf out
La domanda
In un linguaggio postfisso come questo, sarebbe meglio avere uno stile a lungo termine per avere il nome della variabile adiacente alla variabile o come primo argomento? Ho scelto quest'ultimo nella speranza che fosse più leggibile, ma ora sembra che il primo sia più leggibile.
(Mi rendo conto che non ho fornito le specifiche complete per il linguaggio, e questo è semplicemente perché non ne ho nessuno. Sentiti libero di "definire" i tuoi stessi esempi per il gusto dell'argomento.)