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

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

このコミットは、Go言語の標準ライブラリである unicode パッケージ内の様々なドキュメントの調整と、一部のコメントの修正を行っています。特に、IsOneOf 関数のコメントから、もはや関連性のない実装の詳細を削除し、他のコメントや変数名の説明をより正確にしています。

コミット

commit 989e611a7b0bf6589b5b70575150d479613e3df6
Author: Rob Pike <r@golang.org>
Date:   Fri Feb 10 14:30:44 2012 +1100

    unicode: various documentation tweaks
    
    The comment on IsOneOf regarding Latin-1 was an implementation detail:
    when the function is called internally, that condition is true. It used to matter,
    but now the comment is a dreg. The function works fine if the character is
    Latin-1, so we just delete the comment.
    
    Fixes #2966.
    
    R=golang-dev, bradfitz
    CC=golang-dev
    https://golang.org/cl/5655047

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

https://github.com/golang/go/commit/989e611a7b0bf6589b5b70575150d479613e3df6

元コミット内容

unicode パッケージ内の様々なドキュメントの微調整。

IsOneOf 関数に関するLatin-1についてのコメントは、実装の詳細でした。関数が内部的に呼び出されるとき、その条件は真です。以前は重要でしたが、今ではそのコメントは不要です。文字がLatin-1であっても関数は正常に動作するため、コメントを削除します。

Fixes #2966.

変更の背景

このコミットの主な背景は、Go言語の unicode パッケージ内のコードコメントの正確性と関連性を向上させることです。特に IsOneOf 関数に関するコメントは、過去の実装の詳細を反映しており、現在の関数の動作とは無関係になっていました。

Go言語の unicode パッケージは、Unicode標準に準拠した文字処理機能を提供します。時間の経過とともに、内部の実装や最適化が進むと、以前は重要だったコメントが陳腐化したり、誤解を招くようになったりすることがあります。このコミットは、そのような「不要なもの(dreg)」となったコメントを削除し、コードの可読性と保守性を高めることを目的としています。

また、Fixes #2966 とあるように、特定のバグまたは改善提案に対応しています。ただし、現在の公開されているGoのIssueトラッカーで #2966 を検索しても、このコミットの内容とは異なる結果(VS Code Go拡張機能の自動インポートに関する問題)が表示されるため、このIssue番号はGoの初期の内部トラッカーや、現在は異なる番号に再割り当てされたIssueを参照している可能性があります。いずれにせよ、このコミットは、コードベースの品質を維持するための継続的な取り組みの一環として行われました。

前提知識の解説

このコミットを理解するためには、以下のGo言語およびUnicodeに関する基本的な概念を理解しておく必要があります。

  • rune: Go言語における rune 型は、Unicodeコードポイントを表す組み込みのエイリアス型です。これは int32 と同じです。Goの文字列はUTF-8でエンコードされたバイト列ですが、rune を使用することで、個々のUnicode文字を扱うことができます。
  • Unicode: 世界中の文字を統一的に扱うための文字コード標準です。各文字には一意の「コードポイント」が割り当てられています。
  • Latin-1 (ISO/IEC 8859-1): 西ヨーロッパ言語で使われる文字を定義した8ビットの文字エンコーディングです。Unicodeの最初の256コードポイント(U+0000からU+00FF)はLatin-1と互換性があります。
  • RangeTable: Goの unicode パッケージで使われるデータ構造で、Unicodeの文字範囲(例: ひらがな、漢字、数字など)を効率的に表現するために使用されます。Is 関数や IsOneOf 関数は、rune が特定の RangeTable に含まれるかどうかを判定するためにこれを利用します。
  • Unicode Categories (General Category): Unicodeでは、各文字が持つ一般的な特性に基づいてカテゴリが割り当てられています。例えば、L は文字(Letter)、N は数字(Number)、P は句読点(Punctuation)、C は制御文字(Control)などを表します。IsControl 関数は、rune が制御文字カテゴリに属するかどうかを判定します。
  • Case Folding (ケースフォールディング): 大文字・小文字の区別をなくして文字列を比較するためのプロセスです。単純なケースフォールディングは、大文字を対応する小文字に変換するような一対一のマッピングを指します。複雑なケースフォールディングでは、複数の rune が関与する場合(例: ドイツ語の ßss にフォールドされるなど)があります。
  • Unicode Versioning: Unicode標準は定期的に更新され、新しい文字やプロパティが追加されます。Goの unicode パッケージは、特定のUnicodeバージョン(このコミット時点では6.0.0)に基づいてテーブルを生成しています。

