# ななこ (Nanako) - 教育用プログラミング言語
ななこは生成AI時代の教育用プログラミング言語です。限られた機能でチューリング完全性を学び、プログラミングの本質を理解することを目的としています。
## 特徴
- **限定された演算**: インクリメント、デクリメント、絶対値、符号反転のみ
- **0との比較のみ**: 条件文は0との比較のみ可能
- **定回数ループ**: N回繰り返しまたは配列の長さ分繰り返し
- **関数定義**: 再帰も可能な関数定義
- **チューリング完全**: これらの機能だけで理論上あらゆる計算が可能
## インストール
```bash
git clone <このリポジトリ>
cd nanako
```
## 使い方
### ファイル実行
```bash
python run_nanako.py examples/basic.nanako
```
### インタラクティブモード
```bash
python run_nanako.py --interactive
```
### テスト実行
```bash
python simple_test.py
python sample_programs.py
python japanese_samples.py
```
## 言語仕様
### 基本構文
#### 変数代入
```
x = 42
xを10とする
```
#### インクリメント・デクリメント
```
xを増やす
xを減らす
```
#### 条件分岐
```
もし、xが0以上ならば、{
yを10とする
}
そうでなければ {
yを20とする
}
```
比較演算子:
- `以上`: >= 0
- `以下`: <= 0
- `より大きい`: > 0
- `より小さい`: < 0
- `以外`: != 0
- `未満`: < 0
- 空文字: == 0
#### ループ
```
5回、くり返す{
xを増やす
}
```
配列の長さ分ループ:
```
[1, 2, 3]回、くり返す{
counterを増やす
}
```
#### 関数定義と呼び出し
```
入力 x, y に対し {
y回、くり返す{
xを増やす
}
xが答え
}
```
#### 配列操作
```
arr = [1, 2, 3]
arr[0] = 99 # 要素の更新
x = arr[1] # 要素の参照
arr[?] = 4 # 末尾に要素を追加(新機能!)
```
#### 文字列リテラル(新機能!)
```
message = "Hello" # 文字コードの配列 [72, 101, 108, 108, 111]
greeting = "こんにちは" # 日本語も対応
text = "Line1\nLine2" # エスケープシーケンス対応
```
#### 特殊演算
```
x = |y| # 絶対値または配列の長さ
x = -y # 符号反転
x = ? # null値
```
## サンプルプログラム
### 足し算関数
```
たし算 = 入力 X, Y に対し {
Y回、くり返す{
Xを増やす
}
Xが答え
}
```
### 引き算関数
```
ひき算 = 入力 X, Y に対し {
Y回、くり返す{
Xを減らす
}
Xが答え
}
```
### 絶対値関数
```
絶対値 = 入力 X に対し {
もし Xが0より小さいならば {
ひき算(0, X)が答え
}
そうでなければ {
Xが答え
}
}
```
## ファイル構成
- `nanako.py`: メインのインタープリター実装
- `run_nanako.py`: 実行可能ファイル
- `test_nanako.py`: 完全なテストスイート
- `simple_test.py`: 基本機能のテスト
- `sample_programs.py`: サンプルプログラムとデモ
- `japanese_samples.py`: 日本語構文のサンプル
- `examples/`: サンプルファイル
- `memo.txt`: 言語仕様とサンプルコード
## 教育的価値
1. **計算の本質**: 複雑な演算を基本操作の組み合わせで実現
2. **アルゴリズム思考**: 制約の中で問題解決する思考力
3. **チューリング完全性**: 最小限の機能で万能性を理解
4. **プログラミング概念**: 変数、関数、制御構造の基礎
## 実装について
このインタープリターはPythonで実装されており、以下の機能を含みます:
- 抽象構文木(AST)による構文表現
- 再帰下降パーサーによる構文解析
- 環境(環境辞書)による変数管理
- 例外による制御フローの実装
## ライセンス
MIT License
## 貢献
プルリクエストや改善提案を歓迎します。教育目的に適した機能追加や、より良い日本語構文の提案などお待ちしています。
Raw data
{
"_id": null,
"home_page": "https://github.com/kkuramitsu/nanako",
"name": "nanako",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.8",
"maintainer_email": null,
"keywords": "educational, programming-language, japanese, interpreter",
"author": "Nanako Project",
"author_email": null,
"download_url": "https://files.pythonhosted.org/packages/db/4a/caff701756ed1cb26ecc78fc506f89700a37773621731adac1f576bc3723/nanako-0.1.3.tar.gz",
"platform": null,
"description": "# \u306a\u306a\u3053 (Nanako) - \u6559\u80b2\u7528\u30d7\u30ed\u30b0\u30e9\u30df\u30f3\u30b0\u8a00\u8a9e\n\n\u306a\u306a\u3053\u306f\u751f\u6210AI\u6642\u4ee3\u306e\u6559\u80b2\u7528\u30d7\u30ed\u30b0\u30e9\u30df\u30f3\u30b0\u8a00\u8a9e\u3067\u3059\u3002\u9650\u3089\u308c\u305f\u6a5f\u80fd\u3067\u30c1\u30e5\u30fc\u30ea\u30f3\u30b0\u5b8c\u5168\u6027\u3092\u5b66\u3073\u3001\u30d7\u30ed\u30b0\u30e9\u30df\u30f3\u30b0\u306e\u672c\u8cea\u3092\u7406\u89e3\u3059\u308b\u3053\u3068\u3092\u76ee\u7684\u3068\u3057\u3066\u3044\u307e\u3059\u3002\n\n## \u7279\u5fb4\n\n- **\u9650\u5b9a\u3055\u308c\u305f\u6f14\u7b97**: \u30a4\u30f3\u30af\u30ea\u30e1\u30f3\u30c8\u3001\u30c7\u30af\u30ea\u30e1\u30f3\u30c8\u3001\u7d76\u5bfe\u5024\u3001\u7b26\u53f7\u53cd\u8ee2\u306e\u307f\n- **0\u3068\u306e\u6bd4\u8f03\u306e\u307f**: \u6761\u4ef6\u6587\u306f0\u3068\u306e\u6bd4\u8f03\u306e\u307f\u53ef\u80fd\n- **\u5b9a\u56de\u6570\u30eb\u30fc\u30d7**: N\u56de\u7e70\u308a\u8fd4\u3057\u307e\u305f\u306f\u914d\u5217\u306e\u9577\u3055\u5206\u7e70\u308a\u8fd4\u3057\n- **\u95a2\u6570\u5b9a\u7fa9**: \u518d\u5e30\u3082\u53ef\u80fd\u306a\u95a2\u6570\u5b9a\u7fa9\n- **\u30c1\u30e5\u30fc\u30ea\u30f3\u30b0\u5b8c\u5168**: \u3053\u308c\u3089\u306e\u6a5f\u80fd\u3060\u3051\u3067\u7406\u8ad6\u4e0a\u3042\u3089\u3086\u308b\u8a08\u7b97\u304c\u53ef\u80fd\n\n## \u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\n\n```bash\ngit clone <\u3053\u306e\u30ea\u30dd\u30b8\u30c8\u30ea>\ncd nanako\n```\n\n## \u4f7f\u3044\u65b9\n\n### \u30d5\u30a1\u30a4\u30eb\u5b9f\u884c\n```bash\npython run_nanako.py examples/basic.nanako\n```\n\n### \u30a4\u30f3\u30bf\u30e9\u30af\u30c6\u30a3\u30d6\u30e2\u30fc\u30c9\n```bash\npython run_nanako.py --interactive\n```\n\n### \u30c6\u30b9\u30c8\u5b9f\u884c\n```bash\npython simple_test.py\npython sample_programs.py\npython japanese_samples.py\n```\n\n## \u8a00\u8a9e\u4ed5\u69d8\n\n### \u57fa\u672c\u69cb\u6587\n\n#### \u5909\u6570\u4ee3\u5165\n```\nx = 42\nx\u309210\u3068\u3059\u308b\n```\n\n#### \u30a4\u30f3\u30af\u30ea\u30e1\u30f3\u30c8\u30fb\u30c7\u30af\u30ea\u30e1\u30f3\u30c8\n```\nx\u3092\u5897\u3084\u3059\nx\u3092\u6e1b\u3089\u3059\n```\n\n#### \u6761\u4ef6\u5206\u5c90\n```\n\u3082\u3057\u3001x\u304c0\u4ee5\u4e0a\u306a\u3089\u3070\u3001{\n y\u309210\u3068\u3059\u308b\n}\n\u305d\u3046\u3067\u306a\u3051\u308c\u3070 {\n y\u309220\u3068\u3059\u308b\n}\n```\n\n\u6bd4\u8f03\u6f14\u7b97\u5b50:\n- `\u4ee5\u4e0a`: >= 0\n- `\u4ee5\u4e0b`: <= 0 \n- `\u3088\u308a\u5927\u304d\u3044`: > 0\n- `\u3088\u308a\u5c0f\u3055\u3044`: < 0\n- `\u4ee5\u5916`: != 0\n- `\u672a\u6e80`: < 0\n- \u7a7a\u6587\u5b57: == 0\n\n#### \u30eb\u30fc\u30d7\n```\n5\u56de\u3001\u304f\u308a\u8fd4\u3059{\n x\u3092\u5897\u3084\u3059\n}\n```\n\n\u914d\u5217\u306e\u9577\u3055\u5206\u30eb\u30fc\u30d7:\n```\n[1, 2, 3]\u56de\u3001\u304f\u308a\u8fd4\u3059{\n counter\u3092\u5897\u3084\u3059\n}\n```\n\n#### \u95a2\u6570\u5b9a\u7fa9\u3068\u547c\u3073\u51fa\u3057\n```\n\u5165\u529b x, y \u306b\u5bfe\u3057 {\n y\u56de\u3001\u304f\u308a\u8fd4\u3059{\n x\u3092\u5897\u3084\u3059\n }\n x\u304c\u7b54\u3048\n}\n```\n\n#### \u914d\u5217\u64cd\u4f5c\n```\narr = [1, 2, 3]\narr[0] = 99 # \u8981\u7d20\u306e\u66f4\u65b0\nx = arr[1] # \u8981\u7d20\u306e\u53c2\u7167\narr[?] = 4 # \u672b\u5c3e\u306b\u8981\u7d20\u3092\u8ffd\u52a0\uff08\u65b0\u6a5f\u80fd\uff01\uff09\n```\n\n#### \u6587\u5b57\u5217\u30ea\u30c6\u30e9\u30eb\uff08\u65b0\u6a5f\u80fd\uff01\uff09\n```\nmessage = \"Hello\" # \u6587\u5b57\u30b3\u30fc\u30c9\u306e\u914d\u5217 [72, 101, 108, 108, 111]\ngreeting = \"\u3053\u3093\u306b\u3061\u306f\" # \u65e5\u672c\u8a9e\u3082\u5bfe\u5fdc\ntext = \"Line1\\nLine2\" # \u30a8\u30b9\u30b1\u30fc\u30d7\u30b7\u30fc\u30b1\u30f3\u30b9\u5bfe\u5fdc\n```\n\n#### \u7279\u6b8a\u6f14\u7b97\n```\nx = |y| # \u7d76\u5bfe\u5024\u307e\u305f\u306f\u914d\u5217\u306e\u9577\u3055\nx = -y # \u7b26\u53f7\u53cd\u8ee2\nx = ? # null\u5024\n```\n\n## \u30b5\u30f3\u30d7\u30eb\u30d7\u30ed\u30b0\u30e9\u30e0\n\n### \u8db3\u3057\u7b97\u95a2\u6570\n```\n\u305f\u3057\u7b97 = \u5165\u529b X, Y \u306b\u5bfe\u3057 {\n Y\u56de\u3001\u304f\u308a\u8fd4\u3059{\n X\u3092\u5897\u3084\u3059\n }\n X\u304c\u7b54\u3048\n}\n```\n\n### \u5f15\u304d\u7b97\u95a2\u6570 \n```\n\u3072\u304d\u7b97 = \u5165\u529b X, Y \u306b\u5bfe\u3057 {\n Y\u56de\u3001\u304f\u308a\u8fd4\u3059{\n X\u3092\u6e1b\u3089\u3059\n }\n X\u304c\u7b54\u3048\n}\n```\n\n### \u7d76\u5bfe\u5024\u95a2\u6570\n```\n\u7d76\u5bfe\u5024 = \u5165\u529b X \u306b\u5bfe\u3057 {\n \u3082\u3057 X\u304c0\u3088\u308a\u5c0f\u3055\u3044\u306a\u3089\u3070 {\n \u3072\u304d\u7b97(0, X)\u304c\u7b54\u3048\n }\n \u305d\u3046\u3067\u306a\u3051\u308c\u3070 {\n X\u304c\u7b54\u3048\n }\n}\n```\n\n## \u30d5\u30a1\u30a4\u30eb\u69cb\u6210\n\n- `nanako.py`: \u30e1\u30a4\u30f3\u306e\u30a4\u30f3\u30bf\u30fc\u30d7\u30ea\u30bf\u30fc\u5b9f\u88c5\n- `run_nanako.py`: \u5b9f\u884c\u53ef\u80fd\u30d5\u30a1\u30a4\u30eb\n- `test_nanako.py`: \u5b8c\u5168\u306a\u30c6\u30b9\u30c8\u30b9\u30a4\u30fc\u30c8\n- `simple_test.py`: \u57fa\u672c\u6a5f\u80fd\u306e\u30c6\u30b9\u30c8\n- `sample_programs.py`: \u30b5\u30f3\u30d7\u30eb\u30d7\u30ed\u30b0\u30e9\u30e0\u3068\u30c7\u30e2\n- `japanese_samples.py`: \u65e5\u672c\u8a9e\u69cb\u6587\u306e\u30b5\u30f3\u30d7\u30eb\n- `examples/`: \u30b5\u30f3\u30d7\u30eb\u30d5\u30a1\u30a4\u30eb\n- `memo.txt`: \u8a00\u8a9e\u4ed5\u69d8\u3068\u30b5\u30f3\u30d7\u30eb\u30b3\u30fc\u30c9\n\n## \u6559\u80b2\u7684\u4fa1\u5024\n\n1. **\u8a08\u7b97\u306e\u672c\u8cea**: \u8907\u96d1\u306a\u6f14\u7b97\u3092\u57fa\u672c\u64cd\u4f5c\u306e\u7d44\u307f\u5408\u308f\u305b\u3067\u5b9f\u73fe\n2. **\u30a2\u30eb\u30b4\u30ea\u30ba\u30e0\u601d\u8003**: \u5236\u7d04\u306e\u4e2d\u3067\u554f\u984c\u89e3\u6c7a\u3059\u308b\u601d\u8003\u529b\n3. **\u30c1\u30e5\u30fc\u30ea\u30f3\u30b0\u5b8c\u5168\u6027**: \u6700\u5c0f\u9650\u306e\u6a5f\u80fd\u3067\u4e07\u80fd\u6027\u3092\u7406\u89e3\n4. **\u30d7\u30ed\u30b0\u30e9\u30df\u30f3\u30b0\u6982\u5ff5**: \u5909\u6570\u3001\u95a2\u6570\u3001\u5236\u5fa1\u69cb\u9020\u306e\u57fa\u790e\n\n## \u5b9f\u88c5\u306b\u3064\u3044\u3066\n\n\u3053\u306e\u30a4\u30f3\u30bf\u30fc\u30d7\u30ea\u30bf\u30fc\u306fPython\u3067\u5b9f\u88c5\u3055\u308c\u3066\u304a\u308a\u3001\u4ee5\u4e0b\u306e\u6a5f\u80fd\u3092\u542b\u307f\u307e\u3059:\n\n- \u62bd\u8c61\u69cb\u6587\u6728(AST)\u306b\u3088\u308b\u69cb\u6587\u8868\u73fe\n- \u518d\u5e30\u4e0b\u964d\u30d1\u30fc\u30b5\u30fc\u306b\u3088\u308b\u69cb\u6587\u89e3\u6790\n- \u74b0\u5883(\u74b0\u5883\u8f9e\u66f8)\u306b\u3088\u308b\u5909\u6570\u7ba1\u7406\n- \u4f8b\u5916\u306b\u3088\u308b\u5236\u5fa1\u30d5\u30ed\u30fc\u306e\u5b9f\u88c5\n\n## \u30e9\u30a4\u30bb\u30f3\u30b9\n\nMIT License\n\n## \u8ca2\u732e\n\n\u30d7\u30eb\u30ea\u30af\u30a8\u30b9\u30c8\u3084\u6539\u5584\u63d0\u6848\u3092\u6b53\u8fce\u3057\u307e\u3059\u3002\u6559\u80b2\u76ee\u7684\u306b\u9069\u3057\u305f\u6a5f\u80fd\u8ffd\u52a0\u3084\u3001\u3088\u308a\u826f\u3044\u65e5\u672c\u8a9e\u69cb\u6587\u306e\u63d0\u6848\u306a\u3069\u304a\u5f85\u3061\u3057\u3066\u3044\u307e\u3059\u3002\n",
"bugtrack_url": null,
"license": "MIT",
"summary": "An educational programming language for the generative AI era",
"version": "0.1.3",
"project_urls": {
"Homepage": "https://github.com/kimio/nanako",
"Repository": "https://github.com/kimio/nanako"
},
"split_keywords": [
"educational",
" programming-language",
" japanese",
" interpreter"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "7d632822396e772d594d6857e82b387b19b70498cb9b282260c2c3aef19b5a84",
"md5": "712c5678e3ec74640ed4bc2119d870bf",
"sha256": "4f72b69b05a41ede626f2365317639ffea5865aa951e02704abb7b4b9616086a"
},
"downloads": -1,
"filename": "nanako-0.1.3-py3-none-any.whl",
"has_sig": false,
"md5_digest": "712c5678e3ec74640ed4bc2119d870bf",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.8",
"size": 20502,
"upload_time": "2025-09-12T07:48:40",
"upload_time_iso_8601": "2025-09-12T07:48:40.135735Z",
"url": "https://files.pythonhosted.org/packages/7d/63/2822396e772d594d6857e82b387b19b70498cb9b282260c2c3aef19b5a84/nanako-0.1.3-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "db4acaff701756ed1cb26ecc78fc506f89700a37773621731adac1f576bc3723",
"md5": "7d8a0f5d75f732c973cfca7e80018047",
"sha256": "9ab0597899ab8529110fd668404d23d2afba6653deba7a79d5b8b96b8c4c2d9f"
},
"downloads": -1,
"filename": "nanako-0.1.3.tar.gz",
"has_sig": false,
"md5_digest": "7d8a0f5d75f732c973cfca7e80018047",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.8",
"size": 20669,
"upload_time": "2025-09-12T07:48:41",
"upload_time_iso_8601": "2025-09-12T07:48:41.453013Z",
"url": "https://files.pythonhosted.org/packages/db/4a/caff701756ed1cb26ecc78fc506f89700a37773621731adac1f576bc3723/nanako-0.1.3.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-09-12 07:48:41",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "kkuramitsu",
"github_project": "nanako",
"travis_ci": false,
"coveralls": false,
"github_actions": false,
"lcname": "nanako"
}