オフサイドルールとは
オフサイドルール(Off-side Rule)とは、
プログラミング言語において、コードブロックの範囲を
字下げ(インデント)によって示す規則です。この規則を採用する言語では、
字下げの深さがコードの構造を決定します。この概念は、ピーター・ランディンによって提唱されました。オフサイドという名称は、
サッカーなどの球技におけるオフサイド規則に由来すると考えられています。また、レイアウト・ルールと呼ばれることもあります。
オフサイドルールの定義
ピーター・ランディンは、オフサイドルールを次のように定義しました。
前の行の空白以外の最初のトークンよりも左端にある空白以外のトークンが、新たな宣言の開始として解釈される。
これは、インデントが深くなると新しいブロックが開始されることを意味します。しかし、言語によっては、この規則が厳密に適用されない場合もあります。例えば、
Haskellのレイアウト規則では、特定のキーワードの直後のトークンが開き波括弧でない場合にのみ、改行とインデントに応じて波括弧やセミコロンが補完されます。
オフサイドルールの起源と注意点
オフサイドルールの起源は、ランディンの論文にありますが、英語のWikipediaにある表現は、原文に正確には見当たらないようです。ランディンの論文には、次のような記述があります。
フレーズの最初のシンボルをちょうど含む南東の象限は、フレーズ全体を含まねばならない。ただし、ブラケットによって囲まれた部分がある場合はそこは例外である。
この記述は、現代的に解釈すると、ブロック全体が、`begin`のようなキーワードまたはその次のトークンの最初の文字を含むようにインデントされるべきであることを意味します。オフサイドルールは、コードの可読性を高めるための有効な方法ですが、言語によって実装が異なる点に注意が必要です。
コード例
以下は、オフサイドルールを採用している
Pythonのコード例です。
python
def my_function(x):
if x > 0:
print("Positive")
else:
print("Non-positive")
この例では、`if`文と`else`文のブロックが、それぞれ
字下げによって区別されています。
他のブロック記法
オフサイドルール以外にも、様々なブロック記法が存在します。以下に代表的な例を挙げます。
波括弧
C言語などで一般的に使われる手法で、波括弧 `{` と `}` でブロックを囲みます。この方法は、空白を無視するため、インデントによる影響を受けません。可読性を高めるために
字下げを行うことが多いですが、コードの意味は
字下げによって変化しません。
丸括弧・角括弧
LISPでは、丸括弧または角括弧でブロックを囲みます。LISPのS式は、プログラムコードのリスト構造をそのまま表現したものであり、空白は無視されます。
キーワード
ALGOLでは、`begin`と`end`というキーワードでブロックを囲みます。これは、波括弧を使う手法と抽象構文的には類似しています。また、いくつかの言語では、`if`や`while`などの制御構文が、暗黙的にブロックの開始と終了を示します。例えば、構造化
BASICでは`IF`文で始まり、`ENDIF`で終わります。
Bourne Shellでは、`if`で始まるブロックは`fi`で終わります。
オフサイドルールを採用している言語
オフサイドルールを採用している主な言語は以下の通りです。
ABC
Boo
Clean
CoffeeScript
Curry
F#
Haskell
ISWIM
Miranda
Nim
Occam
Python
Scheme (SRFI 49, SRFI 110)
なでしこ
まとめ
オフサイドルールは、コードの可読性を高めるための効果的な手法です。しかし、言語によって実装が異なるため、使用する言語の仕様を十分に理解しておく必要があります。また、波括弧やキーワードによるブロック記法と比較して、コードの構造がインデントに依存するため、コーディング規約を遵守することが重要です。
参考資料
FOLDOC - Off-side rule (2023年9月3日閲覧)
The Haskell Report - Layout (2023年9月3日閲覧)