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.key、table["key"]、代入に対応 - テーブルの演算子オーバーロード:
opBinary<演算子>/opBinaryRight<演算子>を定義可能 - UFCS + ダックタイピング + メソッドチェーン:
obj.method(x)はメソッドか同名関数に委譲 - 制御構文:
if/else、while、for、foreach、switch/case/default、break、continue - 三項演算子:
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/statusとyieldに対応 - 軽量実装: 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";
}
使える主な要素
letreturnfn name(...) { ... }fn(...) { ... }無名関数if (...) ... else ...while (...) ...for (init; condition; increment) ...foreach (item; iterable) ...foreach (index, item; iterable) ...switch (...) { case ...: ... default: ... }break/continue- 多値
return(return 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);
});
設計方針
- D 側が主役: 重い標準ライブラリより、ホストアプリの値や関数を公開する設計を優先
- Value を境界型にする: D と Script の間で型変換の責務を明確化
- 小さく拡張しやすい: 将来的にクロージャ、最適化、メタテーブル的拡張へ育てやすい構造
Lua 比較で見る機能対応状況(組み込み Script 観点)
対象: 現在の Dscribt 実装(README と
source/dscribt/*.dにある構文・ランタイム) 注: Lua 互換の達成は目的ではありません。組み込み Script ランタイムとして必要な機能を把握するための比較です。
| 分類 | Lua の代表機能(比較対象) | Dscribt の現状 | 組み込み用途での不足点 | ||
|---|---|---|---|---|---|
| 論理演算 | and / or / not | && / ` | / !`(短絡評価あり) | Lua 記法ではなく D 記法 | |
| 文字列連結 | .. | ~ を採用 | 言語仕様の違い。ドキュメント整備が必要 | ||
| ローカル宣言 | local | let | 言語仕様の違い。サンプル整備が必要 | ||
| 制御構文 | repeat ... until / goto | while / for / foreach / switch のみ | Lua 特有のループ・ジャンプが未対応 | ||
| 多値戻り値 | return a, b, c | return a, b + 多重代入に対応 | Dscribt 内部では配列として受け渡し | ||
| 可変長引数 | ... | fn f(args...) に対応 | Lua 記法ではなく D 風に末尾変数で受ける | ||
| テーブル構文 | { [expr] = v }, 配列部 + 連番初期化 | { [expr] = value } と配列部(連番キー)に対応 | Lua 配列部(1..n)の完全互換ではなく、内部はテーブルキーで扱う | ||
| イテレーション | pairs / ipairs / 汎用 for | foreach (item; iterable) / foreach (key, value; iterable) | D 風 foreach で key/value 走査は可能 | ||
| メタテーブル | setmetatable / getmetatable / __index ほか | setmetatable / getmetatable + __index / __newindex / __call / __len / __length / __eq / __tostring + opBinary* | Lua の全メタメソッド互換は未対応(必要機能中心で拡張) | ||
| 長さ演算子 | #value | length(value) / len(value) / table.len / table.length / string.len + インデックス文脈の $ | # は未対応(演算子追加予定なし) | ||
| エラー制御 | pcall / xpcall / error | pcall / 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 / coroutine | API 面積はまだ最小セット | ||
| 数値モデル | Lua 5.3+ の整数/浮動小数 + ビット演算 | 整数/浮動小数 + & / ` | / ^ / << / >>` に対応 | Lua の全ビットAPI(bit32 等)互換は未提供 | |
| コメント構文 | --, --[[ ... ]] | # 行コメント + /* ... */ | Lua 記法コメントとは非互換 | ||
| OOP 慣用 | : メソッド定義/呼び出し | obj.method(x) + UFCS 委譲 | メソッド記述の省力構文が少ない | ||
| コルーチン | coroutine.create/resume/yield | coroutine.create/resume/status/wrap/running/isyieldable + yield に対応 | 高度なデバッグ/スケジューリング API は未対応 | ||
| 低レベル API | _ENV, _G, rawget/rawset, GC 制御 | _ENV(name) / rawget / rawset に対応 | _G や GC 制御などは未対応 | ||
| 型情報 | type | debug.type + typeof(value)(string[]。反映クラスは継承チェーンを返す) | 返却形式は Lua と非互換(Dscribt 最適化) |
優先度付き不足機能の対応状況(組み込み用途)
Lua 互換よりも、組み込み利用で必要な機能を優先しています。
- ✅ Script 内エラー生成 API(`error` 相当): 対応済み
- ✅ モジュール API の体系化(`package.*` 相当): 対応済み(Dscribt 向け最小構成)
- ✅ メタテーブル機能の拡張(`__tostring` / `__eq` など): 対応済み
- ℹ️ 長さ演算子 `#`: 非対応(
length/lenと$を採用)
- ⏳ 制御構文の補完(`repeat ... until`): 未対応
- ✅ 低レベル環境 API(`rawget/rawset`, `_ENV` など): 部分対応(
_ENV(name)/rawget/rawset)
- ✅ コルーチン API の拡張(`wrap` / `running` / `isyieldable`): 対応済み
今後の拡張候補
- reflected class/struct への書き戻し
- メソッド呼び出しの自動ブリッジ
- エラーメッセージの改善
- bytecode / VM 化による高速化
- ~8arj1i-codex/add-typeof-function-and-length-methods released 5 days ago
- Zero-error-no-warning/Dua
- proprietary
- Authors:
- Dependencies:
- none
- Versions:
-
Show all 15 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 - Download Stats:
-
-
0 downloads today
-
0 downloads this week
-
0 downloads this month
-
0 downloads total
-
- Score:
- 0.0
- Short URL:
- dscribt.dub.pm