Swift neden noktalı virgül gerektirmez? [kapalı]


20

Normalde c # ya da Objective-C kodları yazdım ve son zamanlarda Apple'ın yeni programlama dilini (Swift) öğrenmeye başladım.

Fark ettiğim ilk şey, Swift'teki bir satırı sonlandırmak için noktalı virgül eklemeniz gerekmediğidir, ancak en azından test ettiğimden yaparsanız, derleyiciye müdahale etmez.

Yazarken:

int someNumber = 0;

Objective-C'de noktalı virgül, programa hattın bittiğini ve bir sonraki satıra geçmemesini söyler.

Swift ile bir değişken beyan edebilirim

var someNumber:Int = 5

noktalı virgül eklemeyin ve sistem bunun satırın sonu olduğunu bilir.

Bazı dillerin bunu yapmasına ve diğerlerinin yapmamasına ne izin verir? Neden noktalı virgül eklemek için tek tip bir sistem tutmuyorsunuz?


Herkes başka dillerden gelmiyor, bu yüzden tek tip olmadıklarını nasıl bilebilirlerdi? Apple, birçok insanın sevmediği Objective-C parçalarından kurtularak Swift ile daha fazla yeni programcı çekmeyecek mi?
JeffO

2
Birçok Obj-C veterineri Swift'ten memnun değil ve Obj-C'yi çok tercih ediyor. Bu, Apple forumları aracılığıyla görülebilir. Swift sadece 2014'te çıktı ve Swift2.0'ın bu sonbaharda çıkmasıyla birkaç ayda bir DÜĞÜN hatalar ve değişiklikler yapıldıysa. Swift, Obj-C'ye dayanmaktadır, ancak kodlamayı daha basit İngilizce ile öğrenmeyi kolaylaştırmayı amaçlamaktadır.
Memj

Eski derleyici uygulayıcıları tembeldi ve / veya daha basit ayrıştırmayla daha verimli olmaları gerekiyordu. Artık buna gerek yok. Yerel tür çıkarımla aynıdır, yalnızca derleyici yazarınız tembelse ve geliştirici deneyimini umursamıyorsa sahip olmazsınız.
Ebuall

Yanıtlar:


18

Bazı dillerin bunu yapmasına ve diğerlerinin yapmamasına ne izin verir? Neden noktalı virgül eklemek için tek tip bir sistem tutmuyorsunuz?

Robert Swift hakkında iyi bir cevap verdi, genel olarak ayrıştırma ve neden noktalı virgül kullanıp kullanmamaya biraz daha eklemeye çalışacağım.

Programı derlediğinizde, kaynak dosyanız çalıştırılabilir koda dönüştürülmeden önce, ilk adımlardan biri okuma ve ayrıştırma olmak üzere birkaç adım vardır . Ayrıştırma sırasında kodunuz bir dil dizisinden dilin dilbilgisine göre yapılandırılmış bir temsile dönüştürülür . Bunun için kodunuzu oluşturan öğelerin (değişkenler, sabitler, bildirimler vb.) Bir şekilde tanımlanması ve ayrılması gerekir. Aşağıdaki gibi bir beyanda bulunduğunuzda:

int someNumber = 0;

Bir şekilde kavram şöyle açık olması gerekiyor karakterlerin sadece bir dizi var "diye bir 'şey' yaratmak someNumberÇeşidi intve assign 0kendisine" .

Bu, ifadenin tam olarak nerede başladığını ve bittiğini tanımlamayı gerektirir. Şunu düşünün:

int someNumber = 0;
int otherNumber = 1;

Bunların iki farklı beyan olduğunu bilmeniz gerekir. ;Çözümleyici bulana kadar karakterleri okur ve girişimleri sadece tek bir ifade olarak okundu anlamak böylece C benzeri diller, bunun için kullanılıyor. Bu, Robert'ın dediği gibi, aynı satırda aşağıdaki gibi birkaç ifadeye sahip olmasını sağlar:

int someNumber = 0; int otherNumber = 1;

Bunları iki satırda yazmakla tamamen aynı etkiye sahiptir.

Python gibi diğer dillerde her ifadeyi farklı bir satıra koymanız beklenir.

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

