「コロン系」の5言語を概観 (ː☆1)


Java/C++/C#/JS/PHPなどなど、広く使われている言語には、セミコロン(;)で区切るものが多い。
対して、python/ruby/scalaなどなど改行で区切ることが推奨される言語も多い。
スクリプト言語愛好者の中には、セミコロンを嫌悪する人がけっこう多く、
セミコロン区切りの言語を使うと負けと感じる者もいたりする(私)。

それはさておき、
命令の区切り文字などにコロン(ː)を用いる言語もけっこう多い。

メジャーどころではpython,ojective-cなど。
古くは1970年代に生み出されたsmalltalk。
そして、注目の新興言語NimとNim上のsmalltalk風な言語spry。

仕事でpythonを使うようになったことがきっかけでこれら5言語を
たまたまお試ししていたところ、これら全てで、
コロン(ː)がいろんな意味で重要な役割を果たしていることに気が付いた。
これらをとりあえず、コロン系言語とでも呼んだメモ書きを、普段セミコロン系言語なSIなんかで疲弊している諸兄への清涼剤としてさらしたい。

あるいはネタ的に書くならばː

  • コロン系諸語と呼ぶと、なんだか言語学っぽく大げさでいい。
  • ゴロが似ているゆうこりんをリスペクトして(?)、コロン星言語と呼ぼうか。 ...ゆうこりん、2017年はママタレからシングルマザー路線に転換だとか...
  • 「コロン☆語」と書けば、なんかのアニメに出てきそう...

コロン系① python

代表的なスクリプト言語、みんなのpythonはコロン表記を多用する。
ifもforもクラス定義もコロンを使って書く。

例:

person.py
class Person():
    def __init__(self, name, age):
        self.name, self.age = name, age
        self.address = None

だいぶ前に流行った基礎文法最速マスターシリーズで比べてみると、
Python基礎文法最速マスターでのコロンの使用頻度は、Ruby基礎文法最速マスターのそれと比べて10倍以上だ。
Pythonが採用したタブ区切りとコロンを併用するスタイルは、他の幾つかの言語でも採用されている(.NET上のBoo,C系言語にコンパイルされるNimなど)。
基礎文法最速マスターシリーズでpythonを上回るコロン使用頻度を誇るのは元祖コロン系言語であるSmalltalkくらいだと思う。

コロン系② objective-c

iOSの開発言語として有名になりすぎたobjective-c。smalltalkの影響を受けたオブジェクト指向の部分でコロン表記が多用されている。
例えば、 nameとpriceを引数とするメソッドsetNameは以下の通り定義される。

method.m
- (void)setName:(NSString *)name price:(NSNumber *)price {
   _name = name;
   _price = price;
}

C系言語なのに、なぜメソッド表記がsetName(name,price)でないのか、については、源流となったsmalltalkを見た方が良いだろう

  • Objective-CはC言語の完全互換であり、Cの関数はC言語の作法で書く。

Objective-C、それなりに実用しようと思っているだけに、あえて一つだけ思い切りdisる記事を近いうちに書く:

  • Objective-C、コロンに限らず、記号大杉。。。

コロン系③ Smalltalk

Smalltalkの歴史的意義については、ニコ動にアップされているSmalltalk開発者アランケイ氏の特別授業特番(NHK)を見ておくと良いのではと考える。

さて、引き続き最速マスターを参考させてもらうと、python以上にコロン使いまくりなSmalltalkの記法が見えてくる。

いくつか引用させてもらう:

配列の定義も、配列へのアクセス(セレクター記述)もコロンを使用。

array.st
array := #(a b c). "配列の定義"
array at: 2.          "配列の2番目の要素の取り出し=> #b "

辞書の定義も、辞書への追加も

dict.st
dict := Dictionary new.
dict at: #a put: 1. "辞書への追加"
dict at: #b put: 2. "  ゛  "
dict at: #c put: 3. "  ゛  "
dict   "=> a Dictionary(#a->1 #b->2 #c->3 ) "

ブロックを活用した無名関数の定義

いわゆる大カッコ表記をブロックと呼び、これで無名関数を定義できる。

block.st
block1 := [:a :b | a + b]. "引数aとbを取る無名関数を変数block1に代入"
block1 value: 3 value: 4.           "block1に値3と4を与える => 7 "

