dscribt ~8arj1i-codex/add-typeof-function-and-length-methods

A lightweight embeddable scripting language runtime implemented in D.


To use this package, run the following command in your project's root directory:

Manual usage
Put the following dependency into your project's dependences section:

Dscribt

Dscribt は、D言語で実装され、Dアプリケーションへ組み込みやすい軽量スクリプト言語ランタイムです。

今回強化した点

  • D配列をそのまま受け渡し: int[] などの D の配列を Value.from で Script 配列へ変換
  • D構造体 / Dクラスを扱える: Value.reflect で公開フィールドを Script 側のテーブルとして公開
  • Script側の関数定義: fn name(args) { ... } と無名関数 fn(args) { ... } に対応
  • D風の連結演算子: 文字列/配列の連結は + ではなく ~
  • Luaライクなテーブル: { key = value } リテラル、table.keytable["key"]、代入に対応
  • テーブルの演算子オーバーロード: opBinary<演算子> / opBinaryRight<演算子> を定義可能
  • UFCS + ダックタイピング + メソッドチェーン: obj.method(x) はメソッドか同名関数に委譲
  • 制御構文: if/elsewhileforforeachswitch/case/defaultbreakcontinue
  • 三項演算子: condition ? truthyValue : falsyValue
  • 実行時エラー情報強化: runSafe で失敗時メッセージと簡易スタックトレースを取得
  • モジュール機構: ホスト側 registerModule と script 側 require("name") で読み込み/キャッシュ
  • 最小標準ライブラリ: string, math, table, time, json を同梱
  • Script内保護呼び出し: pcall / xpcall を追加
  • モジュール探索拡張: addModulePath / addModuleLoader / setModuleLoaders を追加
  • メタテーブルAPI: setmetatable / getmetatable を追加
  • 標準ライブラリ拡張: io, os, utf8, debug, coroutine を追加
  • ビット演算子: &, |, ^, <<, >> を追加
  • テーブルリテラル拡張: { [expr] = value } と配列部(連番キー)に対応
  • 複数行コメント: /* ... */ に対応
  • コルーチン基盤: coroutine.create/resume/statusyield に対応
  • 軽量実装: lexer / parser / AST / interpreter のシンプルな構成

サポートする構文

fn buildProfile(label, total) {
    return {
        label = label,
        total = total,
        name = label,
        opBinary~ = fn(self, rhs) {
            return buildProfile(self.label ~ rhs.label, self.total + rhs.total);
        }
    };
}

let numbers = [4, 6, 8];
let profile = buildProfile(stats.name, sum(numbers));
let chained = (profile ~ buildProfile("-elite", 2)).suffix("-v1").suffix("-final");
let grade = chained.total > 10 ? "high" : "normal";

for (let i = 0; i < 3; i = i + 1) {
    if (i == 1) { continue; }
}

switch (grade) {
    case "high":
        return chained.name;
    default:
        return "fallback";
}