技術的詳細

このコミットは、主にGo言語の unicode パッケージ内の以下の4つのファイルに影響を与えています。

  1. src/pkg/unicode/graphic.go:

    • IsOneOf 関数のコメントから // The rune is known to be above Latin-1. という行が削除されました。これは、このコメントがもはや関数の動作を正確に反映していない、つまり「実装の詳細」であり「不要なもの」になったためです。IsOneOf 関数は、rune がLatin-1の範囲内であっても正しく機能するため、この制約を示すコメントは誤解を招く可能性がありました。
    • IsControl 関数のコメントが // such as surrogates; use Is(C, rune) to test for them. から // such as surrogates; use Is(C, r) to test for them. に変更されました。これは、引数名 rune を実際の引数名 r に合わせるための単純な修正です。
  2. src/pkg/unicode/letter.go:

    • SpecialCase 型の定義の下にあるBUGコメントが修正されました。
      • 変更前: //BUG(r): Provide a mechanism for full case folding (those that involve // multiple runes in the input or output).
      • 変更後: // BUG(r): There is no mechanism for full case folding, that is, for // characters that involve multiple runes in the input or output. この変更は、コメントの表現をより明確にし、Goのドキュメント慣習に合わせるためのものです。特に、BUG(r): の後にスペースを追加し、文の構造を改善しています。
    • SimpleFold 関数のコメントが修正されました。
      • 変更前: // smallest r >= rune if one exists, or else the smallest r >= 0.
      • 変更後: // smallest rune >= r if one exists, or else the smallest rune >= 0. これは、コメント内の変数名と実際のコードの引数名を一致させるための修正です。SimpleFoldrune を引数に取り、rune を返すため、コメントもそれに合わせて修正されました。
  3. src/pkg/unicode/maketables.go:

    • printCategories 関数内で、Categories 変数のコメントを生成する部分が修正されました。
      • 変更前: fmt.Println("// Categories is the set of Unicode data tables.")
      • 変更後: fmt.Println("// Categories is the set of Unicode category tables.") Categories はUnicodeの「カテゴリ」テーブルのセットであるため、「data tables」よりも「category tables」の方がより正確な表現です。
  4. src/pkg/unicode/tables.go:

    • Categories 変数のコメントが src/pkg/unicode/maketables.go での変更に合わせて修正されました。
      • 変更前: // Categories is the set of Unicode data tables.
      • 変更後: // Categories is the set of Unicode category tables. これは、maketables.go で生成されるコメントと、実際に tables.go で定義されているコメントの一貫性を保つための修正です。

全体として、このコミットは機能的な変更を含まず、コードのコメントとドキュメントの正確性、明確性、および一貫性を向上させることに焦点を当てています。これは、Go言語のコードベースが常に高品質で保守しやすい状態に保たれるようにするための、継続的な改善プロセスの一部です。

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

src/pkg/unicode/graphic.go

--- a/src/pkg/unicode/graphic.go
+++ b/src/pkg/unicode/graphic.go
@@ -53,7 +53,6 @@ func IsPrint(r rune) bool {
 }
 
 // IsOneOf reports whether the rune is a member of one of the ranges.
