ADPは、論理型の言語であるPrologをベースとしていますが、代入やnext述語など、通常の手続き型の考え方も積極的に取り入れています。また、まだマニュアルに書いていませんが、ADPでは、
$value.method
のようなメソッド呼び出しもサポートしています。のでオブジェクト指向プログラムの考え方も取り入れていると言えば取り入れています。もっともメソッド形式の呼び出しを採用した理由はその方がコードがシンプルになる場合があるからです。
ADPの開発目標の1つの目標ですが、マルチパラダイム言語を目指しています。
もう少し噛み砕いでいいますと、特定の考え方に縛られずに便利なものなら何でも取り入れましょう。というスタンスで開発しています。
ADP独特のプログラミングパラダイムというのもないので、そういう意味では、借り物ばかりですが、『エンジニアが開発した言語』らしいかと思います。
先週からちまちまブログとドキュメントページを書いていたのですが、
本日みましたところアクセス数が地味に伸びていたので、今のうちにWindows版だけですが、
開発版(Ver 0.4)をプレ公開します。
ドキュメントも充分でないですが、ドキュメントの一部に実行例を出しているので、ものがあればイメージがつかみやすいかと思います。
ADPのドキュメントページをADP(正確にはADPのWEBページ拡張)で構築しているのですが、やはりというかなんというか細かいバグおよび仕様変更を行っており、まだまだ改修をしています。
ので、このあたりはお含みおき頂ければと思います。
ADPの開発者へのコメントはこちらのコメント欄からお願いいたします。
コメントですが、リアルタイムで反映されます。ネチケットを守って頂くのと、ライセンスを無視した無理な注文は御控えください(場合によってはコメントを削除いたします)。
何分開発者がやっていますのでコメントの返信はタイムラグがあることをご了承ください。
ADPは、Prologからユニフィケーションとバックトラックを借りてきていますが、構文等については、皆様(というか私自身が)とっつきやすいように、普通の言語と同様にしています。
例えば、変数は$で始まるとか、文字列はクオート("や')で囲むとかはPrologとは違います。そのほかホーン節の定義も少し違うのですが、これは私が元としたPrologの方言から来ています。
また、何より決定的に違う面があるのですが、ADPには
・代入
・next述語によるバックトラック後に失敗せずに評価を続ける機能
があります。
代入は副作用を伴いますので、論理型言語であるPrologには代入がありません。しかし、プログラムを作成する上では代入は便利だと考え、ADPは代入をサポートしています。
また、Prologでは、バックトラックで全件を探索するにはfail述語を使い、最終的には失敗でプログラムが終了します。
これはこれでよいのかもしれませんが、ADPではnextという述語を用意し、失敗せずに全件探索を行うことができます。
Prologには、findall述語があり、この述語により全探索の結果をリスト化します。
ADPは代入とnext述語を用いて全探索結果のリスト化ができます。あくまでも私見ですが、代入とnext述語によりADPの方がより表現力が増しているかと思います。
next述語の説明
ADPですが、通常の言語をマスターした人にとって基本的にあまり難しいことを考えなくても良いように、Prologのエッセンス(よいところ)だけを引き出すようにデザインしています。
私は、職業プログラマですが、プログラミング言語を仕事で作る機会はありませんでした。趣味ではちょこちょこやっていた程度です。今回ADPを作るにあったって以下の2点で、C++の仮想関数を使いました。
・パーサー
・ユニフィケーション
ADPの文法ですが、パーサーが書きやすいように作成しています。つまり、変数は$で始まるとか文字列は"や'で始まるとか最初の一文字を読んだ時点で言語要素が判るようにしています。そのタイミングで対応するオブジェクトを作成し、そのオブジェクトでコンパイルを実行するということをやっています。ユニフィケーションも同様にオブジェクト間のマッチングを仮想関数(マルチメソッド)で行っています。
あと、STLを使っているのですが、vectorとかstringを普通に使用していますので、大変楽に開発ができています。
C++を選んだ欠点ですが、他言語インタフェースでCを呼び出す時、オブジェクトの変換が必要になることです。これはオーバーヘッドになりますので、悩ましいところです。もっともC++を呼び出すようにすればオーバーヘッドはなくなりますがC++しかダメってのもな・・・。