Delphi用プリプロセッサ pp4d の仕様

[id:lethevert:20050913:p8]の続き
pp4dの構文 -> [id:lethevert:20050926:p1]

仕様

  • 開発言語には、いま流行り(?)のCleanを使うということで。
  • 通常のpascal(delphi)ソースコードに埋め込む形で記述。
  • インターフェース部を自動生成
  • インデントによるブロック
  • 関数内関数をwhere節として関数の後ろに記述
  • 関数の出現順に影響されない -> forwardが不要
  • オブジェクトのメソッドは、クラス定義の外側で定義
  • クロージャのサポート
  • 宣言不要なローカル変数(型推論?基本型だけならそれほど難しくないかな?)
  • for-each文(配列、リスト関連を同じ方法でアクセス)
  • constructor, destructorは、メソッド名がCreate, Destroyの決め打ちでよし。
  • function, procedureは、わざわざ書かない
  • ;は不要(次の行にわたるときは、最初の文字を記号にする)
  • published, public, protected, privateは、メソッド名の頭に、*, +, #を付けて区別。privateなら不要(-をつける方がいいかな?)
  • virtual;は<、override;は>、virtual; abstract;は<<、overloadは自動判別
  • Inheritedの後のメソッド名は省略
  • Integer -> Int, Boolean -> Bool と略記
  • 略記(任意のシンボルにエイリアスを定義できる)
  • Duck-Typing
  • 総称型
  • 定義済みのクラスに、メソッドを外から追加できる(つまり、標準ライブラリを拡張できる)
  • キャストすることで有効になるメソッド
  • インスタンス化後に、クラスを変更できる
  • 完全なガーベジコレクション
  • elseは要らない?
  • 末尾再帰、相互再帰
  • makeに利用可能なmakefileの依存関係(dep)ファイルの自動生成
  • コンパイル時の範囲チェック
  • コンパイル時の例外チェック
  • 一時変数に束縛された局所的なオブジェクトの暗黙的な開放(部分的で簡易なガーベジコレクション
  • 設計のために予約したメソッドやフィールドを記述するために、reservedキーワードを用意
  • smalltalk風メソッド呼び出し (「put: something at: 1」という記法)
  • 一時的パラメータによる部分適用の一般化
  • 初期化しない変数の禁止
  • メソッド名と変数名の末尾に?と!を使用可能にする
  • 変数にnil禁止とnil許容を区別できる
  • 変数とパラメータと関数の返値に、代入可能な条件を指定できる
  • 変更不可能なオブジェクト(immutable)を定義できる。immutableを変更する場合は、コピーが生成される。
  • 可変長引数 and, or, +, * (前置で使用)
  • 条件文で()を使わない &, | を導入 [id:lethevert:20050927:p2]

コンストラクタの例

::ClassA
+Create name:String
    <- ClassB, InterfaceC
    Name:String = name
    Value:String = GetValue
where
    Inherited name
    GetValue -> String
        Result := name + ’:’ + name;

メソッドの例

::ClassA >
#ProtectedMethod x:Int y:Int -> Int
    Result = LocalCalc x y
where
    LocalCalc x:Int y:Int -> Int
        Result = x + y

コメント

RADで生成されたコードに混ぜると、更新がめんどくさくなるな。
あと、リストが使えないのはどうにも仕方ない。
ところで、これを、本当にやるのかは秘密。
とりあえず、インデントによるブロックとセミコロンの省略あたりから実装開始。
インターフェース部の自動生成の実装を開始。

履歴

2005/9/14 : 新規
2005/9/15 : メソッド関連の追記。記事を移動させ、独立の日付にした。
2005/9/16 : 型に関連する仕様の追加
2005/9/18 : クラス概念の拡張仕様とガーベジコレクション再帰の追加
2005/9/21 : make対応とコンパイル時の機能の追加
2005/9/22 : 局所オブジェクトの解放の追加
2005/9/23 : reservedキーワードとメソッド呼び出しと変数名、メソッド名と変数の代入可能条件とimmutableに関する仕様の追加
2005/9/25 : 可変長引数演算子の追加
2005/10/11 : カリー化 → 部分適用 へ修正。()を使わない条件文の &, |
2005/10/30 : ">","<","<<"の記述位置を変更