Perché Swift non richiede il punto e virgola? [chiuso]

19

Normalmente uso codice in c # o Objective-C e di recente mi sono incaricato di imparare il nuovo linguaggio di programmazione di Apple: Swift.

La prima cosa che ho notato è che non è necessario aggiungere il punto e virgola per terminare una riga in Swift, ma se lo fai, almeno da quello che ho provato, non interferisce con il compilatore.

Quando scrivo:

int someNumber = 0;

in Objective-C il punto e virgola indica al programma che la linea è terminata e che non passa alla riga successiva.

Con Swift I posso dichiarare una variabile con

var someNumber:Int = 5

e non aggiungere un punto e virgola e il sistema sa che questa è la fine della riga.

Che cosa permette a certe lingue di fare questo e ad altri no? Perché non mantenere un sistema uniforme di aggiunta del punto e virgola alla fine?

    
posta Memj 06.08.2015 - 07:38
fonte

2 risposte

18

What allows the some languages to do this and others to not? Why not keep a uniform system of adding the semicolon to the end?

Robert ha dato una buona risposta riguardo a Swift, cercherò di aggiungere qualcosa in più sull'analisi in generale e sul perché usare o meno il punto e virgola.

Quando compilate il programma, ci sono diversi passaggi prima che il vostro file sorgente sia trasformato in codice eseguibile, uno dei primi a leggere e parsing . Durante l'analisi, il codice viene trasformato da una sequenza di caratteri in una rappresentazione strutturata in base alla grammatica della lingua. Per questo è necessario che gli elementi che compongono il tuo codice (variabili, costanti, dichiarazioni, ecc.) Siano in qualche modo identificati e separati. Quando fai una dichiarazione come:

int someNumber = 0;

È solo una sequenza di caratteri che in qualche modo deve essere convertita al concetto "crea una 'cosa' chiamata someNumber di tipo int e assegna 0 ad essa" .

Ciò richiede l'identificazione di dove inizia e termina esattamente l'affermazione. Immagina se avessi questo:

int someNumber = 0;
int otherNumber = 1;

Dovresti sapere che quelle sono due dichiarazioni diverse. Il ; in lingue simili a C viene utilizzato per questo, quindi il parser legge i caratteri finché non ne trova uno e tenta di capire ciò che è stato letto come una singola istruzione. Ciò consente, come affermato da Robert, di avere più istruzioni sulla stessa riga, come:

int someNumber = 0; int otherNumber = 1;

Che ha esattamente lo stesso effetto di scriverli in due righe.

In altre lingue, come Python , ci si aspetta che ogni frase venga posta in una riga diversa.

x = 3
if x < 10:
   print 'x smaller than 10'
else:
   print 'x is bigger than 10 or equal'

Quindi non è necessario aggiungere ; , perché il linguaggio stesso ti impedisce di aggiungere istruzioni nella stessa riga!

Ancora altre lingue, come LISP o Scheme , hanno un modo molto diverso di raggruppare le affermazioni (ok, non sono realmente dichiarazioni, ma ignoriamolo per ora). Quindi hai solo una parentesi per tutto:

(define (do-stuff x)
  (begin
    (display (format "value: ~a" x))
    x))

Ancora una volta, non hai bisogno di ; solo perché utilizzi gli stessi simboli ( ) , ( ) per le cose che in altri linguaggi sono { , } , : , ecc Qualcuno che conosce solo la sintassi Lisp potrebbe chiederti: Perché hai bisogno di ; alla fine delle tue dichiarazioni?

Solo per aggiungere un estraneo: OCaml non ha solo un punto e virgola alla fine delle dichiarazioni ... ha due!

let rec fact x =
    if x <= 1 then 1 else x * fact (x - 1);;

Perché? Non lo so. :)

Diverse lingue sono progettate con scopi diversi e filosofie diverse. Se tutte le lingue condividessero la stessa sintassi e convenzioni, probabilmente ti permetteranno solo di fare le stesse cose nello stesso modo.

    
risposta data 06.08.2015 - 10:42
fonte
11

Le interruzioni di riga vengono utilizzate anziché i punti e virgola per delimitare la fine di un'istruzione.

In Guida linguistica: Nozioni di base dice:

Unlike many other languages, Swift does not require you to write a semicolon (;) after each statement in your code, although you can do so if you wish. Semicolons are required, however, if you want to write multiple separate statements on a single line.

Perché? Perché è così che i designer linguistici volevano farlo.

La seconda frase sopra suggerisce perché non è necessario il punto e virgola; la maggior parte delle istruzioni sono riga singola. Osserva questo esempio di Ordinamento di bolle; la combinazione di istruzioni a riga singola e senza punto e virgola rende la sintassi molto pulita simile a VB, ma meno dettagliata:

func bubbleSort<T:Comparable>(inout list:[T]) {
    var done = false
    while !done {
        done = true
        for i in 1..<list.count {
            if list[i - 1] > list[i] {
                (list[i], list[i - 1]) = (list[i - 1], list[i])
                done = false
            }
        }
    }
}

Poiché le istruzioni in Swift di solito terminano con un'interruzione di riga, viene ridotta la necessità di punto e virgola per contrassegnare la fine di un'istruzione. Altre lingue che usano il punto e virgola non funzionano in questo modo; puoi scrivere liberamente istruzioni multilinea, ma l'unico modo in cui il compilatore sa che l'istruzione è terminata è quando metti il punto e virgola alla fine di esso.

Quando le istruzioni non terminano con un'interruzione di riga, devi inserire l'interruzione di riga in un punto che il compilatore Swift può riconoscere come una continuazione della riga precedente:

let s2 = str
        .lowercaseString
        .replace("hello", withString: "goodbye")
    
risposta data 06.08.2015 - 07:48
fonte

Leggi altre domande sui tag