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

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

このコミットは、Go 1.4のリリースノートである doc/go1.4.txt に、text/scanner パッケージに IsIdentRune フィールドが追加されたことを追記するものです。これは、Go言語の字句解析器(スキャナー)の振る舞いをカスタマイズするための重要な変更であり、Go 1.4の変更点として公式ドキュメントに記録されました。

コミット

  • コミットハッシュ: 54375081fe3a81083be697a121f3311528786fb7
  • 作者: Rob Pike r@golang.org
  • 日付: 2014年6月24日 火曜日 11:09:13 -0700
  • コミットメッセージ:
    doc/go1.4.txt: text/scanner: IsIdentRune
    
    R=gri
    CC=golang-codereviews
    https://golang.org/cl/104340043
    

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

https://github.com/golang/go/commit/54375081fe3a81083be697a121f3311528786fb7

元コミット内容

commit 54375081fe3a81083be697a121f3311528786fb7
Author: Rob Pike <r@golang.org>
Date:   Tue Jun 24 11:09:13 2014 -0700

    doc/go1.4.txt: text/scanner: IsIdentRune
    
    R=gri
    CC=golang-codereviews
    https://golang.org/cl/104340043
---
 doc/go1.4.txt | 1 +
 1 file changed, 1 insertion(+)

diff --git a/doc/go1.4.txt b/doc/go1.4.txt
index 3ceb99b7a0..09fe387f37 100644
--- a/doc/go1.4.txt
+++ b/doc/go1.4.txt
@@ -7,4 +7,5 @@
 Please keep the list sorted (as in sort.Strings of the lines).
 
 runtime/race: freebsd is supported (CL 107270043)
 syscall: Setuid, Setgid are disabled on linux platforms. On linux those syscalls operate on the calling thread, not the whole process. This does not match the semantics of other platforms, nor the expectations of the caller, so the operations have been disabled until issue 1435 is resolved (CL 106170043)
+text/scanner: add IsIdentRune field of Scanner. (CL 108030044)
 time: use the micro symbol (µ (U+00B5)) to print microsecond duration (CL 105030046)

変更の背景

このコミットの直接的な背景は、Go 1.4のリリースに向けて、text/scanner パッケージに加えられた新しい機能 IsIdentRune を公式のリリースノート doc/go1.4.txt に反映させることです。

text/scanner パッケージは、Go言語の標準ライブラリの一部であり、テキストからトークンを抽出するための汎用的な字句解析器を提供します。通常、字句解析器は、ソースコードやその他のテキストデータから、キーワード、識別子、数値、文字列などの意味のある単位(トークン)を識別します。識別子(変数名、関数名など)の定義は、プログラミング言語や文脈によって異なる場合があります。

IsIdentRune フィールドの追加は、開発者が Scanner の識別子認識ルールをカスタマイズできるようにすることを目的としています。これにより、Go言語の標準的な識別子ルールに加えて、特定のドメイン固有言語(DSL)やカスタムパーサーにおいて、より柔軟な識別子定義をサポートできるようになります。この機能が追加されたため、Go 1.4の重要な変更点としてドキュメントに記載する必要がありました。

前提知識の解説

このコミットを理解するためには、以下の概念を理解しておく必要があります。

  • 字句解析器(Lexer/Scanner): 字句解析器は、コンパイラやインタプリタの最初のフェーズであり、入力された文字ストリームを、プログラミング言語の文法規則に従って意味のあるトークン(語彙素)のシーケンスに変換するプログラムです。例えば、x = 10 + y というコードは、x(識別子)、=(代入演算子)、10(整数リテラル)、+(加算演算子)、y(識別子)といったトークンに分解されます。
  • Go言語の text/scanner パッケージ: Go言語の標準ライブラリ text/scanner は、汎用的な字句解析器を提供します。これは、Go言語のソースコードだけでなく、様々なテキストベースのフォーマットを解析するのに利用できます。Scanner 型は、入力ソースを読み込み、トークンを生成するためのメソッドを提供します。
  • 識別子(Identifier): プログラミング言語において、変数、関数、型などの名前として使用される文字列です。Go言語の標準的な識別子ルールでは、アンダースコア (_) またはUnicode文字で始まり、その後にアンダースコア、Unicode文字、またはUnicode数字が続くものと定義されています。
  • Unicode rune: Go言語では、文字は rune 型で表されます。rune はUnicodeコードポイントのエイリアスであり、任意のUnicode文字を表現できます。
  • Go 1.4: Go 1.4は、2014年12月にリリースされたGo言語のメジャーバージョンです。このバージョンでは、パフォーマンスの改善、ツールの強化、新しいパッケージや既存パッケージへの機能追加など、多くの変更が加えられました。doc/go1.4.txt は、これらの変更点をまとめたリリースノートの役割を果たします。