Bu yüzden a eklemenize gerek yoktur ;, çünkü dilin kendisi aynı satıra ifade eklemenizi engeller!

Yine de, LISP veya Scheme gibi diğer diller, ifadeleri gruplandırmanın çok farklı bir yoluna sahiptir (tamam, gerçekten ifadeler değildir, ancak şimdilik görmezden gelelim). Yani her şey için sadece paranteziniz var:

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

Yine, gerek yok ;aynı sembolleri (kullandığından sadece ), (şeyleri) diğer dillerdir o {, }, :Neden Gereklidir: sadece Lisp sözdizimi bilir vs. Birisi isteyebilir ;İfadeleriniz sonunda ?

Sadece yabancı bir örnek eklemek için: OCaml ifadelerinin sonunda sadece noktalı virgül kullanmakla kalmıyor ... iki tane var!

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

Niye ya? Bilmiyorum. :)

Farklı diller, farklı amaçlar ve farklı felsefelerle tasarlanmıştır. Tüm diller aynı sözdizimini ve kuralları paylaşıyorsa, muhtemelen aynı şeyleri aynı şekilde yapmanıza izin verir.


4
İyi kapanış cümlesi.
Thomas Eding

Güzel örnekler, ama soruya cevap vermedin.
Robo Robok

Ek veri noktası: Bazı diller C stili ailesine bir tür ters yaklaşım uygular: Ör. HyperTalk, satır sonlarını (noktalı virgül yerine) satır sonu olarak kullanır ve bir ifadeye devam etmek istiyorsanız çıkış satır sonlarını gerektirir birkaç satır üzerinden. Tuhaf bir şekilde, C'nin kendi ön işlemcisi de bu şekilde çalışıyor.
uliwitness

11

Bir ifadenin sonunu sınırlamak için noktalı virgül yerine satır kesmeleri kullanılır.

In Dil rehber: Temelleri diyor:

Diğer birçok dilden farklı olarak, Swift, kodunuzdaki her ifadeden sonra noktalı virgül (;) yazmanızı gerektirmez, ancak isterseniz bunu yapabilirsiniz. Ancak, tek bir satıra birden fazla ayrı ifade yazmak istiyorsanız noktalı virgül gerekir.

Niye ya? Çünkü dil tasarımcıları bunu yapmak istiyordu.

Yukarıdaki ikinci cümle neden noktalı virgüllere ihtiyacınız olmadığına işaret ediyor; ifadelerin çoğu tek satırlıdır. Bu Kabarcık Sıralama örneğini inceleyin; tek satırlı ifadelerin ve noktalı virgüllerin kombinasyonu, VB benzeri, ancak daha az ayrıntılı olan çok temiz bir sözdizimi sağlar:

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

Swift'teki ifadeler genellikle satır sonuyla sona erdiğinden, bir ifadenin sonunu işaretlemek için noktalı virgüllere olan gereksinim azalır. Noktalı virgül kullanan diğer diller bu şekilde çalışmaz; çok satırlı ifadeleri özgürce yazabilirsiniz, ancak derleyicinin ifadenin sona erdiğini bilmesinin tek yolu noktalı virgülünüzü sonuna yerleştirmektir.

İfadeler satır sonu ile bitmediğinde, satır sonunu Swift derleyicisinin önceki satırın devamı olarak tanıyabileceği bir yere koymanız gerekir:

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

2
Son ifade yanlıştır, satır kesmeleri için belirli bir konum yoktur. Okunabilirliği artırmak için kod satırlarınızı girintili ve hizalı tutmak iyidir.
Eneko Alonso

İlginç gerçek: Bunun hata raporlaması üzerinde etkisi vardır. Birçok C derleyicisi (clang özellikle bu konuda iyidir) sözdizimi hatası olan bir ifadenin sonunu bulmak için noktalı virgül kullanır ve bu bilgileri, örneğin eksik kapanma parantezlerini gerçekte eksik oldukları yere daha yakın bildirmek için kullanabilir. Noktalı virgüllerin olmaması, Swift'te bir hata yapılması genellikle aşağıdaki satırın hata içeren öncülüne büzülmesine ve gerçekten garip hata mesajlarına neden olabilir.
uliwitness
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.