使える主な要素

  • let
  • return
  • fn name(...) { ... }
  • fn(...) { ... } 無名関数
  • if (...) ... else ...
  • while (...) ...
  • for (init; condition; increment) ...
  • foreach (item; iterable) ...
  • foreach (index, item; iterable) ...
  • switch (...) { case ...: ... default: ... }
  • break / continue
  • 多値 returnreturn a, b, c
  • 三項演算子 condition ? a : b
  • 文字列/配列連結 a ~ b
  • 配列リテラル []
  • テーブルリテラル { key = value }
  • プロパティ参照 table.key
  • 添字参照 array[0], table["name"]
  • UFCS 呼び出し value.method(arg)(同名関数への委譲を含む)
  • メソッドチェーン value.f().g().h()
  • テーブル演算子オーバーロード opBinary~ など
  • テーブルメタメソッド __index / __newindex / __call / __len
  • 変数 / プロパティ / 添字への代入
  • 多重代入 let a, b = fnCall();, a, b = fnCall();
  • 可変長引数 fn sum(head, tail...) { ... }
  • 算術演算 / 比較演算 / 等価比較 / 論理演算(&&, ||, !
  • ビット演算(&, |, ^, <<, >>

埋め込み例

auto engine = new ScriptEngine();
engine.bind("baseDamage", Value.from([4, 6, 8]));
engine.bind("stats", Value.reflect(stats));
engine.bind("player", Value.reflect(player));
engine.bindNative("sum", (scope const(Value)[] args) {
    long total;
    foreach (value; args[0].arrayValue) {
        total += value.toInt();
    }
    return Value.from(total);
});
auto outcome = engine.runSafe(scriptSource);
if (!outcome.ok) {
    // outcome.errorMessage
    // outcome.stackTrace
}
engine.load(q{
    fn add(a, b) { return a + b; }
});
auto value = engine.call("add", [Value.from(1), Value.from(2)]);
assert(value.toInt() == 3);
engine.registerModule("combat", q{
    let stats = { base = 40 };
    return stats;
});

auto value = engine.run(q{
    let combat = require("combat");
    return combat.base + math.abs(-2);
});

設計方針

  1. D 側が主役: 重い標準ライブラリより、ホストアプリの値や関数を公開する設計を優先
  2. Value を境界型にする: D と Script の間で型変換の責務を明確化
  3. 小さく拡張しやすい: 将来的にクロージャ、最適化、メタテーブル的拡張へ育てやすい構造

Lua 比較で見る機能対応状況(組み込み Script 観点)

対象: 現在の Dscribt 実装(README と source/dscribt/*.d にある構文・ランタイム) 注: Lua 互換の達成は目的ではありません。組み込み Script ランタイムとして必要な機能を把握するための比較です。

分類Lua の代表機能(比較対象)Dscribt の現状組み込み用途での不足点
論理演算and / or / not&& / ` / !`(短絡評価あり)Lua 記法ではなく D 記法
文字列連結..~ を採用言語仕様の違い。ドキュメント整備が必要
ローカル宣言locallet言語仕様の違い。サンプル整備が必要
制御構文repeat ... until / gotowhile / for / foreach / switch のみLua 特有のループ・ジャンプが未対応
多値戻り値return a, b, creturn a, b + 多重代入に対応Dscribt 内部では配列として受け渡し
可変長引数...fn f(args...) に対応Lua 記法ではなく D 風に末尾変数で受ける
テーブル構文{ [expr] = v }, 配列部 + 連番初期化{ [expr] = value } と配列部(連番キー)に対応Lua 配列部(1..n)の完全互換ではなく、内部はテーブルキーで扱う
イテレーションpairs / ipairs / 汎用 forforeach (item; iterable) / foreach (key, value; iterable)D 風 foreach で key/value 走査は可能
メタテーブルsetmetatable / getmetatable / __index ほかsetmetatable / getmetatable + __index / __newindex / __call / __len / __length / __eq / __tostring + opBinary*Lua の全メタメソッド互換は未対応(必要機能中心で拡張)
長さ演算子#valuelength(value) / len(value) / table.len / table.length / string.len + インデックス文脈の $# は未対応(演算子追加予定なし)
エラー制御pcall / xpcall / errorpcall / xpcall / error に対応追加のエラーハンドラ拡張は今後の検討項目
モジュール機構require + package.* 探索registerModule + addModulePath + addModuleLoader + package.require/addPath/addLoader/clearLoaders/loaded/path/loaders + キャッシュpackage は Dscribt 向け最小構成(Lua 完全互換は対象外)
標準ライブラリcoroutine, io, os, debug, utf8 などstring / math / table / time / json + io / os / utf8 / debug / coroutineAPI 面積はまだ最小セット
数値モデルLua 5.3+ の整数/浮動小数 + ビット演算整数/浮動小数 + & / ` / ^ / << / >>` に対応Lua の全ビットAPI(bit32 等)互換は未提供
コメント構文--, --[[ ... ]]# 行コメント + /* ... */Lua 記法コメントとは非互換
OOP 慣用: メソッド定義/呼び出しobj.method(x) + UFCS 委譲メソッド記述の省力構文が少ない
コルーチンcoroutine.create/resume/yieldcoroutine.create/resume/status/wrap/running/isyieldable + yield に対応高度なデバッグ/スケジューリング API は未対応
低レベル API_ENV, _G, rawget/rawset, GC 制御_ENV(name) / rawget / rawset に対応_G や GC 制御などは未対応
型情報typedebug.type + typeof(value)string[]。反映クラスは継承チェーンを返す)返却形式は Lua と非互換(Dscribt 最適化)

優先度付き不足機能の対応状況(組み込み用途)

Lua 互換よりも、組み込み利用で必要な機能を優先しています。

  1. Script 内エラー生成 API(`error` 相当): 対応済み
  2. モジュール API の体系化(`package.*` 相当): 対応済み(Dscribt 向け最小構成)
  3. メタテーブル機能の拡張(`__tostring` / `__eq` など): 対応済み
  4. ℹ️ 長さ演算子 `#`: 非対応(length/len$ を採用)
  5. 制御構文の補完(`repeat ... until`): 未対応
  6. 低レベル環境 API(`rawget/rawset`, `_ENV` など): 部分対応(_ENV(name) / rawget / rawset
  7. コルーチン API の拡張(`wrap` / `running` / `isyieldable`): 対応済み

今後の拡張候補

  • reflected class/struct への書き戻し
  • メソッド呼び出しの自動ブリッジ
  • エラーメッセージの改善
  • bytecode / VM 化による高速化
Authors:
  • runner
Dependencies:
none
Versions:
~xhthfp-codex/evaluate-dscribt-for-d-language-lua-alternative 2026-Mar-25
~x6xc68-codex/enable-method-access-for-d-structs-in-dscript 2026-Mar-24
~so9w2e-codex/identify-missing-features-compared-to-lua 2026-Mar-25
~push-zmwzqutlnpll 2026-Mar-24
~o9annz-codex/list-three-features-to-add 2026-Mar-24
Show all 15 versions
Download Stats:
  • 0 downloads today

  • 0 downloads this week

  • 0 downloads this month

  • 0 downloads total

Score:
0.0
Short URL:
dscribt.dub.pm