オフサイドルール
オフサイドルール(Off-side Rule)とは、一部のプログラミング言語において字下げによって文などのかたまりの範囲(ブロック)を示す規則である。すなわち、そのような言語ではブロックは字下げによって形成され識別される。この用語と考え方は Peter J. Landin によるもので、ここでのoff-sideは「(左端)側から離れる」という意味だが、これはサッカーなどの球技におけるオフサイド規則 (offside law) のもじりと考えられる。
目次 |
定義 [編集]
- 前の行の空白以外の最初の左端寄りのトークンより左端寄りにあるトークンが新たな宣言の開始として解釈される。
-
- — Peter J. Landin、"The Next 700 Programming Languages"[1]
-
(ただし言語によっては似たような見た目になるものの違う規則によっているものもある)
コード例 [編集]
以下の例は Python における字下げブロックを示している(コロンは可読性を高める構文上のマーカーでもある)[1]:
def is_even(a):
if a / 2.0 == a / 2:
return True
else:
return False
他の手法 [編集]
Cで一般化した手法として、余分な空白を無視して中括弧 { と } でブロックを表すという方法がある。この方法の利点は、自動的に読みやすく字下げすることが可能で、しかもそれによってコードの意味が変化しない点である。欠点は、人間が読むとき字下げに目が行ってしまい、括弧で表現されている真の構造を読み違える可能性がある点である。(⇒字下げスタイル)
LISPは、全ての開始と終了を括弧で明示して行う。中括弧を使用する言語と同様、余分な空白は無視される。
他の手法として、ブロックの開始と終了を明確なキーワードで表現する方法がある。中括弧言語と同様字下げには意味が無い。この手法の例としてALGOL系の文法を持つ言語では "begin" でブロックを開始し、"end" でブロックを終了する。構造化BASICなどでは、ブロックはブロックをともなうキーワード自身(例えば "IF")で開始され、前に "END" をつけたキーワード(例えば "ENDIF")で終了する。Bourne Shellの一部の文法などでは、ブロック終了を示すキーワードは開始するキーワードを逆に綴ったものである(例えば、"if" で始まるブロックは "fi" で終了する)。EiffelやRubyでは、ブロックをともなうキーワード自身(たとえば"if")で開始され、"end"で終了する。
オフサイドルールを採用している言語 [編集]
- ISWIM Peter J. Landin が考案した抽象言語。実装されたことはない。
- ABC
- Boo
- Python
- Miranda
- Haskell
- Curry
- Concurrent Clean
- Occam
- Pliant
- F#
参考文献 [編集]
- ^ Landin, Peter J. (3月 1966年). “The next 700 programming languages”. Communications of the ACM 9 (3): 157–166. doi:10.1145/365230.365257.