web-dev-qa-db-ja.com

Zsh配列の最初の要素のインデックスが0ではなく1である理由はありますか?

現代のプログラミング言語とスクリプト言語での私の経験から、ほとんどのプログラマーは一般に配列の最初の要素をでインデックスとして参照することに慣れていると思います。
1を使用することに実質的な利点はありますか?

配列で同様に動作するZsh以外の言語を聞いたことがあると思います。それも同じくらい便利なので、私はそれで結構です。
しかし、以前にリリースされ、広く使用されているkshやbashなどのシェルスクリプト言語はすべて0を使用するため、-why誰かがこの一般的な「標準」を変更することを選択しますか?

私の質問に対する私の直接の答えは「もちろん」ではないでしょう。
そして、シェルに対するこのやや「独占的な機能」に関して私が考えることができる唯一の説明は、「彼らのクールなシェルをもう少し自慢するためにこれをやっただけです "。

Zshもその歴史もあまり知らないので、このことについてのささいな理論が意味をなさない可能性が高いです。

これには説明がありますか?それとも個人的な趣味だけではありませんか?

29
deekin
  • 実質的にすべてのシェル配列(Bourne、csh、tcsh、fish、rc、es、yash)は1から始まります。kshは、私が知っている唯一の例外です(bashがkshをコピーしただけ)。
  • 当時最も解釈された言語(90年代前半):少なくともawktcl、およびシェルから通常使用されるツール(cut -f1-3head -n 3sort -k1,3cal 1 2015comm -1)1から開始します。sededviは、1行目から数えます...
  • zshは、Bourne Shellとcshの最高のものを採用しています。 Bourne Shell配列$@は1から始まります。zshは、$@(Bourneのように)または$argv(cshのように)の処理と一貫しています。これがkshでどれほど混乱しているのかを確認してください。ここで、${@:0:1}は、たとえば最初の位置パラメータを提供しません。
  • シェルは、プログラミング言語になる前のユーザーツールです。ほとんどのユーザーにとって、$a[1]first要素を含めることは理にかなっています。また、要素の数が最後のインデックスと同じであることを意味します(kshを除く他のほとんどのシェルと同様にzshでは、配列はnot sparseです)。
  • 最初の要素のa[1]は、最後の要素のa[-1]と一致しています。

したがって、IMOの質問はむしろ次のようになります:配列を0から開始するためにDavid Kornの頭に入ったもの

34

これに対する最ももっともらしい答えは、zshから組み込まれた逆配列であると思います

4つの要素を持つ配列がある場合、myvar=(1 2 3 4)と言って、4番目の要素にアクセスする場合は、print $myvar[4]になりますよね?

ただし、この配列内の要素を逆方向にリストするループを作成する場合は、負のインデックスを使用するだけです。

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

ゼロから始めて、-0がないため、これらの要素の1つに到達しないため、これは説明する必要があります。

これの背後にある2番目の理由は、おそらくzshの変数に関連するCコードがintまたはdouble intを使用して配列インデックスを定義していること、そして Two's Complement 数値は、浮動小数点変数で行うことができるように、-0Signed zero )を表す方法はありません。

本当に0から始まるインデックスに慣れている場合は、KSH_ARRAYSオプションを使用してこれを修正することをお勧めします。

そして@cuonglmコメントのフックを取って、cshに実装されたzsh機能について説明します here 。これは歴史的な理由ではないようですが、cshを使用している人々に快適な作業環境を提供する方法です

8
user34720