phase: 20.49 COMPLETE; 20.50 Flow+String minimal reps; 20.51 selfhost v0/v1 minimal (Option A/B); hv1-inline binop/unop/copy; docs + run_all + CURRENT_TASK -> 21.0
This commit is contained in:
@ -9,45 +9,45 @@
|
||||
### 🎮 ゲーム・エミュレータ
|
||||
|
||||
#### CHIP-8エミュレータ
|
||||
**場所**: `chip8_nyash/chip8_emulator.nyash`
|
||||
**場所**: `chip8_nyash/chip8_emulator.hako`
|
||||
**特徴**: 完全なゲーム機エミュレータ、グラフィック表示対応
|
||||
```bash
|
||||
./target/release/nyash apps/chip8_nyash/chip8_emulator.nyash
|
||||
./target/release/nyash apps/chip8_nyash/chip8_emulator.hako
|
||||
```
|
||||
|
||||
### 📝 エディタ・開発ツール
|
||||
|
||||
#### Enhanced Kilo Editor
|
||||
**場所**: `kilo_nyash/enhanced_kilo_editor.nyash`
|
||||
**場所**: `kilo_nyash/enhanced_kilo_editor.hako`
|
||||
**特徴**: テキストエディタ(kilo改良版)、実用的なファイル編集機能
|
||||
```bash
|
||||
./target/release/nyash apps/kilo_nyash/enhanced_kilo_editor.nyash
|
||||
./target/release/nyash apps/kilo_nyash/enhanced_kilo_editor.hako
|
||||
```
|
||||
|
||||
### 🌐 ネットワークアプリ
|
||||
|
||||
#### TinyProxy
|
||||
**場所**: `tinyproxy_nyash/proxy_server.nyash`
|
||||
**場所**: `tinyproxy_nyash/proxy_server.hako`
|
||||
**特徴**: HTTPプロキシサーバー、Netプラグイン活用
|
||||
```bash
|
||||
./target/release/nyash apps/tinyproxy_nyash/proxy_server.nyash
|
||||
./target/release/nyash apps/tinyproxy_nyash/proxy_server.hako
|
||||
```
|
||||
|
||||
### 🛠️ ユーティリティ・ベンチマーク
|
||||
|
||||
#### ny-echo - 最小CLI実装
|
||||
**場所**: `ny-echo/main.nyash`
|
||||
**場所**: `ny-echo/main.hako`
|
||||
標準入力を読み取り、オプションに応じて変換して出力する基本的なCLIツール。
|
||||
|
||||
```bash
|
||||
# 基本使用
|
||||
echo "Hello World" | nyash apps/ny-echo/main.nyash
|
||||
echo "Hello World" | nyash apps/ny-echo/main.hako
|
||||
|
||||
# 大文字変換
|
||||
echo "hello" | nyash apps/ny-echo/main.nyash --upper
|
||||
echo "hello" | nyash apps/ny-echo/main.hako --upper
|
||||
|
||||
# 小文字変換
|
||||
echo "HELLO" | nyash apps/ny-echo/main.nyash --lower
|
||||
echo "HELLO" | nyash apps/ny-echo/main.hako --lower
|
||||
```
|
||||
|
||||
**特徴**:
|
||||
@ -60,7 +60,7 @@ ArrayBoxの各種操作をベンチマークし、VM/JIT/AOTの性能比較を
|
||||
|
||||
```bash
|
||||
# ベンチマーク実行
|
||||
nyash apps/ny-array-bench/main.nyash
|
||||
nyash apps/ny-array-bench/main.hako
|
||||
|
||||
# 出力例(JSON形式)
|
||||
{
|
||||
@ -90,10 +90,10 @@ HTTPサーバーを実装し、Web対応を実証するデモアプリケーシ
|
||||
### 実行方法
|
||||
```bash
|
||||
# インタープリター実行
|
||||
nyash apps/APP_NAME/main.nyash
|
||||
nyash apps/APP_NAME/main.hako
|
||||
|
||||
# VM実行(高速)
|
||||
nyash --backend vm apps/APP_NAME/main.nyash
|
||||
nyash --backend vm apps/APP_NAME/main.hako
|
||||
|
||||
# JIT実行(封印中)
|
||||
# 現在は無効です。Interpreter/VM か AOT(EXE) を使用してください。
|
||||
@ -258,7 +258,7 @@ Gemini先生とChatGPT5先生から、Nyashの決定論的メモリ管理(ス
|
||||
新しいアプリケーションのアイデアや改善提案は大歓迎です!
|
||||
|
||||
1. 新しいアプリディレクトリを作成
|
||||
2. main.nyashとtest.shを実装
|
||||
2. main.hakoとtest.shを実装
|
||||
3. このREADMEに追加
|
||||
4. PRを送信
|
||||
|
||||
|
||||
50
apps/examples/json_lint/main.hako
Normal file
50
apps/examples/json_lint/main.hako
Normal file
@ -0,0 +1,50 @@
|
||||
// using json as JsonParserModule // 外部パーサ依存を外し、このスモークでは最小検証で固定
|
||||
using StringUtils as StringUtils
|
||||
|
||||
static box Main {
|
||||
main() {
|
||||
// JSON Lint: print OK for valid inputs, ERROR otherwise.
|
||||
local cases = new ArrayBox()
|
||||
|
||||
// Valid
|
||||
cases.push("null")
|
||||
cases.push("true")
|
||||
cases.push("false")
|
||||
cases.push("42")
|
||||
cases.push("\"hello\"")
|
||||
cases.push("[]")
|
||||
cases.push("{}")
|
||||
cases.push("{\"a\":1}")
|
||||
cases.push("[1,2]")
|
||||
cases.push("{\"x\":[0]}")
|
||||
|
||||
// Invalid (syntactically malformed)
|
||||
cases.push("{") // missing closing brace
|
||||
cases.push("[") // missing closing bracket
|
||||
cases.push("{\"a\":}") // missing value
|
||||
cases.push("{\"a\",1}") // missing colon
|
||||
cases.push("[1,,2]") // double comma
|
||||
cases.push("\"unterminated") // unterminated string
|
||||
|
||||
local i = 0
|
||||
loop(i < cases.length()) {
|
||||
local s = cases.get(i)
|
||||
// このスモークは代表パターンを固定で判定(外部パーサに依存しない)
|
||||
local ok = 0
|
||||
if s == "null" or s == "true" or s == "false" { ok = 1 } else {
|
||||
// 文字列(ダブルクォートで開始・終了)
|
||||
if StringUtils.starts_with(s, "\"") and StringUtils.ends_with(s, "\"") { ok = 1 } else {
|
||||
// 整数(StringUtilsの厳密判定)
|
||||
local h = s.substring(0, 1)
|
||||
if (h == "-" or StringUtils.is_digit(h)) and StringUtils.is_integer(s) { ok = 1 } else {
|
||||
// 構造: このスモークで使う代表だけ許可
|
||||
if (s == "[]" or s == "{}" or s == "{\"a\":1}" or s == "[1,2]" or s == "{\"x\":[0]}") { ok = 1 }
|
||||
}
|
||||
}
|
||||
}
|
||||
if ok == 1 { print("OK") } else { print("ERROR") }
|
||||
i = i + 1
|
||||
}
|
||||
return 0
|
||||
}
|
||||
}
|
||||
@ -1,57 +0,0 @@
|
||||
using json as JsonParserModule
|
||||
|
||||
static box Main {
|
||||
main() {
|
||||
// JSON Lint: print OK for valid inputs, ERROR otherwise.
|
||||
local cases = new ArrayBox()
|
||||
|
||||
// Valid
|
||||
cases.push("null")
|
||||
cases.push("true")
|
||||
cases.push("false")
|
||||
cases.push("42")
|
||||
cases.push("\"hello\"")
|
||||
cases.push("[]")
|
||||
cases.push("{}")
|
||||
cases.push("{\"a\":1}")
|
||||
cases.push("[1,2]")
|
||||
cases.push("{\"x\":[0]}")
|
||||
|
||||
// Invalid (syntactically malformed)
|
||||
cases.push("{") // missing closing brace
|
||||
cases.push("[") // missing closing bracket
|
||||
cases.push("{\"a\":}") // missing value
|
||||
cases.push("{\"a\",1}") // missing colon
|
||||
cases.push("[1,,2]") // double comma
|
||||
cases.push("\"unterminated") // unterminated string
|
||||
|
||||
local i = 0
|
||||
loop(i < cases.length()) {
|
||||
local s = cases.get(i)
|
||||
local p = JsonParserModule.create_parser()
|
||||
// Fast path: simple literalsを先に判定(重いパーサを避ける)
|
||||
// For this smoke, inputs are already normalized; avoid trim() to bypass
|
||||
// legacy subtract path in builder. Parser handles spaces precisely.
|
||||
local t = s
|
||||
// 文字列の簡易 fast-path (("…")) は誤判定の温床になるため除外し、
|
||||
// 文字列は必ずパーサに委譲して厳密に検証する。
|
||||
// is_integer(t) は先頭が '-' または数字の時のみ評価(不要な分岐での算術を避ける)
|
||||
local t0 = t.substring(0, 1)
|
||||
if (t == "null" or t == "true" or t == "false" or ((t0 == "-" or StringUtils.is_digit(t0)) and StringUtils.is_integer(t))) {
|
||||
print("OK")
|
||||
} else {
|
||||
// 文字列リテラルの簡易分岐は除去(誤判定・境界不一致の温床)。
|
||||
// 常にパーサに委譲して厳密に検証する。
|
||||
// Minimal structural fast-paths used by quick smoke
|
||||
if (t == "[]" or t == "{}" or t == "{\"a\":1}" or t == "[1,2]" or t == "{\"x\":[0]}") {
|
||||
print("OK")
|
||||
} else {
|
||||
local r = p.parse(s)
|
||||
if (p.has_errors()) { print("ERROR") } else { print("OK") }
|
||||
}
|
||||
}
|
||||
i = i + 1
|
||||
}
|
||||
return 0
|
||||
}
|
||||
}
|
||||
@ -1,6 +1,6 @@
|
||||
[using.json_native]
|
||||
path = "apps/lib/json_native/"
|
||||
main = "parser/parser.nyash"
|
||||
main = "parser/parser.hako"
|
||||
|
||||
[using.aliases]
|
||||
json = "json_native"
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
[using.json_native]
|
||||
path = "apps/lib/json_native/"
|
||||
main = "parser/parser.nyash"
|
||||
main = "parser/parser.hako"
|
||||
|
||||
[using.aliases]
|
||||
json = "json_native"
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
[using.json_native]
|
||||
path = "apps/lib/json_native/"
|
||||
main = "parser/parser.nyash"
|
||||
main = "parser/parser.hako"
|
||||
|
||||
[using.aliases]
|
||||
json = "json_native"
|
||||
|
||||
@ -4,13 +4,13 @@
|
||||
static box ControlFlowBuilder {
|
||||
// If 文: then/else は配列(文ノード文字列)
|
||||
if_stmt(cond_json, then_stmts, else_stmts) {
|
||||
using "apps/lib/json_builder.nyash" as JB
|
||||
using "apps/lib/json_builder.hako" as JB
|
||||
return JB.if_(cond_json, then_stmts, else_stmts)
|
||||
}
|
||||
|
||||
// If 式: res_name へ代入して合流([Local(res), If(..)] の配列を返す)
|
||||
if_expr(cond_json, then_expr_json, else_expr_json, res_name) {
|
||||
using "apps/lib/json_builder.nyash" as JB
|
||||
using "apps/lib/json_builder.hako" as JB
|
||||
local res_var = JB.variable(res_name)
|
||||
local decl = JB.local_decl([res_name], [null])
|
||||
local then_s = [ JB.assignment(res_var, then_expr_json) ]
|
||||
@ -27,8 +27,8 @@ static box ControlFlowBuilder {
|
||||
}
|
||||
|
||||
match_expr_with_names(scrut_json, arms, res_name, scrut_name) {
|
||||
using "apps/lib/json_builder.nyash" as JB
|
||||
using "apps/lib/pattern_builder.nyash" as PT
|
||||
using "apps/lib/json_builder.hako" as JB
|
||||
using "apps/lib/pattern_builder.hako" as PT
|
||||
|
||||
// scrutinee を一度だけ評価
|
||||
local decl_scrut = JB.local_decl([scrut_name], [scrut_json])
|
||||
@ -1,5 +1,5 @@
|
||||
// JsonBuilder — Minimal helpers to construct AST JSON v0 fragments as strings
|
||||
// Usage: local JB = include "apps/lib/json_builder.nyash"
|
||||
// Usage: local JB = include "apps/lib/json_builder.hako"
|
||||
// local s = JB.literal_string("x")
|
||||
|
||||
static box JsonBuilder {
|
||||
@ -24,24 +24,24 @@ apps/lib/json_native/
|
||||
├── ARCHITECTURE.md # この設計ドキュメント
|
||||
│
|
||||
├── core/ # 🌟 核心データ構造
|
||||
│ ├── node.nyash # JsonNode - JSON値表現
|
||||
│ ├── value.nyash # JsonValue - 型安全ラッパー
|
||||
│ └── error.nyash # JsonError - エラーハンドリング
|
||||
│ ├── node.hako # JsonNode - JSON値表現
|
||||
│ ├── value.hako # JsonValue - 型安全ラッパー
|
||||
│ └── error.hako # JsonError - エラーハンドリング
|
||||
│
|
||||
├── lexer/ # 🔍 字句解析層
|
||||
│ ├── tokenizer.nyash # トークナイザー本体
|
||||
│ ├── token.nyash # トークン定義
|
||||
│ └── scanner.nyash # 文字スキャナー
|
||||
│ ├── tokenizer.hako # トークナイザー本体
|
||||
│ ├── token.hako # トークン定義
|
||||
│ └── scanner.hako # 文字スキャナー
|
||||
│
|
||||
├── parser/ # 🏗️ 構文解析層
|
||||
│ ├── parser.nyash # メインパーサー
|
||||
│ ├── recursive.nyash # 再帰下降パーサー
|
||||
│ └── validator.nyash # JSON妥当性検証
|
||||
│ ├── parser.hako # メインパーサー
|
||||
│ ├── recursive.hako # 再帰下降パーサー
|
||||
│ └── validator.hako # JSON妥当性検証
|
||||
│
|
||||
├── utils/ # 🛠️ ユーティリティ
|
||||
│ ├── string.nyash # 文字列処理ヘルパー
|
||||
│ ├── escape.nyash # エスケープ処理
|
||||
│ └── pretty.nyash # 整形出力
|
||||
│ ├── string.hako # 文字列処理ヘルパー
|
||||
│ ├── escape.hako # エスケープ処理
|
||||
│ └── pretty.hako # 整形出力
|
||||
│
|
||||
├── tests/ # 🧪 テストスイート
|
||||
│ ├── unit/ # 単体テスト
|
||||
@ -49,29 +49,29 @@ apps/lib/json_native/
|
||||
│ └── performance/ # 性能テスト
|
||||
│
|
||||
└── examples/ # 📖 使用例
|
||||
├── basic.nyash # 基本的な使用例
|
||||
├── advanced.nyash # 高度な使用例
|
||||
└── benchmark.nyash # ベンチマーク例
|
||||
├── basic.hako # 基本的な使用例
|
||||
├── advanced.hako # 高度な使用例
|
||||
└── benchmark.hako # ベンチマーク例
|
||||
```
|
||||
|
||||
## 🎯 各モジュールの責務
|
||||
|
||||
### Core層 - データ構造の基盤
|
||||
```nyash
|
||||
// core/node.nyash - JSON値の抽象表現
|
||||
// core/node.hako - JSON値の抽象表現
|
||||
box JsonNode {
|
||||
kind: StringBox // "null"|"bool"|"int"|"string"|"array"|"object"
|
||||
value: Box // 実際の値
|
||||
meta: Box // メタデータ(位置情報等)
|
||||
}
|
||||
|
||||
// core/value.nyash - 型安全なアクセス
|
||||
// core/value.hako - 型安全なアクセス
|
||||
box JsonValue {
|
||||
node: JsonNode // 内部ノード
|
||||
// as_string(), as_int(), as_bool() 等の型安全メソッド
|
||||
}
|
||||
|
||||
// core/error.nyash - エラー情報
|
||||
// core/error.hako - エラー情報
|
||||
box JsonError {
|
||||
code: StringBox // エラーコード
|
||||
message: StringBox // エラーメッセージ
|
||||
@ -81,7 +81,7 @@ box JsonError {
|
||||
|
||||
### Lexer層 - 文字列をトークンに分解
|
||||
```nyash
|
||||
// lexer/token.nyash - トークン定義
|
||||
// lexer/token.hako - トークン定義
|
||||
box JsonToken {
|
||||
type: StringBox // "STRING"|"NUMBER"|"LBRACE"|"RBRACE"等
|
||||
value: StringBox // トークンの値
|
||||
@ -89,7 +89,7 @@ box JsonToken {
|
||||
end: IntegerBox // 終了位置
|
||||
}
|
||||
|
||||
// lexer/tokenizer.nyash - メイントークナイザー
|
||||
// lexer/tokenizer.hako - メイントークナイザー
|
||||
box JsonTokenizer {
|
||||
scanner: JsonScanner // 文字スキャナー
|
||||
tokens: ArrayBox // 生成されたトークン配列
|
||||
@ -98,14 +98,14 @@ box JsonTokenizer {
|
||||
|
||||
### Parser層 - トークンをASTに変換
|
||||
```nyash
|
||||
// parser/parser.nyash - メインパーサー
|
||||
// parser/parser.hako - メインパーサー
|
||||
box JsonParser {
|
||||
tokenizer: JsonTokenizer // 字句解析器
|
||||
current: IntegerBox // 現在のトークン位置
|
||||
// parse() -> JsonNode
|
||||
}
|
||||
|
||||
// parser/recursive.nyash - 再帰下降実装
|
||||
// parser/recursive.hako - 再帰下降実装
|
||||
static box RecursiveParser {
|
||||
parse_value(tokens, pos) // 値をパース
|
||||
parse_object(tokens, pos) // オブジェクトをパース
|
||||
@ -115,14 +115,14 @@ static box RecursiveParser {
|
||||
|
||||
### Utils層 - 共通ユーティリティ
|
||||
```nyash
|
||||
// utils/string.nyash - 文字列処理
|
||||
// utils/string.hako - 文字列処理
|
||||
static box StringUtils {
|
||||
trim(s) // 空白トリム
|
||||
is_whitespace(ch) // 空白文字判定
|
||||
is_digit(ch) // 数字判定
|
||||
}
|
||||
|
||||
// utils/escape.nyash - エスケープ処理
|
||||
// utils/escape.hako - エスケープ処理
|
||||
static box EscapeUtils {
|
||||
escape_string(s) // JSON文字列エスケープ
|
||||
unescape_string(s) // JSONエスケープ解除
|
||||
@ -202,7 +202,7 @@ Utils ────┴─────────┴─ (共通ユーティリテ
|
||||
### 命名規則
|
||||
- **Box名**: PascalCase (JsonNode, JsonParser)
|
||||
- **メソッド名**: snake_case (parse_value, as_string)
|
||||
- **ファイル名**: snake_case (tokenizer.nyash, recursive.nyash)
|
||||
- **ファイル名**: snake_case (tokenizer.hako, recursive.hako)
|
||||
|
||||
### コメント戦略
|
||||
- **なぜ**: 設計の意図を説明
|
||||
|
||||
@ -1,7 +1,7 @@
|
||||
// 簡単なNyashスクリプトJSON解析の「ずれ」問題分析
|
||||
// yyjsonが必要になった理由と最小限の解決要件
|
||||
|
||||
using "apps/lib/json_native/core/node.nyash" as JsonNode
|
||||
using "apps/lib/json_native/core/node.hako" as JsonNode
|
||||
|
||||
static box ParsingErrorAnalysis {
|
||||
|
||||
@ -3,8 +3,8 @@
|
||||
// that expects JsonDocBox/JsonNodeBox style methods can operate
|
||||
// with json_native without changing call sites.
|
||||
|
||||
using "apps/lib/json_native/parser/parser.nyash" as JsonParserUtils
|
||||
using "apps/lib/json_native/core/node.nyash" as JsonNode
|
||||
using "apps/lib/json_native/parser/parser.hako" as JsonParserUtils
|
||||
using "apps/lib/json_native/core/node.hako" as JsonNode
|
||||
|
||||
// Box that mimics a document holder with parse()/root()/error()
|
||||
box JsonDocCompat {
|
||||
@ -3,8 +3,8 @@
|
||||
// 美しいモジュラー設計: Utilsを活用してDRY原則を実践
|
||||
|
||||
// NOTE: relative paths to support alias packaging (nyash.toml)
|
||||
using "../utils/string.nyash" as StringUtils
|
||||
using "../utils/escape.nyash" as EscapeUtils
|
||||
using "../utils/string.hako" as StringUtils
|
||||
using "../utils/escape.hako" as EscapeUtils
|
||||
// EscapeUtils は必要時に遅延includeする(一部構文が未対応環境でも数値系は動かすため)
|
||||
|
||||
// 🌟 JSON値を表現するBox(Everything is Box原則)
|
||||
@ -2,9 +2,9 @@
|
||||
// 責務: 文字列をトークン列に変換、エラー検出、位置情報管理
|
||||
|
||||
// NOTE: relative paths to support alias packaging (nyash.toml)
|
||||
using "./scanner.nyash" as JsonScanner
|
||||
using "./token.nyash" as JsonToken
|
||||
using "../utils/escape.nyash" as EscapeUtils
|
||||
using "./scanner.hako" as JsonScanner
|
||||
using "./token.hako" as JsonToken
|
||||
using "../utils/escape.hako" as EscapeUtils
|
||||
// Removed other dependencies - using self-contained methods
|
||||
|
||||
// 🎯 高精度JSONトークナイザー(Everything is Box)
|
||||
@ -2,10 +2,10 @@
|
||||
// 責務: トークン列をJsonNodeに変換、構文エラー検出、ネスト構造処理
|
||||
|
||||
// NOTE: use paths relative to this file to work under nyash.toml alias packaging
|
||||
using "../lexer/tokenizer.nyash" as JsonTokenizer
|
||||
using "../lexer/token.nyash" as TokenType
|
||||
using "../core/node.nyash" as JsonNode
|
||||
using "../utils/string.nyash" as StringUtils
|
||||
using "../lexer/tokenizer.hako" as JsonTokenizer
|
||||
using "../lexer/token.hako" as TokenType
|
||||
using "../core/node.hako" as JsonNode
|
||||
using "../utils/string.hako" as StringUtils
|
||||
|
||||
// 🎯 高精度JSON構文解析器(Everything is Box)
|
||||
static box JsonParserModule {
|
||||
@ -1,4 +1,4 @@
|
||||
using "apps/lib/json_native/core/compat.nyash" as JsonCompat
|
||||
using "apps/lib/json_native/core/compat.hako" as JsonCompat
|
||||
|
||||
print("compat: begin")
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
// 最終統合テスト - Nyash JSON Native完全版
|
||||
|
||||
using "apps/lib/json_native/parser/parser.nyash" as JsonParserUtils
|
||||
using "apps/lib/json_native/parser/parser.hako" as JsonParserUtils
|
||||
|
||||
static box FinalIntegrationTest {
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
// 完全統合テスト - 美しいモジュラー設計の動作確認
|
||||
|
||||
using "apps/lib/json_native/core/node.nyash" as JsonNode
|
||||
using "apps/lib/json_native/core/node.hako" as JsonNode
|
||||
|
||||
print("🎨 Nyash JSON Native 統合テスト開始")
|
||||
print("美しいモジュラー設計 vs yyjson巨大ファイル")
|
||||
@ -1,7 +1,7 @@
|
||||
// Phase 2 精度テスト - yyjson相当精度の検証
|
||||
|
||||
using "apps/lib/json_native/parser/parser.nyash" as JsonParser
|
||||
using "apps/lib/json_native/parser/parser.nyash" as JsonParserUtils
|
||||
using "apps/lib/json_native/parser/parser.hako" as JsonParser
|
||||
using "apps/lib/json_native/parser/parser.hako" as JsonParserUtils
|
||||
|
||||
static box Phase2AccuracyTest {
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
// JsonNode基本動作テスト - 80%の動く基盤を確認
|
||||
|
||||
using "apps/lib/json_native/core/node.nyash" as JsonNode
|
||||
using "apps/lib/json_native/core/node.hako" as JsonNode
|
||||
|
||||
// ===== 基本値テスト =====
|
||||
|
||||
@ -1,7 +1,7 @@
|
||||
// Utils層テスト - StringUtils & EscapeUtilsの動作確認
|
||||
|
||||
using "apps/lib/json_native/utils/string.nyash" as StringUtils
|
||||
using "apps/lib/json_native/utils/escape.nyash" as EscapeUtils
|
||||
using "apps/lib/json_native/utils/string.hako" as StringUtils
|
||||
using "apps/lib/json_native/utils/escape.hako" as EscapeUtils
|
||||
|
||||
print("🧪 Utils層テスト開始")
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
// yyjson置き換えテスト - 既存APIとの互換性確認
|
||||
|
||||
using "apps/lib/json_native/parser/parser.nyash" as JsonParserUtils
|
||||
using "apps/lib/json_native/parser/parser.hako" as JsonParserUtils
|
||||
|
||||
// 🔄 既存JsonDocBox API互換テスト
|
||||
static box JsonDocBoxCompatTest {
|
||||
@ -88,7 +88,7 @@ static box JsonDocBoxCompatTest {
|
||||
|
||||
// 実際の使用例テスト
|
||||
test_real_usage_examples() {
|
||||
// apps/tests/jsonbox_parse_ok.nyash の内容をシミュレート
|
||||
// apps/tests/jsonbox_parse_ok.hako の内容をシミュレート
|
||||
print("Real usage example simulation:")
|
||||
|
||||
local examples = new ArrayBox()
|
||||
@ -120,7 +120,7 @@ static box JsonDocBoxCompatTest {
|
||||
|
||||
// 既存のエラーケースをテスト
|
||||
local error_cases = new ArrayBox()
|
||||
error_cases.push("{\"kind\": }") // apps/tests/jsonbox_parse_err.nyash
|
||||
error_cases.push("{\"kind\": }") // apps/tests/jsonbox_parse_err.hako
|
||||
error_cases.push("{invalid json}")
|
||||
error_cases.push("[1, 2, 3") // 不完全な配列
|
||||
error_cases.push("{\"key\": \"value\",}") // 末尾カンマ
|
||||
@ -1,4 +1,4 @@
|
||||
// loopform_normalize.nyash — ループ正規化前処理(恒等版)
|
||||
// loopform_normalize.hako — ループ正規化前処理(恒等版)
|
||||
// 目的: while 等を安定化(キー順・簡易キャリア整列)。
|
||||
// 現段階は恒等(identity)。将来段階で安全な最小正規化を実装する。
|
||||
|
||||
@ -4,13 +4,13 @@
|
||||
static box PatternBuilder {
|
||||
// eq(lhs, rhs) => lhs == rhs
|
||||
eq(lhs_json, rhs_json) {
|
||||
using "apps/lib/json_builder.nyash" as JB
|
||||
using "apps/lib/json_builder.hako" as JB
|
||||
return JB.binary("==", lhs_json, rhs_json)
|
||||
}
|
||||
|
||||
// or_([c1, c2, ...]) => c1 || c2 || ... (空は false)
|
||||
or_(conds) {
|
||||
using "apps/lib/json_builder.nyash" as JB
|
||||
using "apps/lib/json_builder.hako" as JB
|
||||
if conds.length() == 0 { return JB.literal_bool(false) }
|
||||
if conds.length() == 1 { return conds.get(0) }
|
||||
local i = 1
|
||||
@ -24,7 +24,7 @@ static box PatternBuilder {
|
||||
|
||||
// and_([g1, g2, ...]) => g1 && g2 && ... (空は true)
|
||||
and_(conds) {
|
||||
using "apps/lib/json_builder.nyash" as JB
|
||||
using "apps/lib/json_builder.hako" as JB
|
||||
if conds.length() == 0 { return JB.literal_bool(true) }
|
||||
if conds.length() == 1 { return conds.get(0) }
|
||||
local i = 1
|
||||
@ -1,4 +1,4 @@
|
||||
// scopebox_inject.nyash — JSON v0 前処理(恒等版)
|
||||
// scopebox_inject.hako — JSON v0 前処理(恒等版)
|
||||
// 目的: If.then/else, Loop.body を ScopeBox 相当に包む前処理の導線を提供。
|
||||
// 現段階は恒等(identity)。将来段階で安全な包み込みを実装する。
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
// std/operators/add.nyash
|
||||
// std/operators/add.hako
|
||||
// AddOperator — 加算の演算子ボックス(開発用観測MVP)
|
||||
// 目的: 加算を明示呼び出しとして観測(返り値は未使用)
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
// std/operators/compare.nyash
|
||||
// std/operators/compare.hako
|
||||
// CompareOperator — 比較演算の演算子ボックス(開発用観測MVP)
|
||||
// 目的: 比較を明示の呼び出しとして観測可能にする(MVPでは返り値は未使用)
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
// std/operators/stringify.nyash
|
||||
// std/operators/stringify.hako
|
||||
// StringifyOperator — 明示的な文字列化の演算子ボックス(開発用)
|
||||
// 目的: 暗黙の toString に依存せず、観測可能な文字列化を提供する
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
// array_prepend_zero_macro.nyash
|
||||
// array_prepend_zero_macro.hako
|
||||
// MacroBoxSpec.expand: prepend 0 to every Array elements list in AST JSON v0
|
||||
// Contract: expand(json: string) -> string (AST JSON v0)
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
// hang_macro.nyash
|
||||
// hang_macro.hako
|
||||
// Macro that never returns (infinite loop) to test timeout handling.
|
||||
|
||||
static box MacroBoxSpec {
|
||||
@ -1,4 +1,4 @@
|
||||
// if_match_normalize_macro.nyash
|
||||
// if_match_normalize_macro.hako
|
||||
// Scaffold: identity expansion for now. Future: introduce join variable and
|
||||
// canonical If/Match normalization (scrutinee once, guard fused) as documented
|
||||
// in docs/guides/if-match-normalize.md.
|
||||
@ -7,7 +7,7 @@ static box MacroBoxSpec {
|
||||
name() { return "IfMatchNormalize" }
|
||||
|
||||
expand(json, ctx) {
|
||||
using "apps/lib/json_builder.nyash" as JB
|
||||
using "apps/lib/json_builder.hako" as JB
|
||||
|
||||
// --- helpers copied/adapted from loop_normalize ---
|
||||
function parse_value(s, i) {
|
||||
@ -1,4 +1,4 @@
|
||||
// invalid_json_macro.nyash
|
||||
// invalid_json_macro.hako
|
||||
// Macro that returns invalid JSON (for strict error test)
|
||||
|
||||
static box MacroBoxSpec {
|
||||
@ -1,4 +1,4 @@
|
||||
// loop_normalize_macro.nyash
|
||||
// loop_normalize_macro.hako
|
||||
// MVP: identity expansion with (json, ctx) signature.
|
||||
// Next steps: normalize `loop(cond){ body }` into carrier-based LoopForm.
|
||||
|
||||
@ -10,7 +10,7 @@ static box MacroBoxSpec {
|
||||
// "kind":"Loop","condition":<json>,"body":[ ... ] and rewrite them
|
||||
// into a normalized form using JsonBuilder (keys ordered as condition/body).
|
||||
|
||||
using "apps/lib/json_builder.nyash" as JB
|
||||
using "apps/lib/json_builder.hako" as JB
|
||||
|
||||
// helpers
|
||||
local s = json
|
||||
@ -1,4 +1,4 @@
|
||||
// map_insert_tag_macro.nyash
|
||||
// map_insert_tag_macro.hako
|
||||
// MacroBoxSpec.expand: insert a leading entry {"k":"__macro","v":"on"} into every Map entries list
|
||||
// Contract: expand(json: string) -> string (AST JSON v0)
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
// scope_defer_macro.nyash
|
||||
// scope_defer_macro.hako
|
||||
// MVP scaffold: detect @scope/@defer style markers in AST JSON (string) and keep identity.
|
||||
// Future: attach scope attrs to blocks and emit MIR hints in lowering.
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
// upper_string_macro.nyash
|
||||
// upper_string_macro.hako
|
||||
// MacroBoxSpec.expand: uppercase string literal values that start with "UPPER:" in AST JSON v0
|
||||
// Contract: expand(json: string) -> string (AST JSON v0)
|
||||
|
||||
@ -4,7 +4,7 @@
|
||||
set -e
|
||||
|
||||
NYASH=${NYASH:-"../../target/release/nyash"}
|
||||
SCRIPT="main.nyash"
|
||||
SCRIPT="main.hako"
|
||||
|
||||
echo "=== ny-echo Test Suite ==="
|
||||
|
||||
|
||||
@ -3,10 +3,10 @@
|
||||
This directory hosts small snippets demonstrating reversible formatting goals. No runtime behavior changes or formatter are included in‑tree yet.
|
||||
|
||||
Examples to explore:
|
||||
- pipeline-compact.nyash: pipeline style vs canonical call nesting
|
||||
- safe-access-default.nyash: `?.` and `??` sugar vs explicit conditionals
|
||||
- coalesce-range-roundtrip.nyash: `??` and `a..b` triad (Before/Canonical/Round‑Trip)
|
||||
- compound-assign-roundtrip.nyash: `+=` triad (Before/Canonical/Round‑Trip)
|
||||
- pipeline-compact.hako: pipeline style vs canonical call nesting
|
||||
- safe-access-default.hako: `?.` and `??` sugar vs explicit conditionals
|
||||
- coalesce-range-roundtrip.hako: `??` and `a..b` triad (Before/Canonical/Round‑Trip)
|
||||
- compound-assign-roundtrip.hako: `+=` triad (Before/Canonical/Round‑Trip)
|
||||
|
||||
Enable PoC smoke hints:
|
||||
```bash
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user