チュートリアル
サンプル を、1 つずつ順に辿ります。上から読んでください。各節はその前の節を前提に しています。
リファレンスコンパイラはまだスケルトンなので、以下の
cairn compileはまだ動きません。仕様どおりの 記述なので、CLI の感覚を掴むにはこれを読むのが正しい方法です。
1. コテージを建てる
Section titled “1. コテージを建てる”これで完結した Cairn のビルドです
(cottage.crn)。
@cairn 2026.06@requires version>=1.20
theme medieval: slot floor -> @oak_planks slot wall -> @cobblestone slot roof -> @spruce_stairs slot glass -> @glass_pane
struct cottage size=9x7 floor mat_slot=floor walls class=outer mat_slot=wall height=4 door side=front at=center window class=small side=front offset=2 y=2 size=2x2 sym=true mat_slot=glass roof kind=gable mat_slot=roof overhang=1どちらのエディションにもコンパイルできます。
cairn compile examples/cottage.crn --edition java --target 1.21.4cairn compile examples/cottage.crn --edition bedrock --target 1.21.40Minecraft のバージョンはソースに書きません。 --target で与え、--edition を必ず併記します。
ソースが宣言できるのは @requires (ターゲットが満たすべき下限) と @cairn (このファイルが書かれた
言語バージョン) だけです。
struct が「どこ」を、theme が「何で」を言います。 mat_slot=wall はブロック名ではなく注入
ポイントで、それを束縛するのが theme です。theme medieval を別のものに差し替えてもジオメトリは
変わりません。CSS の発想をブロックに適用したものです。
位置は意味的です。 side=front / offset=2 / y=2 / at=center は壁に沿った位置です。書く側
に絶対座標は一切出てきません。
順序は関係ありません。 window は roof の後に書かれていますが、それでも壁の開口として切られ
ます。コンパイラは評価前にコマンドを固定フェーズに振り分けるので、読みやすい順に書けます。
ブロックステートは導出されます。 ドアの facing=south も、壁の north=tall も、ガラスペインの
connected も誰も書きません。コンパイラが位置と隣接から求めます。
2. 抽象マテリアルとレベル
Section titled “2. 抽象マテリアルとレベル”themed-tower.crn は同じ形
に 3 つの考えを足します。
theme keep_dark: slot floor -> @floor.wood.broadleaf # 抽象トークン slot wall -> @wall.stone.cobble slot trim -> @wood.dark slot roof -> @roof.dark_wood
struct keep size=11x9 floor id=base mat_slot=floor walls id=shell mat_slot=wall height=5 roof id=roof kind=gable mat_slot=roof overhang=1
level id=floor1 y=0 ...
level id=floor2 y=5 walls id=upper class=outer mat_slot=wall height=4 window class=arrow_slit side=front repeat=3 step=2 y=2 size=1x2 shape=slit stair id=eave kind=stairs mat_slot=roof side=front half=top facing=out shape=outer_leftトークンは 2 種類あります。 @oak_planks は 正準ブロックトークン で、特定の意味を表し、黙って
格下げされることはありません。@floor.wood.broadleaf は 抽象マテリアルトークン で、ターゲット次第
でテーマがオークにもシラカバにも解決してよい美的な選択です。
level y=5 は上階に自前の y=0 を与えます。 2 階の窓は地面からではなく、その階の床から y=2
の位置に留まります。
ブロックステートを書くと intent に昇格します。 stair id=eave の行は half=top facing=out shape=outer_left を明示しているので、これらの値はコンパイラのものではなくあなたのものです。規則は
「既定では導出し、intent になりうるブロックステートはすべて上書き可能」です。
3. レッドストーンを信号グラフとして書く
Section titled “3. レッドストーンを信号グラフとして書く”ダストやリピータを置く代わりに、何が何に依存するかを宣言します
(redstone-door.crn)。
struct gatehouse size=7x5 floor mat_slot=wall walls class=outer mat_slot=wall height=3 door id=front side=front at=center mat_slot=door
pressure_plate id=plate at=front.outside offset=0 y=0 -> sig.step pressure_plate id=inner at=inside.front offset=1 y=0 -> sig.exit
logic sig.open = sig.step or sig.exit door[id=front] opened_by=sig.open
circuit region=floor void=2
assert truth(sig.step, sig.exit -> sig.open) { 00->0; 01->1; 10->1; 11->1 } assert always(sig.step -> eventually sig.open within 2)センサが発し、アクチュエータが受けます。 -> sig.step はセンサの出力、opened_by=sig.open は
アクチュエータの入力です。その間の依存を書くのが logic です。
tick 演算はありません。 論理式は時間をまったく持ちません。アサーションの within 2 だけが tick
を意味します。ディレイは回路を配置し配線するまで分からないからです。
circuit region=… は place-and-route のための領域を確保します。 収まらなければ
E_ROUTE_CONGESTION が修正案とともに出ます。黙って溢れることはありません。
アサーションは 3 種類です。 組み合わせ論理の truth(…)、有界ディレイの
latency(in → out) <= N、有界時相の always(in -> eventually out within N)。完全な LTL は意図的に
持ちません。tick シミュレータが安く判定できるものだけです。
エディション差はセルライブラリにあり、言語にはありません。 同じ論理が Java では ComparatorAND
セル、Bedrock では TorchAND になります。準接続やブロック更新順序に依存する回路は、サイレントな
地雷ではなくコンパイルエラーです。
続き: レッドストーン。
4. 複数の建物を置く
Section titled “4. 複数の建物を置く”コテージが 1 棟建てば、あとは再利用です
(village.crn)。
def cottage size=9x7: floor id=floor mat_slot=floor walls id=walls class=outer mat_slot=wall height=4 door id=entry class=entry side=front at=center window id=front side=front y=2 offset=2 size=2x2 mat_slot=glass roof id=roof kind=gable mat_slot=roof overhang=1
site hamlet: place id=home1 use=cottage theme=medieval at=origin place id=home2 use=cottage theme=medieval east_of=home1 gap=4 place id=home3 use=cottage theme=medieval north_of=home1 gap=5
connect home1.entry to home2.entry path=@gravel connect home1.entry to home3.entry path=@graveldef は再利用可能なコンポーネント で、theme や site と同じスロット機構の上に立っています。
編集・テーマ適用・複数建築のどこでも参照の仕方が同じです。
配置は関係で書きます。 east_of=home1 gap=4 は制約であり、座標に落とすのはコンパイラの仕事です。
LLM の算術誤りという最悪のクラスがまるごと消えます。
struct はポートを公開します。 home1.entry は def で宣言されたドアメンバで、connect が 2 つ
のポートを walkway で結びます。
48³ のストラクチャブロック制限は消えます。 1 つのストラクチャブロックに収まらない村は、site の
上に複数の def を合成したものにすぎません。
続き: コンポーネント・編集・複数建築。
次に読むもの
Section titled “次に読むもの”| したいこと | 読む場所 |
|---|---|
| 全部を書き直さずに一部を変える | 編集モデル §9.2。edit window[class=vent] set shape=arch |
| どの Minecraft バージョンで動くか知る | バージョンとエディション §10.5。cairn info の報告 |
| 既存の schematic を Cairn に取り込む | エコシステム連携。写し取り、リフト、voxel-diff |
| 他の屋根の種類を試す | roof-shed / roof-hip / roof-flat のサンプル |
| 用語を引く | 用語集 |