技術的詳細

このコミット自体は、text/scanner パッケージの実際のコードを変更するものではなく、Go 1.4のリリースノートに新しい機能の追加を記録するものです。しかし、その背景にある IsIdentRune フィールドの追加は、text/scanner の柔軟性を大幅に向上させる技術的な変更です。

text/scanner パッケージの Scanner 構造体には、IsIdentRune func(ch rune, i int) bool というフィールドが追加されました。

  • IsIdentRune の役割: この関数は、与えられたUnicode文字 (ch) が、識別子の i 番目の文字として有効であるかどうかを判定します。
  • パラメータ:
    • ch: 評価対象のUnicode文字(rune)。
    • i: 識別子内での文字のゼロベースのインデックス。例えば、最初の文字であれば 0、2番目の文字であれば 1 となります。
  • 戻り値: chi 番目の位置で識別子の有効な一部と見なされる場合は true を返し、そうでない場合は false を返します。
  • 制約: IsIdentRune によって有効と見なされる文字のセットは、スキャナー用に定義された空白文字のセットと重複してはなりません。
  • デフォルトの振る舞い: IsIdentRune フィールドが明示的に設定されていない場合(つまり nil の場合)、Scanner はGo言語の標準的な識別子ルールに従って識別子を認識します。このデフォルトの振る舞いでは、通常、アンダースコア、文字(unicode.IsLetter でチェック)、および数字(unicode.IsDigit でチェック、ただし最初の文字以降、つまり i > 0 の場合のみ)が許可されます。
  • 柔軟性: このフィールドは、スキャン処理中にいつでも変更できるため、識別子認識ルールを動的に変更することが可能です。

この機能により、開発者はGo言語の標準的な識別子ルールに縛られることなく、特定のニーズに合わせて識別子の定義を拡張できます。例えば、特定の記号を含む識別子を許可したり、特定の言語の文字セットに合わせた識別子ルールを実装したりすることが可能になります。

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

このコミットにおけるコアとなるコードの変更箇所は、doc/go1.4.txt ファイルへの1行の追加です。

--- a/doc/go1.4.txt
+++ b/doc/go1.4.txt
@@ -7,4 +7,5 @@
 Please keep the list sorted (as in sort.Strings of the lines).
 
 runtime/race: freebsd is supported (CL 107270043)
 syscall: Setuid, Setgid are disabled on linux platforms. On linux those syscalls operate on the calling thread, not the whole process. This does not match the semantics of other platforms, nor the expectations of the caller, so the operations have been disabled until issue 1435 is resolved (CL 106170043)
+text/scanner: add IsIdentRune field of Scanner. (CL 108030044)
 time: use the micro symbol (µ (U+00B5)) to print microsecond duration (CL 105030046)

具体的には、+text/scanner: add IsIdentRune field of Scanner. (CL 108030044) という行が追加されています。

コアとなるコードの解説

追加された行 text/scanner: add IsIdentRune field of Scanner. (CL 108030044) は、Go 1.4のリリースノートに、text/scanner パッケージに IsIdentRune という新しいフィールドが追加されたことを簡潔に記述しています。

この行は、以下の情報を含んでいます。

  • text/scanner: 変更が加えられたパッケージ名。
  • add IsIdentRune field of Scanner.: Scanner 型に IsIdentRune というフィールドが追加されたという変更内容の要約。
  • (CL 108030044): この変更が実際に実装されたGo Gerritの変更リスト(Change List)の番号。このコミット自体はドキュメントの更新であり、実際の機能追加は CL 108030044 で行われました。

この変更は、Go 1.4のユーザーが新しい IsIdentRune 機能の存在を認識し、その利用を検討できるようにするための公式なアナウンスメントとして機能します。リリースノートに記載することで、Go言語の進化と新しい機能の導入が透過的に行われることを保証します。

関連リンク

  • Go 1.4 Release Notes (公式ドキュメント): このコミットが更新したドキュメントの最終版は、Go 1.4の公式リリースノートとして公開されています。
  • Go text/scanner パッケージのドキュメント: IsIdentRune フィールドの詳細な説明が含まれています。

参考にした情報源リンク