全角スペースを許すプログラミング言語まとめ
全角空白(スペース)を見せるとプログラマーは死ぬとか発狂するとか言われることがありますが、この Unicode 時代に、whitespace として扱う空白をいわゆる半角空白(U+0020)のみに限定する必要性って少なそうですよね。実際に、全角空白(U+3000)もコード中の空白や区切り文字として使えるプログラミング言語をまとめてみました。
C#
whitespace に「Any character with Unicode class Zs」が含まれています。
whitespace:Any character with Unicode class Zs
Horizontal tab character (U+0009)
Vertical tab character (U+000B)
Form feed character (U+000C)
C. Grammar (C#)
Clojure
Clojure 1.4.0 を使って、全角空白を含む単純なコードの実行は確認できましたが、whitespace の仕様を見つけられませんでした。
ECMAScript (CoffeeScript, TypeScript, Node.js)
ECMAScript 2015 (ECMA-262 6th edition) では、White Space に「Unicode “Separator, space”」が含まれています。ECMA-262 3rd edition にも同等の記述があります。
ECMAScript implementations must recognize as WhiteSpace code points listed in the “Separator, space” (Zs) category by Unicode 5.1.
ECMAScript 2015 Language Specification – ECMA-262 6th Edition
JavaScript へコンパイルする、CoffeeScript, TypeScript は、ともに全角空白 OK でした。Node.js 0.12.7 も全角空白 OK(v0.10.25 はエラーとなるようです)。
Haskell
Haskell 98, 2010 とも、whitespace に「any Unicode character defined as whitespace」が含まれています。
whitespace → whitestuff {whitestuff}
whitestuff → whitechar | comment | ncomment
whitechar → newline | vertab | space | tab | uniWhite
uniWhite → any Unicode character defined as whitespace
2 Lexical Structure
HSP
3.4β4 から「スクリプト中の全角スペースをスペース・タブと同様に無視するように修正」されています。
スクリプト中の全角スペースをスペース・タブと同様に無視するように修正
HSP3.4β4を公開しました – おにたま(オニオンソフト)のおぼえがき2014/04/25 3.4β4
子ども向けプログラミング講座のため、エラーにならないよう改修されたのだとか。
Perl 6
Perl 6 から Unicode horizontal whitespace が whitespace 扱いとなります。
Unicode horizontal whitespace is counted as whitespace, but it’s better not to use thin spaces where they will make adjoining tokens look like a single token.
S02
PowerShell
whitespace に「Any character with Unicode class Zs, Zl, or Zp」が含まれています。
whitespace:
Any character with Unicode class Zs, Zl, or Zp
Download Windows PowerShell Language Specification Version 3.0 from Official Microsoft Download Center
R
separators に「Unicode whitespace characters」が含まれています。
10.3.5 Separators
Although not strictly tokens, stretches of whitespace characters (spaces, tabs and formfeeds, on
Windows and UTF-8 locales other Unicode whitespace characters) serve to delimit tokens in
case of ambiguity, (compare x<-5 and x < -5).
R Language Definition
Visual Basic
いわゆる VB.NET です。whitespace に「Unicode blank characters (class Zs) 」が含まれています。
WhiteSpace ::=
< Unicode blank characters (class Zs) > |
< Unicode tab character (0x0009) >
2.1.3 空白
ちなみに Visual Basic は、仕様には書かれていないようですが、全角の予約語、括弧などの記号、数値として入力した全角数字なども、いい感じにコンパイルできるすごいやつです。
ドリトル
大文字/小文字、全角/半角は、文字列の値以外は区別しません。
大文字と小文字/全角と半角
ドリトルのプログラムでは、大文字と小文字、16 ビット文字(いわゆる全角)と8 ビット文字(いわゆる半角)を区別しない。したがって次の各行の名前はいずれも同じものとして扱う。
付属の book.pdf より
なでしこ
日本語プログラミング言語「なでしこ」です。他とは構文が大きく異なりますが、インデントやコード中の見やすさのための空白挿入に全角空白が使えます。
インデントに使える文字は、スペース「 」か全角スペース「 」かタブです。
単語の切り分けと種類
C, C++, Objective-C/C++ (Clang)
C, C++, Objective-C/C++ 自体は、全角空白を許容していないようですが(※あまり調べられていません)、LLVM 上で動作する C, C++, Objective-C/C++ 向けコンパイラー Clang は、Unicode の空白を許容した動作ができるようです。
コンパイルすると、警告「warning: treating Unicode character as whitespace [-Wunicode-whitespace]」が、出力されます。
ダメそうな言語
全角空白は、構文エラーなどとして扱われる言語です。間違いがあれば、コメントください。括弧は、確認したバージョンなど。
- Java (1.8.0)
- PHP (5.5.9)
- Ruby (2.2.0)
- Python (2.7.6, 3.4.0)
- Scala (2.9.2)
- Go (1.2.1)
- D (gdc 4.8.2)
- Erlang (R16B03)
- COBOL (OpenCOBOL 1.1.0)
- F# 3.0 (Open Source Edition / mono-3.2.8.0)
- Bash (GNU bash 4.3.8)
- Pascal (gpc 20070904)
- Groovy (2.4)
- Tcl (tclsh 8.6)
- Rust (1.0.0)