Nyashスクリプトプラグインは、最もNyashらしいプラグインシステムです。特別な仕組みは不要で、ユーザー定義Boxがそのままプラグインとして機能します。
💡 「Everything is Box」哲学の究極形
プラグインも、ただのBoxです!
# math_utils.nyash - 数学ユーティリティプラグイン
box MathUtils {
init { }
# 階乗を計算
factorial(n) {
if n <= 1 {
return 1
}
return n * me.factorial(n - 1)
}
# フィボナッチ数列
fibonacci(n) {
if n <= 1 {
return n
}
return me.fibonacci(n - 1) + me.fibonacci(n - 2)
}
# 最大公約数
gcd(a, b) {
if b == 0 {
return a
}
return me.gcd(b, a % b)
}
}
# エクスポート(将来のexport構文)
# export MathUtils
# data_processor.nyash - データ処理プラグイン
box DataProcessor {
init { file, math, cache }
birth(outputPath) {
me.file = new FileBox() # C ABIプラグイン
me.math = new MathBox() # C ABIプラグイン
me.cache = new MapBox() # C ABIプラグイン
}
# CSVデータを処理
processCSV(inputPath, outputPath) {
# ファイル読み込み
local data = me.file.read(inputPath)
local lines = data.split("\n")
# 各行を処理
local results = new ArrayBox()
for line in lines {
local values = line.split(",")
local sum = 0
for value in values {
local num = value.toFloat()
# 三角関数で変換(C ABIのMathBox使用)
local transformed = me.math.sin(num)
sum = sum + transformed
}
results.push(sum)
}
# 結果を保存
me.file.write(outputPath, results.join("\n"))
return results
}
}
# mesh_node.nyash - P2Pメッシュネットワークノード
box MeshNode from P2PBox {
init { routing, peers, messageHandlers }
pack(nodeId, transport) {
# 親クラス(P2PBox)の初期化
from P2PBox.pack(nodeId, transport)
# 追加の初期化
me.routing = new RoutingTable()
me.peers = new MapBox()
me.messageHandlers = new MapBox()
# デフォルトハンドラー登録
me.registerHandler("ping", me.handlePing)
me.registerHandler("route", me.handleRoute)
}
# メッセージハンドラー登録
registerHandler(messageType, handler) {
me.messageHandlers.set(messageType, handler)
}
# オーバーライド: メッセージ送信時にルーティング
override send(target, message) {
# 最適なルートを探す
local nextHop = me.routing.findBestRoute(target)
if nextHop == null {
# 直接送信を試みる
return from P2PBox.send(target, message)
}
# ルーティング経由で送信
local routedMessage = {
type: "route",
finalTarget: target,
payload: message
}
return from P2PBox.send(nextHop, routedMessage)
}
# Pingハンドラー
handlePing(sender, data) {
me.send(sender, {
type: "pong",
timestamp: new TimeBox().now()
})
}
# ルーティングハンドラー
handleRoute(sender, data) {
local finalTarget = data.finalTarget
if finalTarget == me.nodeId {
# 自分宛て
me.processMessage(sender, data.payload)
} else {
# 転送
me.send(finalTarget, data.payload)
}
}
}
# main.nyash
include "plugins/math_utils.nyash"
local utils = new MathUtils()
print(utils.factorial(5)) # 120
# パッケージのインストール
nyash install awesome-math-utils
# パッケージの公開
nyash publish my-cool-plugin
# パッケージの使用
import { MathUtils } from "awesome-math-utils"
local utils = new MathUtils()
# 実行時にプラグインをロード
local pluginCode = new FileBox().read("plugin.nyash")
eval(pluginCode) # プラグインが利用可能に
local processor = new DataProcessor()
# ✅ 良い例:特定の機能に集中
box JSONParser {
parse(text) { ... }
stringify(obj) { ... }
}
# ❌ 悪い例:何でも詰め込む
box UtilityBox {
parseJSON() { ... }
sendEmail() { ... }
calculateTax() { ... }
playSound() { ... }
}
# ✅ 良い例:必要な依存を明示
box DataAnalyzer {
init { fileReader, mathLib, logger }
birth() {
me.fileReader = new FileBox()
me.mathLib = new MathBox()
me.logger = new LoggerBox()
}
}
# ✅ 良い例:適切なエラー処理
box SafeCalculator {
divide(a, b) {
if b == 0 {
throw new Error("Division by zero")
}
return a / b
}
}
特徴 | Nyashスクリプト | C ABI | Nyash ABI |
---|---|---|---|
実装言語 | Nyash | C/C++ | 任意 |
学習コスト | ゼロ | 中 | 高 |
パフォーマンス | 中速 | 最速 | 高速 |
開発効率 | 最高 | 中 | 中 |
デバッグ | 簡単 | 難しい | 中程度 |
配布 | .nyashファイル | .so/.dll | 任意 |
Nyashスクリプトプラグインは「Everything is Box」哲学の究極の実現です。
迷ったらNyashスクリプトプラグインから始めましょう!
必要に応じて、パフォーマンスが必要な部分だけC ABIに、他言語連携が必要な部分だけNyash ABIに移行すれば良いのです。