理想の静的型付き言語(3)
Swiftとの対比で、Haskellの文法を改めて見直してみた。Swiftは手続き的言語で予約語が多い。そういう意味ではPascal流のAdaや、直接の祖先であるC++の影響が色濃く残っている。こういう手続き型言語は文法が複雑になりがちなのでコンパイラを作るのに手間がかかる。その意味では関数型言語は文法が簡単になりやすい。Haskellの関数型言語らしい、なんとかそのあたりを合体できないものだろうか。
この点、Swiftでの構造体structのアプローチが注目するところだと思う。structはclassではないがclassのイニシャライザの形式で初期化できる。そして、実は、構造体識別子がなくてもコンパイルエラーにならないのだった。いわば、動的に構造体を定義できることになるのではなかろうか。
struct SomeStruct { var member1: Int var member2: String } var aStruct: SomeStruct = SomeStruct(member1: 0, member2: "test") // 文法通り。 var another = (member1: 0, member2: "test") // これもコンパイルが通る! println(another.member1) // 0 println(another.member2) // "test"
この場合、括弧を関数引数とみるのではなく、タプル、と見ると、確かにタプルは異なる型を列挙できるデータ構造である。クロージャも引数のうちなので、タプルというデータ構造があれば、structもclassも同じ表記ができることになる。してみれば、structやclassというキーワードはシンタックスシュガーで、なくてもよいのではないか。LISPぽく表現してみると,,,
(defun SomeStruct (member1 member2) (list member1 member2)) (defvar another (SomeStruct 0 "test")) ;; (1) ; あるいは (defvar another ((lambda (member1 member2) (list member1 member2) 0 "test")) ;;(2)
(1)(2) は同じものである。構造体は、単に順序対に名前を付けているだけということがわかる。