3.7 KiB
3.7 KiB
ANCP即座実装ガイド - 今すぐ始める!
Date: 2025-09-03
🚀 30分で作る最小プロトタイプ
Step 1: P*正規化ルール(5分で決める)
// 最小限の正規化ルール
pub struct MinimalCanonicalizer {
rules: Rules {
comments: Remove, // v1では削除
whitespace: SingleSpace, // 連続空白→単一空白
newlines: Preserve, // 改行は保持
semicolons: Required, // セミコロン必須
}
}
Step 2: 最小記号マッピング(10分)
// 超シンプルマッピング
const KEYWORD_MAP: &[(&str, &str)] = &[
("box", "$"),
("new", "@"),
("me", "."),
("init", "#"),
("return", "^"),
("local", "l"),
("public", "+"),
("if", "?"),
("else", ":"),
];
const BUILTIN_MAP: &[(&str, &str)] = &[
("StringBox", "S"),
("IntegerBox", "I"),
("MapBox", "M"),
("ArrayBox", "A"),
];
Step 3: 最小エンコーダー(15分)
// Boxだけ動けばOK!
fn encode_minimal(code: &str) -> String {
let mut result = code.to_string();
// 1. キーワード置換
for (from, to) in KEYWORD_MAP {
result = result.replace(from, to);
}
// 2. 型名短縮
for (from, to) in BUILTIN_MAP {
result = result.replace(from, to);
}
// 3. 空白圧縮
result = compress_whitespace(result);
result
}
📝 1時間で作る実用版
ソースマップ最小実装
#[derive(Serialize, Deserialize)]
struct SimpleSourceMap {
version: u8,
mappings: Vec<Mapping>,
}
struct Mapping {
f_pos: usize, // Fusion位置
p_pos: usize, // Pretty位置
len: usize, // 長さ
}
CLI最小実装
#!/bin/bash
# ancp.sh - 超簡易版
case $1 in
encode)
cargo run --bin ancp-encoder < $2
;;
decode)
cargo run --bin ancp-decoder < $2
;;
*)
echo "Usage: ancp encode|decode file"
;;
esac
🧪 今すぐ試せるテストケース
Test 1: 最小Box
# input.nyash
box Test {
init { value }
}
# 期待出力
$Test{#{value}}
Test 2: 簡単な関数
# input.nyash
box Calculator {
add(a, b) {
return a + b
}
}
# 期待出力
$Calculator{add(a,b){^a+b}}
🎯 今日中に達成可能な目標
午前(2時間)
- P*ルール仕様書(1ページ)
- 記号マッピング表完成
- Rustプロジェクト作成
午後(3時間)
- 最小エンコーダー実装
- 10個のテストケース作成
- 圧縮率測定スクリプト
夕方(1時間)
- README.md作成
- 初期ベンチマーク実行
- 明日の計画立案
💡 すぐ使えるコードスニペット
Rust Cargo.toml
[package]
name = "ancp"
version = "0.1.0"
[dependencies]
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
[[bin]]
name = "ancp-cli"
path = "src/main.rs"
最初のmain.rs
use std::io::{self, Read};
fn main() {
let mut input = String::new();
io::stdin().read_to_string(&mut input).unwrap();
// 超簡易圧縮
let compressed = input
.replace("box", "$")
.replace("init", "#")
.replace("me.", ".")
.replace(" ", " ");
println!("{}", compressed);
}
🏃 動作確認コマンド
# 1. プロジェクト作成
cargo new ancp-prototype
cd ancp-prototype
# 2. 最小実装
echo 'box Test { init { x } }' | cargo run
# 3. 圧縮率確認
echo 'box Test { init { x } }' | wc -c # 元
echo '$Test{#{x}}' | wc -c # 後
# 4. 成功!🎉
15分後には動くものができる!さあ始めよう!