Universal High-level Languageが欲しいとかいう話

http://d.hatena.ne.jp/nagaShima/20080828/p1
http://www.rubyist.net/~matz/20080826.html#p03
http://lisp-univ-etc.blogspot.com/2008/08/re-acceptable-lisp.html


この辺読んでて思うところを書きます。

  1. LISPの欠点はカッコ多すぎ
  2. 演算子は前置演算子のみ


2点です。

Lisper(またはLisp wannabe)の態度としては、

    * 他人が受け入れられなくともLispは良いものだ(Universalを捨てる)
    * LispのHigh-levelさのうちいくらかをあきらめてUniversalな言語を目指す

のいずれかではないか。いや、純Lisperは後者を目指さないのかもしれないけど。

ということをMatzは言っていて後者がよいのではないかと言っています。
自分も後者がよいと思っていてそのような言語を自分は考えています。


シンプルさを多少犠牲にして、カッコのない優先順位付きの2項演算子や後置演算子等が使える言語がいいのではないかと考えているわけです。


さて、そんな、シンプルだけど2項演算子が使えたりする言語をいくつか並べてみましょう。

SmallTalk

オブジェクト式という式で構成されています。優先順位なしの2項演算子が使えます。
言語仕様の美しさの反面、優先順位がない点が好かれない理由になっています。


Haskell,ML,Clean

式ベースの言語で、2項演算子の定義が出来たりします。
しかし、どうも、この辺の言語の文法はC言語っぽくなくて、
物凄く人気が出る言語になりえない感があります。


Dylan,Nemrle

強力なreadマクロのある言語といえると思います。
しかし、readマクロはなんでも出来すぎです。
LISPでreadマクロ使って2項演算子とか実現して、
それを標準ライブラリにしたような言語です。
Lisperがreadマクロでライブラリ作って使っているようには思えないのです。
なにか、方向が間違えている気がします。

Io

Io言語はメッセージ式というC言語っぽい言語が基本です。
そこに、演算子シンタックスシュガーがかぶさっています。
Lisperの視点で見ると、演算子シンタックスシュガーは邪魔です。
一般ユーザから見ると、言語の表現方法に物足りなさを感じます。


Scala

オブジェクト指向言語でかつ、関数型言語の考えを取り入れています。
また、C言語風の構文をもっています。
しかしながら、マクロの機能は捨て去っています。



そこで自分の提案している expression processor の登場です。
LISPはS式の上にプログラミング言語が成り立っています。
プログラムはユーザーが扱えるデータです。
マクロはプログラムを変換することに他なりません。
そういう性質を持った言語が必要というなら、C式+sumiの方向性がまさにそれにあたります。


C式はオペランド(項)とオペランド(項)をオペレータ(演算子)が結合して式を作ることができるだけのものです。演算子の種類や優先順位はユーザーが定義することも念頭においています。
C言語の関数呼び出しや、配列も演算子として定義できます。


今議論が必要なのは、基本となる構造をもたせるためのデータ構造ではないかと思っています。
LISPでいうConsセル、rubyでいう連想配列です。
自分は最初、名前付き可変長配列を基本データ構造として考え、次に2分木を考えていました。
今考えているのは連想配列です。
LISPの利点は簡単に処理系を作ることができるということです。
LispではConsセルを繋ぎ合わせたものを片っ端から検索することで名前のテーブルを作成できました。
SECDマシンにコンパイルする場合は環境の深さと環境の中の何番目かという2つのパラメータにより、変数にアクセスするようになっていました。
昔は連想配列のようなものはユーザーが簡単に使えるものではなかったのだと思います。
しかし名前のテーブルを使うと自然と連想配列を使いたくなります。
まったくの初心者にとって連想配列の実装は大変なものかもしれません。
しかしながら、最近の言語では連想配列のライブラリが標準でついてきますから安心です。
ですから、連想配列が基本データ構造である、LISPのような存在がよいように思って作ったり
壊したりしています。


Javaのリフレクションを使った実装はありだけど遅い可能性が高いです。
今はJavaのクラス1個で処理系を作ってみていてプロトタイプベースの継承関係などを
実装してみているところです。