ここでは、未指定の引数を他の関数やデータから「推論」して自動注入する仕組みを作ります。いわゆる「スマートデフォルト自動補完」のイメージです。
完全に自動推論は AI が必要ですが、ここでは 関数の依存関係マップやルールベースで自動注入する形で再現します。
例の設計方針
- 関数の定義は
fn.lengthで必要な引数数を確認する - 未指定の引数は、
resolverMapという「どの関数・どの引数に何を注入するか」を定義したマップから取得 - resolver関数が指定されていれば、動的に生成(推論)して注入
- 実際の呼び出しでは、渡された引数 + 推論値で呼び出す
コード例:依存関係から自動注入
// ===== Resolverマップ =====
// key: 関数名_引数インデックス
// value: 値 or 関数で生成
const resolverMap = {
"greet_0": () => "Guest", // nameが未指定なら"Guest"
"greet_1": (args) => args[0] ? "Hello" : "Hi", // messageはname次第で決定
"calculate_1": (args) => args[0] * 2 // bはaの2倍をデフォルト
};
// ===== スマートラッパー =====
function smartWrapper(fn, resolverMap) {
return function(...args) {
const expected = fn.length;
while (args.length < expected) {
const key = `${fn.name}_${args.length}`;
const resolver = resolverMap[key];
let value = null;
if (typeof resolver === "function") {
value = resolver(args); // 既存の args を渡して推論
} else if (resolver !== undefined) {
value = resolver;
}
args.push(value);
}
return fn(...args);
};
}
// ===== テスト関数 =====
function greet(name, message) {
return `${message}, ${name}!`;
}
function calculate(a, b) {
return a + b;
}
// ===== ラップ =====
const smartGreet = smartWrapper(greet, resolverMap);
const smartCalc = smartWrapper(calculate, resolverMap);
// ===== 呼び出し =====
console.log(smartGreet()); // → Hello, Guest!
console.log(smartGreet("Taro")); // → Hello, Taro!
console.log(smartGreet(undefined)); // → Hi, Guest! (args[0]が undefinedとみなされる)
console.log(smartCalc(5)); // → 5 + 10 = 15 (b = a*2 で推論)
console.log(smartCalc(3, 7)); // → 10 (指定値優先)
JavaScriptポイント解説
- 依存関係を活かす
- 例:
calculate_1はargs[0]を利用して b を推論 - greet では name があるかどうかで message を変える
- 例:
- resolver関数は引数
argsを受け取ることで、呼び出し時のコンテキストを参照できる - defaultだけじゃなく、推論値を注入することで「かなり柔軟な自動補完」が可能
- 未指定 or undefined の場合のみ推論するように調整するとより安全
応用アイデア
- Webフォーム入力補完
- 未入力のフィールドを過去の値や他フィールドから自動補完
- API 呼び出しラッパー
- 省略可能なパラメータを前後の呼び出しやキャッシュから推論
- テスト自動生成
- 引数を自動で推論して関数を呼び出すテストフレームワーク
💡 この仕組みをさらに進化させると:
- **AI推論ライブラリ(GPTなど)**に args を渡して、自然言語や履歴データから自動生成された値を注入できる
- 依存関係グラフを解析して、関数チェーン全体にデフォルト値を流し込む