-// The rune is known to be above Latin-1.
 func IsOneOf(set []*RangeTable, r rune) bool {
 	for _, inside := range set {
 		if Is(inside, r) {
@@ -65,7 +64,7 @@ func IsOneOf(set []*RangeTable, r rune) bool {
 
 // IsControl reports whether the rune is a control character.
 // The C (Other) Unicode category includes more code points
-// such as surrogates; use Is(C, rune) to test for them.
+// such as surrogates; use Is(C, r) to test for them.
 func IsControl(r rune) bool {
 	if uint32(r) <= MaxLatin1 {
 		return properties[uint8(r)]&pC != 0

src/pkg/unicode/letter.go

--- a/src/pkg/unicode/letter.go
+++ b/src/pkg/unicode/letter.go
@@ -60,8 +60,8 @@ type CaseRange struct {
 // Methods of SpecialCase customize (by overriding) the standard mappings.
 type SpecialCase []CaseRange
 
-//BUG(r): Provide a mechanism for full case folding (those that involve
-// multiple runes in the input or output).\n
+// BUG(r): There is no mechanism for full case folding, that is, for
+// characters that involve multiple runes in the input or output.
 
 // Indices into the Delta arrays inside CaseRanges for case mapping.
 const (
@@ -288,7 +288,7 @@ type foldPair struct {
 // SimpleFold iterates over Unicode code points equivalent under
 // the Unicode-defined simple case folding.  Among the code points
 // equivalent to rune (including rune itself), SimpleFold returns the
-// smallest r >= rune if one exists, or else the smallest r >= 0. 
+// smallest rune >= r if one exists, or else the smallest rune >= 0. 
 //
 // For example:
 //	SimpleFold('A') = 'a'

src/pkg/unicode/maketables.go

--- a/src/pkg/unicode/maketables.go
+++ b/src/pkg/unicode/maketables.go
@@ -417,7 +417,7 @@ func printCategories() {
 	fmt.Printf("const Version = %q\\n\\n", version())
 
 	if *tablelist == "all" {
-\t\tfmt.Println("// Categories is the set of Unicode data tables.")
+\t\tfmt.Println("// Categories is the set of Unicode category tables.")
 \t\tfmt.Println("var Categories = map[string] *RangeTable {")
 \t\tfor _, k := range allCategories() {
 \t\t\tfmt.Printf("\\t%q: %s,\\n", k, k)

src/pkg/unicode/tables.go

--- a/src/pkg/unicode/tables.go
+++ b/src/pkg/unicode/tables.go
@@ -7,7 +7,7 @@ package unicode
 // Version is the Unicode edition from which the tables are derived.
 const Version = "6.0.0"
 
-// Categories is the set of Unicode data tables.\n
+// Categories is the set of Unicode category tables.
 var Categories = map[string]*RangeTable{
 	"C":  C,
 	"Cc": Cc,

コアとなるコードの解説

  • src/pkg/unicode/graphic.goIsOneOf コメント削除:
    • 削除されたコメント // The rune is known to be above Latin-1. は、IsOneOf 関数が内部的に呼び出される際に、処理対象の rune がLatin-1の範囲外であることが前提とされていた、という過去の実装詳細を示していました。しかし、現在の実装では、IsOneOf 関数はLatin-1の範囲内の rune に対しても正しく動作するため、このコメントは誤解を招くか、少なくとも不要な情報となっていました。この削除により、コメントがコードの現在の動作と一致し、より簡潔になります。
  • src/pkg/unicode/graphic.goIsControl コメント修正:
    • use Is(C, rune) から use Is(C, r) への変更は、単なる引数名の修正です。関数の引数名が r であるため、コメント内の参照も r に合わせることで、コードとドキュメントの一貫性が保たれます。
  • src/pkg/unicode/letter.go のBUGコメント修正:
    • //BUG(r): の後にスペースが追加され、文の構造がより自然な英語になるように修正されました。これは、Goのコードコメントのスタイルガイドラインに合わせた微調整であり、可読性を向上させます。また、「Provide a mechanism for full case folding」から「There is no mechanism for full case folding」への変更は、現状をより正確に記述しています。つまり、まだ完全なケースフォールディングのメカニズムが存在しないことを明示しています。
  • src/pkg/unicode/letter.goSimpleFold コメント修正:
    • smallest r >= rune から smallest rune >= r への変更は、SimpleFold 関数の引数と戻り値の型が rune であることを考慮したものです。コメントが関数の動作をより正確に反映するように、変数名の順序が調整されました。
  • src/pkg/unicode/maketables.go および src/pkg/unicode/tables.goCategories コメント修正:
    • Unicode data tables から Unicode category tables への変更は、Categories マップが実際にUnicodeの「カテゴリ」(例: C (Control), L (Letter) など)に関するテーブルを保持していることをより正確に表現するためです。これにより、コードの意図がより明確になります。

これらの変更は、Go言語の unicode パッケージのドキュメントとコメントの品質を向上させ、開発者がコードをより正確に理解できるようにすることを目的としています。

関連リンク

参考にした情報源リンク