È un po 'soggettivo, ma spero di ottenere una comprensione più chiara di quali fattori rendono chiaro l'utilizzo di un operatore rispetto a ottuso e difficile. Recentemente ho preso in considerazione la progettazione di una lingua e un problema su cui cerco sempre di eseguire operazioni chiave nella lingua di un operatore e quando utilizzare una parola chiave o una funzione.
Haskell è un po 'famoso per questo, poiché gli operatori personalizzati sono facili da creare e spesso un nuovo tipo di dati verrà fornito con diversi operatori da utilizzare su di esso. La libreria Parsec, ad esempio, ha un gran numero di operatori per combinare insieme i parser, con gemme come >.
e .>
Non riesco nemmeno a ricordare cosa significano in questo momento, ma ricordo che sono molto facili da lavorare con una volta avevo imparato a memoria cosa significano in realtà. Una chiamata di funzione come leftCompose(parser1, parser2)
è stata migliore? Sicuramente più prolisso, ma in qualche modo più chiaro.
I sovraccarichi dell'operatore nei linguaggi C-like sono un problema simile, ma uniti dal problema aggiuntivo di sovraccaricare il significato di operatori familiari come +
con nuovi significati insoliti.
In qualsiasi nuova lingua, questo potrebbe sembrare un problema piuttosto difficile. In F #, ad esempio, la trasmissione utilizza un operatore di tipo-casting derivato matematicamente, anziché la sintassi cast in stile C # o lo stile verbale VB. C #: (int32) x
VB: CType(x, int32)
F #: x :> int32
In teoria una nuova lingua potrebbe avere operatori per la maggior parte delle funzionalità incorporate. Invece di def
o dec
o var
per la dichiarazione di variabili, perché non ! name
o @ name
o qualcosa di simile. Sicuramente abbrevia la dichiarazione seguita dal bind: @x := 5
anziché declare 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 oscura?