七誌の開発Wiki - LLPML/v0
以下の作業は完了して、1.0をリリースしました。 ⇒ LLPML

1.0までの作業

  1. 【済】ASTのオブジェクト化
  2. 【済】ブロックによる変数のスコープ
  3. 【済】関数
  4. 【済】構造体
  5. 【済】制御構造、算術演算
  6. 【済】メンバ関数
  7. 【済】コンストラクタ・デストラクタ
  8. 【済】継承
  9. 【済】簡略記法
  10. 【済】配列
  11. 【済】整数型
  12. 【済】プロパティ
  13. 【済】無名関数
  14. 【済】仮想関数
  15. 【済】関数の戻り値の型
  16. 【済】ラムダ式
  17. 【済】委譲
  18. 【済】クロージャ
  19. 【済】静的メンバ
  20. 【済】new/delete
  21. 【済】クラス
  22. 【済】スコープ解決演算子
  23. 【済】文字列型
  24. 【済】RTTI

開発中のリリース

XMLからの移行


当初計画ではXMLだけですべて記述する方針でしたが、あまりに非効率で自分自身を記述できないと判断しました。1.0までは共存状態のままで進めますが、1.0以降ではXMLはASTのシリアライズ用に特化して、Andromedaを独立した言語として扱えるようにする予定です。


初期のバージョンではXMLでの記述がメインでしたが、記述性の低さから簡略記法(Andromeda言語)に移行しました。以下の記述は古い例です。

図形言語の内部処理用を想定しているため記述性は低いです。ASTをXMLで記述するというイメージです。しかしあまりにも記述性が低くてサンプルの作成だけでも苦労したため、簡略記法を導入しました。


標準出力


以下のC言語と同等のものを作成します。

#include <windows.h>

int main()
{
    HANDLE stdout = GetStdHandle(STD_OUTPUT_HANDLE);
    const char *hello = "Hello, World!\r\n";
    DWORD dummy;
    WriteConsole(stdout, hello, lstrlen(hello), &dummy, NULL);
    return 0;
}

LLPMLでは以下のようになります。

<?xml version="1.0" encoding="utf-8" ?>
<llpml version="0.10.20080205">

<extern module="kernel32.dll" type="std" name="GetStdHandle">
  <arg name="nStdHandle" />
</extern>
<extern module="kernel32.dll" type="std" suffix="W" name="WriteConsole">
  <arg name="hConsoleOutput" />
  <arg name="lpBuffer" />
  <arg name="nNumberOfCharsToWrite" />
  <arg name="lpNumberOfCharsWritten" />
  <arg name="lpReserved" />
</extern>
<extern module="kernel32.dll" type="std" suffix="W" name="lstrlen">
  <arg name="lpString" />
</extern>

<int-declare name="STD_OUTPUT_HANDLE">-11</int-declare>
<var-declare name="stdout">
  <call name="GetStdHandle">
    <int name="STD_OUTPUT_HANDLE" />
  </call>
</var-declare>

<string-declare name="hello">Hello, World!
</string-declare>
<var-declare name="length" />
<call name="WriteConsole">
  <var name="stdout" />
  <string name="hello" />
  <call name="lstrlen"><string name="hello" /></call>
  <ptr name="length" />
  <int>0</int>
</call>

</llpml>

XMLだけでは記述が大変なので、簡略記法が用意されています。

<?xml version="1.0" encoding="utf-8" ?>
<llpml version="0.10.20080205">

<?llp
extern "kernel32.dll" __stdcall
{
  GetStdHandle(nStdHandle);
  __widecharset WriteConsole(
    hConsoleOutput, lpBuffer, nNumberOfCharsToWrite,
    lpNumberOfCharsWritten, lpReserved);
  __widecharset lstrlen(lpString);
}

const int STD_OUTPUT_HANDLE = -11;
var stdout = GetStdHandle(STD_OUTPUT_HANDLE);
const string hello = "Hello, World!\n";
var length;
WriteConsole(stdout, hello, lstrlen(hello), addrof(length), null);
?>

</llpml>