Zsh dizisinin ilk öğesinin 0 yerine 1 tarafından dizine eklenmesinin bir nedeni var mı?


27

Modern programlama ve betik dilleri konusundaki deneyimimden, çoğu programcının genellikle bir dizinin ilk elemanına 0 olarak indeks olarak bakmaya alışkın olduğuna inanıyorum . 1
kullanmanın önemli avantajları var mı?

Zsh dışında diğer dizileriyle benzer şekilde davrandığını duyduğuma eminim; eşit derecede uygun olduğu için benim için sorun değil.
Ancak, ksh ve bash gibi daha önce yayımlanan ve yaygın olarak kullanılan kabuk komut dosyası dillerinin tümü 0 kullanıldığından, neden birileri bu ortak "standardı" değiştirmeyi seçsin?

Soruma hemen cevabım "elbette değil" olacaktır;
o zaman bu biraz "özel özellik" kabukları ile ilgili düşünebilirsiniz tek açıklama "sadece biraz daha serin kabuğunu göstermek için bunu yaptılar " olacaktır.

Zsh'den ve tarihinden pek bir şey bilmiyorum ve bu konuda önemsiz teorimin hiçbir anlamı yoktur.

Bunun bir açıklaması var mı? Yoksa kişisel zevkten mi çıktı?


5
Bazı tarihsel araştırmalar (veya rantish ruminations?) 0 1 versus konusuyla ilgili: exple.tive.org/blarg/2013/10/22/citation-needed
thrig

Tarihsel bir nedenden ötürü, muhtemelen cshtek tabanlı bir dizi indeksleme kullanan da geldi .
cuonglm

3
günümüzde, sh farklı olası tercümanlara sahip standart bir dildir (uygulama değil). Bash, ksh ve yash gibi sh dilleri için bu tercümanlardan bazıları uzatma olarak dizileri destekler, ancak standart C dili için bir derleyici gcc gibi dilin bir parçası değildir. Ve tıpkı C için olduğu gibi, bir "sh" tercümanının "resmi" bir uygulaması da yoktur.
Stéphane Chazelas


4
Belki biraz konu dışı, ama alakalı. Romalılar, sıfır yerine birinden başlayarak kapsayıcı sayım kullandılar. Yarından sonraki gün, bize "iki gün ileri", "üç gün ileri" idi. Bugün sıfır sayılmaz, tek saydılar. Sonuç olarak, Mısırlı astronomlarının her dördüncü yılda bir artık bir sıçrama önerdikleri zaman, Romalılar aslında bunu her BCE'de başlayan her üçüncü yılda bir başlattılar. Hatanın düzeltilmesi için BCE 12'ye kadar sürdü.
Harry Weston

Yanıtlar:


32
  • Neredeyse tüm kabuk dizileri (Bourne, csh, tcsh, balık, rc, es, yash) 1'den başlar.
  • En yorumlanmış zamanda dil (erken 90s): awk, tclen azından, ve araçları genellikle kabuğunda kullanılabilen ( cut -f1-3, head -n 3, sort -k1,3, cal 1 2015, comm -1) 1. başlayacak sed, ed, vi1'den sayı onların çizgiler ...
  • zsh, Bourne kabuğunun ve csh'nin en iyisini alır. Bourne kabuğu dizisi $@1'den başlar. Zsh $@(Bourne'deki gibi) veya $argv(csh'deki gibi ) kullanımıyla tutarlıdır . Örneğin, size ilk konumsal parametreyi vermediği kshyerin ne kadar kafa karıştırıcı olduğunu görün ${@:0:1}.
  • Bir kabuk programlama dili olmadan önce bir kullanıcı aracıdır. Çoğu kullanıcının ilk öğeye sahip olması mantıklı geliyor $a[1]. Bu aynı zamanda, elementlerin sayısının son endeksle aynı olduğu anlamına gelir (ksh hariç diğer çoğu kabuklarda olduğu gibi zsh'de, diziler seyrek değildir ).
  • a[1]Çünkü ilk eleman a[-1]sonuncu ile tutarlıdır .

Öyleyse IMO'nun sorusu şöyle olmalı: dizileri 0'dan başlamak için David Korn'ın kafasına neler girdi?


7
Programlama dillerinin çoğunun bu mirası tasarımlarından uzak tutmayı başarmasının insan dillerinde numaralandırmanın tek tabanlı ve dikkat çekici bir dingin olduğu bir hatadır . Tüm bu üzücü sonra sıfır tabanlı indeksleme neredeyse standart olarak kurulmuş, pek çok “kullanıcı odaklı” diller kullanarak “daha basit” olmaya çalışıyorum, geriye aldım yanlış , tekrar indeksleme tek tabanlı. - Şunu söyledi: karışıklığı endekslemekten kaçınmanın en iyi yolu elbette sayısal endeksleri tamamen önlemektir.
Aralık'ta

Burada okumak: "N dizisi ile uğraşırken, elemanları alt simge ile ayırt etmek istediğimiz, ... a), alt simge 1 ile başlarken, alt simge aralığı 1 range i <N + 1; Bununla birlikte, 0, daha güzel olan 0 N. i <N "aralığını verir . TROLL veya STUPID olup olmadığını bilmiyorum, ancak dizilerde 1 ile başlayan abonelikler için "1 ≤ i ≤ N" kullanabilirsiniz. Dizi taramasının sonuna + 1 eklemeye gerek yoktur ve bakış açılarının hiçbiri 1 veya 0 ile başlayan dizinlerin daha iyi olmadığını kanıtlamaz.

1
İnsan bilgisine SONRA 0 eklendiğini haklı gösterebilirsin, ve o zaman bir şekilde işleri mahvetti. theguardian.com/notesandqueries/query/0,5753,-1358,00.html - Yine, sadece bakış açısı meselesi :)

