Por que o Swift não requer ponto e vírgula? [fechadas]


20

Normalmente codigo em c # ou em Objective-C e recentemente aprendi a aprender a nova linguagem de programação da Apple - Swift.

A primeira coisa que notei é que você não precisa adicionar ponto e vírgula para terminar uma linha no Swift, mas se o fizer, pelo menos pelo que eu testei, isso não interfere no compilador.

Quando escrevo:

int someNumber = 0;

no Objetivo-C, o ponto-e-vírgula informa ao programa que a linha acabou e não deve passar para a próxima linha.

Com Swift, posso declarar uma variável com

var someNumber:Int = 5

e não adicione ponto e vírgula e o sistema sabe que esse é o fim da linha.

O que permite que algumas línguas façam isso e outras não? Por que não manter um sistema uniforme de adição de ponto e vírgula até o fim?


Nem todo mundo vem de outras línguas, então como eles saberiam que não são uniformes? A Apple não atrairá mais programadores com o Swift se livrando das partes do Objective-C que muitas pessoas não gostam?
JeffO 6/08/2015

2
Muitos veterinários de Obj-C estão descontentes com Swift e preferem muito o Obj-C. Isso pode ser visto nos fóruns da Apple. O Swift foi lançado apenas em 2014 e se TODOS os bugs e alterações forem feitos a cada poucos meses no idioma, com o Swift2.0 sendo lançado neste outono. O Swift é baseado no Obj-C, mas visa facilitar a aprendizagem de códigos com um inglês mais simples.
Memj

Os implementadores de compiladores antigos eram preguiçosos e / ou tinham que ser mais eficientes com a análise mais simples. Não há mais necessidade disso. É o mesmo que a inferência de tipo local, você não a possui apenas se o escritor do seu compilador for preguiçoso e não se importar com a experiência do desenvolvedor.
Ebuall 30/09/18

Respostas:


18

O que permite que algumas línguas façam isso e outras não? Por que não manter um sistema uniforme de adição de ponto e vírgula até o fim?

Robert deu uma boa resposta sobre Swift, tentarei adicionar um pouco mais sobre a análise em geral e por que usar ou não ponto e vírgula.

Quando você compila o programa, há várias etapas antes que seu arquivo de origem seja transformado em código executável, sendo um dos primeiros a leitura e análise . Durante a análise, seu código é transformado de uma sequência de caracteres em uma representação estruturada de acordo com a gramática do idioma. Para isso, é necessário que os elementos que compõem seu código (variáveis, constantes, declarações etc.) sejam identificados e separados de alguma forma. Quando você faz uma declaração como:

int someNumber = 0;

É apenas uma sequência de caracteres que de alguma forma precisa ser transformada no conceito "criar uma 'coisa' chamada someNumberde tipo inte atribuir 0a ela" .

Isso requer identificar onde exatamente a instrução começa e termina. Imagine se você tivesse isso:

int someNumber = 0;
int otherNumber = 1;

Você precisaria saber que essas são duas declarações diferentes. As ;linguagens do tipo C são usadas para isso, então o analisador lê os caracteres até encontrar um e tenta entender o que foi lido como uma única declaração. Isso permite, como Robert disse, ter várias declarações na mesma linha, como:

int someNumber = 0; int otherNumber = 1;

Que tem exatamente o mesmo efeito que escrevê-las em duas linhas.

Em outros idiomas, como Python , você deve colocar cada instrução em uma linha diferente.

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

Portanto, não há necessidade de adicionar a ;, porque a própria linguagem impede que você adicione instruções na mesma linha!

No entanto, outros idiomas, como LISP ou Scheme , têm uma maneira muito diferente de agrupar declarações (ok, elas não são realmente declarações, mas vamos ignorá-lo por enquanto). Então você tem apenas parênteses para tudo:

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

Mais uma vez, você não precisa a ;apenas porque você usar os mesmos símbolos ( ), () para as coisas que em outras línguas são {, }, :, etc. Alguém que só sabe sintaxe Lisp pode perguntar-lhe: Por que você precisa ;no final de suas declarações ?

Apenas para adicionar um exemplo mais estranho: o OCaml não só possui um ponto-e-vírgula no final das instruções ... ele tem dois!

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

Por quê? Eu não sei. :)

Diferentes idiomas são projetados com diferentes propósitos e diferentes filosofias. Se todos os idiomas compartilharem a mesma sintaxe e convenções, provavelmente permitirão que você faça as mesmas coisas da mesma maneira.


4
Boa frase final.
Thomas Eding

Bons exemplos, mas você não respondeu à pergunta.
Robo Robok

Ponto de dados adicionais: Alguns idiomas adotam uma abordagem inversa à família de estilo C: Por exemplo, o HyperTalk usa quebras de linha como o final mais difícil de uma linha (em vez de ponto e vírgula) e exige quebras de linha de escape se você deseja continuar uma instrução através de várias linhas. Engraçado, o próprio pré-processador de C também funciona dessa maneira.
Uliwitness

11

Quebras de linha são usadas em vez de ponto e vírgula para delimitar o final de uma instrução.

No Guia de idiomas: Noções básicas, ele diz:

Ao contrário de muitos outros idiomas, o Swift não exige que você escreva um ponto-e-vírgula (;) após cada instrução em seu código, embora você possa fazê-lo, se desejar. Ponto e vírgula são necessários, no entanto, se você quiser escrever várias instruções separadas em uma única linha.

Por quê? Porque era assim que os designers de linguagem queriam fazê-lo.

A segunda frase acima sugere por que você não precisa de ponto e vírgula; a maioria das declarações é de linha única. Observe este exemplo de classificação de bolhas; a combinação de instruções de linha única e sem ponto e vírgula cria uma sintaxe muito limpa, semelhante ao VB, mas menos detalhada:

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
            }
        }
    }
}

Como as instruções no Swift geralmente terminam com uma quebra de linha, a necessidade de ponto e vírgula para marcar o final de uma instrução é reduzida. Outros idiomas que usam ponto-e-vírgula não funcionam dessa maneira; você pode escrever livremente instruções com várias linhas, mas a única maneira de o compilador saber que a instrução terminou é quando você coloca seu ponto e vírgula no final dela.

Quando as instruções não terminam com uma quebra de linha, você deve colocá-la em um local que o compilador Swift possa reconhecer como uma continuação da linha anterior:

let s2 = str
        .lowercaseString
        .replace("hello", withString: "goodbye")

2
A última declaração é falsa, não há local específico para colocar quebras de linha. É bom manter suas linhas de código recuadas e alinhadas para melhorar a legibilidade.
Eneko Alonso

Curiosidade: isso afeta os relatórios de erros. Muitos compiladores C (o clang é especialmente bom nisso) usam ponto-e-vírgula para encontrar o final de uma instrução com um erro de sintaxe e podem usar essas informações para, por exemplo, relatar parênteses de fechamento ausentes mais perto de onde eles realmente estão ausentes. A falta de ponto-e-vírgula, cometer um erro no Swift geralmente pode fazer com que a linha a seguir seja contratada em seu predecessor que contém erros e levar a mensagens de erro realmente estranhas.
Uliwitness
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.