Solo curioso, da una prospettiva di analisi sintattica, perché Scala richiede effettivamente parentesi attorno alla condizione di un'istruzione if
, dato che l'unica cosa consentita dopo if
è (
?
Le parentesi non delimitano solo dove inizia la condizione; indicano anche dove finisce .
Hai ragione che tecnicamente, solo la parentesi giusta è necessaria per risolvere l'ambiguità. Ma i progettisti di linguaggi sono esteticamente motivati e avere solo un paio di personaggi abbinati potrebbe sembrare semplicemente orribile. Ci sono lingue che delimitano la fine ma non l'inizio di una condizione, ad es. Bash, ma nessuno li ha mai accusati di avere un bell'aspetto.
Scala è progettato non solo per essere interoperabile con la sua piattaforma host tecnicamente, ma anche socialmente, cioè è progettato per essere familiare ai programmatori esistenti della piattaforma host. E su quasi tutte le piattaforme host a cui potenzialmente potrebbe interessare la comunità Scala (JVM, CLI, ECMAScript, Objective-C / Core Foundation / Cocoa, Unix, Windows), le lingue dominanti (Java, C #, ECMAScript, Objective-C, C, C ++) usano questa sintassi. Ecco perché Martin Odersky l'ha scelto: familiarità.
Tuttavia, quando a Martin Odersky è stato chiesto quale fosse la one cosa che ha introdotto per compatibilità con Java e che gli piacerebbe cambiare, ha citato esattamente questa sintassi.
Questa asimmetria di avere una parola chiave if
per indicare la condizione, una parola chiave else
per indicare il ramo else
, ma nessuna parola chiave then
corrispondente per indicare il ramo then
complica inutilmente la sintassi, e desidera che abbia scelto di utilizzare invece una parola chiave then
. Sfortunatamente, è impossibile introdurlo in un modo compatibile con le versioni precedenti, quindi probabilmente rimarrà per sempre.
Dai la colpa ai designer di B !
La scelta di utilizzare una coppia di parentesi per delimitare le condizioni non è specifica di Scala, ma è comune a tutte le lingue basate sulla sintassi C, inclusi Java, C ++, C # e persino JavaScript. Quelle lingue sono basate sulla sintassi C semplicemente perché è familiare a molti sviluppatori. E C ha ereditato questa sintassi dal suo predecessore B (che come C è stato progettato da Ken Thompson).
Una lingua come Lisp non richiede delimitatori attorno alle condizioni:
(if x do-something do-something-else)
Ma questo è possibile solo a causa della regolarità della sintassi Lisp. In una lingua con in infix-operatori, questo porterà ad ambiguità, perché
if a ++ b;
potrebbe significare
if (a) ++b;
o
if (a++) b;
Quindi, mentre la parentesi di apertura dopo if
non è teoricamente necessaria, è necessario un token per separare fine della condizione dalla seguente dichiarazione.
Python ad esempio usa i due punti per questo scopo:
if a == b:
do_something()
Molte lingue, come Pascal, Basic, OCaml, F #, Haskell utilizza la parola chiave then
:
if a == b then do_something
Quindi la domanda si riduce al motivo per cui i progettisti di B hanno deciso di utilizzare una serie di parentesi per delimitare le condizioni? BCPL, il predecessore di B, utilizza la parola chiave ' do
', quindi è stata una scelta attiva dei progettisti di B utilizzare invece la parentesi.
Non posso rispondere a questo (solo i progettisti di B possono), ma una ragionevole ipotesi è che preferiscono usare caratteri speciali piuttosto che parole chiave (forse per rendere più veloce la digitazione e mantenere basso il numero di parole chiave riservate), e poiché le parentesi sono già utilizzate per delimitare le sottoespressioni, sembra una scelta logica.
Leggi altre domande sui tag scala