3
Bourne kabuğu dizisi $ @, 0'dan başlar (1 değil) $ 0, çalıştırdığınız programın adıdır. üçüncü noktanızı düzeltmelisiniz
Edward Torvalds

2
@ edwardtorvalds, Hayır, $0konumsal bir parametre değildir. Bir parçası değil $@. "$@"olduğunu "$1" "$2" .... Fonksiyonlara gelince, birçok kabukta, "$@"bunun fonksiyonun argümanları olduğunu görüyorsunuz $0, komut dosyası yolunu tutarken (veya bir komut dosyasını çalıştırmıyorken kabuk argv [0])
Stéphane Chazelas 22:16

7

Bence en mantıklı cevap, yerleşik ters diziden oluşuyor. zsh

myvar=(1 2 3 4)4 öğeli bir diziniz varsa, diyelim ve dördüncü öğeye erişmek istiyorsanız, öyle olacak print $myvar[4]mı?

Bununla birlikte, bu dizinin içindeki öğeleri geriye doğru listeleyen bir döngü oluşturmak istiyorsanız, yalnızca negatif dizinleri kullanma meselesidir:

print $myvar[-1]   # will print 4
print $myvar[-2]   # will print 3
print $myvar[-3]   # will print 2
print $myvar[-4]   # will print 1

Bu sıfırdan başladığından beri bu elementlerden birine ulaşamayacağınızı açıklamalıdır -0.

Bunun ardındaki ikinci neden, muhtemelen zsh üzerindeki değişkenlerle ilgili C kodunun dizi dizinlerini kullanmak intveya double inttanımlamaktır ve negatif sayıları temsil etmek için Two's Complement özelliğini kullandığından , float'ta yapabileceğiniz gibi temsil etmenin bir yolu yoktur -0( Sıfır İmzalı ) nokta değişkenleri.

Gerçekten 0'dan başlayan dizinleri kullanıyorsanız, KSH_ARRAYSbunu düzeltmek için bu seçeneği kullanmanızı öneririm .

Ve @cuonglm yorumunun kancasını alarak, buradacsh uygulanan özellikler zshaçıklanmıştır . Tarihsel bir neden değil, alışkın olanlar için konforlu bir çalışma ortamı sağlamanın bir yolu gibi görünüyorcsh


3
O zaman, bu aynı zamanda ilk ve son dizi öğelerine aynı anda erişmenizi sağlayarak bir dizi taramanın tüm mantığını kırar;) Bir karadelik bile oluşturabilirdi. LOL

3
0 dizinli diziler için -ile değiştirin ~.
mikeserv

1
@mfxx - Hakkında konuşuyordum bash. set elemanları için negatif indeksleri sözdizimi şekeri olarak ele aldığını düşünüyorum , ancak daha sonra bunu yapmaz. hatırlayamıyorum. Benim bakış açıma göre insanlar sadece bir dizin oluşturmalı ve tüm bu kabuk durumlarına doldurdukları herhangi bir şey için dosyalar kullanmalıdır. bu öğeleri istediğiniz şekilde indeksleyebilirsiniz.
mikeserv

1
~İkili inversiyondur. ~0olduğunu -1. (tüm bitler ters çevrilir, negatif sayıların genellikle bit şeklinde nasıl ifade edildiğine dayanır). Belirsiz bir dizide ya da yalnızca 0 indeksli bir elemanı olan bir dizide, bir [0], bir [-0], bir [-1] ve bir [~ 0] size ksh benzeri bir dizide aynı şeyi verecektir.
Stéphane Chazelas

1
@ StéphaneChazelas - evet, işe yaramadığı ~zaman bununla başa -indexçıkmayı hatırladığımı düşünüyorum . Galiba tek yaptığım şeydi ~-index. Evet. Bu doğru geliyor. Evet! ve tabii ki bu aynı zamanda belirsiz elemanlar için de işe yarar. Bu yüzden yukarıdaki yorum olmalı - 0 indeksli dizileri eklemek için ~ . Sanırım sadece -1 kısmı daha kolay ele aldım. Bilmiyorum. şu andaki hafızamın ön saflarına
atlamıyor
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.