Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

[インデックス 13] ファイルの概要

このコミットは、Go言語の初期の仕様書である doc/go_lang.txt における文法定義の誤りを修正するものです。具体的には、配列型 (ArrayType) と関数の戻り値 (Result) の文法記述が修正されています。

コミット

commit 5009237adbaccbaca89eed21f6cb69193b213fbc
Author: Robert Griesemer <gri@golang.org>
Date:   Thu Mar 6 21:24:57 2008 -0800

    - fixed a couple of grammar errors
    
    SVN=111685

GitHub上でのコミットページへのリンク

https://github.com/golang/go/commit/5009237adbaccbaca89eed21f6cb69193b213fbc

元コミット内容

- fixed a couple of grammar errors

変更の背景

このコミットは、Go言語の初期開発段階(2008年)に行われたもので、言語仕様のドキュメント (doc/go_lang.txt) に含まれる文法定義の記述に誤りがあったため、それを修正することを目的としています。言語がまだ活発に設計・進化していた時期であり、仕様書の記述もそれに合わせて調整される必要がありました。特に、文法定義は言語の挙動を正確に記述する上で極めて重要であり、曖昧さや誤りがあると、コンパイラの実装や開発者の理解に混乱を招く可能性があります。

前提知識の解説

このコミットを理解するためには、以下の概念が役立ちます。

  • Go言語の文法定義: Go言語の仕様書では、BNF (Backus-Naur Form) や EBNF (Extended Backus-Naur Form) に似た形式で言語の文法が定義されています。この形式では、= は定義、| は選択、[ ] はオプション(0回または1回)、{ } は繰り返し(0回以上)を意味することが一般的です。
  • 配列型 (ArrayType): Go言語における配列は、固定長で同じ型の要素のシーケンスです。例えば、[5]int は5つの整数を格納できる配列型です。
  • スライス (Slice): Go言語のスライスは、配列への参照のようなもので、可変長です。[]int のように角括弧内に長さを指定しない形式で宣言されます。仕様書では「open array」と記述されることもあります。
  • 関数の戻り値 (Result): Go言語の関数は、0個、1個、または複数の値を返すことができます。複数の値を返す場合は、それらを括弧 () で囲んで型を記述します。

技術的詳細

このコミットでは、doc/go_lang.txt 内の2つの文法定義が修正されています。

  1. ArrayType の定義修正:

    • 修正前: ArrayType = { '[' ArrayLength ']' } ElementType.
      • この定義は、{ ... } が「0回以上の繰り返し」を意味するため、[ ] のブロックが複数回出現することを許容していました。これは、[[5]]int のような多次元配列の型定義を誤って示唆する可能性がありました。また、ElementType の前に [ ] ブロックが全くない場合も許容されるため、int のような基本型が配列型として解釈される可能性も示唆していました。
    • 修正後: ArrayType = '[' [ ArrayLength ] ']' ElementType .
      • { ... }'[' [ ArrayLength ] ']' に変更されました。これは、「[ の後にオプションの ArrayLength が続き、その後に ] が続く」という単一のブロックを意味します。これにより、配列型は必ず [] または [Length] の形式で始まることが明確になり、多次元配列の型定義や、基本型が配列型として誤解される可能性が排除されました。また、行末の . が文法定義の一部として明示的に記述されています。
  2. Result の定義修正:

    • 修正前: Result = [ Type ] | '(' ParameterList ')' .
      • この定義では、単一の戻り値の型が [ Type ] と記述されており、Type がオプションであることを示していました。これは、戻り値の型を省略できるかのような誤解を招く可能性がありました。
    • 修正後: Result = Type | '(' ParameterList ')' .
      • [ Type ]Type に変更されました。これにより、単一の戻り値を持つ関数は、その戻り値の型を必ず明示的に指定する必要があることが明確になりました。Go言語では、単一の戻り値の型を省略することはできません。複数の戻り値の場合は、これまで通り (' ParameterList ')' の形式で記述されます。

これらの修正は、Go言語の文法をより正確に、かつ曖昧さなく記述するための重要な変更であり、言語仕様の厳密性を高めることに貢献しています。

コアとなるコードの変更箇所

--- a/doc/go_lang.txt
+++ b/doc/go_lang.txt
@@ -532,9 +532,9 @@ Any array may be assigned to an open array variable with the
 same element type. Typically, open arrays are used as
 formal parameters for functions.
 
-  ArrayType = { '[' ArrayLength ']' } ElementType.
-  ArrayLength = Expression.
-  ElementType = Type.
+  ArrayType = '[' [ ArrayLength ] ']' ElementType .
+  ArrayLength = Expression .
+  ElementType = Type .
 
   [] uint8
   [2*n] int
@@ -687,7 +687,7 @@ Functions can return multiple values simultaneously.
   Parameters = '(' [ ParameterList ] ')' .
   ParameterList = ParameterSection { ',' ParameterSection } .
   ParameterSection = [ IdentifierList ] Type .
-  Result = [ Type ] | '(' ParameterList ')' .
+  Result = Type | '(' ParameterList ')' .
 
     // Function types
     func ()

コアとなるコードの解説

上記の差分は、doc/go_lang.txt ファイル内のGo言語の文法定義セクションに対する変更を示しています。

  1. ArrayType の変更:

    • - ArrayType = { '[' ArrayLength ']' } ElementType.
      • これは削除された行で、{ ... } 構文が「0回以上の繰り返し」を意味するため、配列の次元指定 [ArrayLength] が複数回繰り返されるか、全く存在しないことを示唆していました。
    • + ArrayType = '[' [ ArrayLength ] ']' ElementType .
      • これは追加された行で、'[' [ ArrayLength ] ']' は「[ の後にオプションの ArrayLength が続き、その後に ] が続く」という単一のブロックを意味します。これにより、配列型は必ず [] または [Length] の形式で始まることが明確になります。また、各定義の行末に . が追加され、文法定義の終端を明示しています。
  2. Result の変更:

    • - Result = [ Type ] | '(' ParameterList ')' .
      • これは削除された行で、[ Type ] が「Type がオプション」であることを示していました。これは、単一の戻り値の型を省略できるかのような誤解を招く可能性がありました。
    • + Result = Type | '(' ParameterList ')' .
      • これは追加された行で、Type が「Type が必須」であることを示しています。これにより、単一の戻り値を持つ関数は、その戻り値の型を必ず明示的に指定する必要があることが明確になります。

これらの変更は、Go言語の文法規則をより正確に、かつ曖昧さなく記述するためのものであり、言語仕様の厳密性を向上させています。

関連リンク

参考にした情報源リンク