objective-cにも似た記法があるが、Smalltalkの方がスマートな気がする。
気になった方は、Smalltalk-76 と Squeak/Pharo で PPAP ~40年の時空を超えた世代間 Smalltalk 比較~あたりを一読の上、著名なSmalltalkの実行環境(Squeak/Pharoなど)を触ってみると良い。
私は、オブジェクト指向を学ぶには良い本らしい「Squeak入門―過去から来た未来のプログラミング環境」をアマゾンで1円で入手したので、いずれ何か書くかと思う。

コロン系④ Nim

Python風のインデント構造を採用し、C言語にコンパイルされる型あり言語なNimは、Smalltalkに肉薄しそうなコロン多用言語だ。

素敵なメモ書きSyntax of Nimから引用させてもらうと:

forとif

for.nim
for b in 1..10:
  if b == 5:
    continue
  if b == 7:
    break
  echo b
# (1, 2, 3, 4, 6 と一行ずつ出力される)

プロシージャ(関数)の引数と返り値

proc.nim
proc isPositive(i: int): bool = i >= 0

プロシージャ引数と返り値をはじめ、
型定義はjavaなどと同じくコロン表記だ。

procがJSのfunctionやgoのfuncのようなものと分かれば、
読み取りは簡単だろう。

例外処理 try-except-finally

try.nim
var f: File
if open(f, "sometext.txt"):
    try:
      ...  # 何か処理
    except SomeError:  # try節でSomeErrorが発生したらここ
      echo "some error"
    except AnotherError:  # AnotherErrorが発生したらここ
      echo "another error"
    except:  # その他のエラーが発生した場合はここ
      echo "unknown erro"
      raise  # raiseだけの場合、同じ例外を上に投げる
    finally:
      echo "finally"  # 必ず実行される

構文はだいたいPythonと同じとのこと。
Nimのコロン表記は可読性も高く、実行速度も高速。
期待のコンパイル言語だ。

コロン系⑤ Spry on Nim

Nimで記述されたSmalltalkテイストなスクリプト言語Spry。
コロンが多いNim言語との親和性を高めたSmalltalk風スクリプト言語なだけに、
Spryは、ひそかなコロン多用言語ナンバーワン候補かもしれない。

  • もっとコロンだらけな言語を知っていたら教えてほしい。

以下、引用元は公式サイトの言語マニュアル

関数func

関数定義はSmalltalkテイストに行う。引数でコロンを使用

func1.sy
foo = func [:x + 4]
# Prints 9 on stdout
echo foo 5

2引数となると、さらに素敵なコロン表記となる。

func2.sy
add:to: = func [:x + :y]
echo (add: 5 to: 6)   # prints "11"

# And a method in the same way
add:and: = method [self + :x + :y]
echo (3 add: 5 and: 6) # prints "14"

add:~to: やadd:~and: のところは、Smalltalkでいうセレクター記述だ。
Smalltalk同様に、自然言語(英語)っぽい記述となる。

条件ブロック

条件分岐に至っては、ifを採用せず、コロン表記になっている。
他言語では、

if a >10 then 20 else 10

とでも書くだろうところが...:

cond.sy
foo = func [:a > 10 then: [20] else: [10]]

echo foo 5  # prints 10
echo foo 12 # prints 20

うーん、これは、好き嫌いが分かれそうだ。
ただ、記述は非常に簡潔で、Nimときちんと組み合わせられれば楽しそう。
マニュアル後半にはさらに壮絶なコロン表記がどんどん出てくる。

続く...かも。

こちら、Nim Advent Calendar 2016の穴埋めでであることから分かるように、私が注目中の新言語Nim+Spryの源流を探るうちにコロン系なる、共通点を見出したから書いたもの。
委細まで書ききれなかったが、各言語のコロン表記、言語の設計思想まで想像しながら眺めるとなかなか興味深い。おまけとして言っておくと、コロン多用言語は、javaなどで多用されるセミコロン(;)やコンマ(,)の使用が控えめという共通点もあるように思う(objective-cには当てはまらないが)。

それぞれの言語のコロン表記をより掘り下げた後に、また書くかもしれないので一応シリーズものの第一回として(ː☆1)をタイトルにつけておく  ː)