È un po 'soggettivo, ma spero di avere una comprensione più chiara di quali fattori rendono chiaro un operatore rispetto a ottuso e difficile. Di recente ho preso in considerazione la progettazione di una lingua e un problema su cui cerco sempre di tornare indietro è quando eseguire un'operazione chiave nella lingua come operatore e quando utilizzare una parola chiave o una funzione.
Haskell è in qualche modo noto per questo, poiché gli operatori personalizzati sono facili da creare e spesso un nuovo tipo di dati verrà impacchettato con diversi operatori per l'uso su di esso. La libreria Parsec, ad esempio, include molti operatori per combinare insieme parser, con gemme simili >.
e .>
non riesco nemmeno a ricordare cosa significano in questo momento, ma ricordo che sono molto facili con cui lavorare una volta memorizzato cosa in realtà significano. Una chiamata di funzione come quella leftCompose(parser1, parser2)
sarebbe stata migliore? Certamente più prolisso, ma per certi versi più chiaro.
I sovraccarichi degli operatori in linguaggi simil-C sono un problema simile, ma si confondono con l'ulteriore problema di sovraccaricare il significato degli operatori familiari come +
con nuovi significati insoliti.
In qualsiasi nuova lingua, questo sembrerebbe un problema piuttosto difficile. In F #, ad esempio, il casting utilizza un operatore di tipo-casting derivato matematicamente, anziché la sintassi del cast in stile C # o lo stile VB dettagliato. C #: (int32) x
VB: CType(x, int32)
F #:x :> int32
In teoria un nuovo linguaggio potrebbe avere operatori per la maggior parte delle funzionalità integrate. Invece di def
o dec
o var
per la dichiarazione variabile, perché no ! name
o @ name
o qualcosa di simile. Certamente accorcia la dichiarazione seguita da vincolante: @x := 5
invece dideclare x = 5
o let x = 5
La maggior parte del codice richiederà molte definizioni di variabili, quindi perché no?
Quando un operatore è chiaro e utile e quando è oscuro?
+
per la concatenazione di stringhe o <<
per i flussi). Con Haskell, d'altra parte, un operatore è solo una funzione con un nome personalizzato (cioè non sovraccaricato) o parte di una classe di tipo, il che significa che mentre è polimorfico, fa la stessa cosa logica per ogni tipo, e ha anche lo stesso tipo di firma. Lo stesso >>
vale >>
per ogni tipo e non sarà mai un po 'mutevole.