at-language-expert
`at`プログラミング言語でコードを記述、デバッグ、理解するための基本的な手順と制約事項に関する知識です。
description の原文を見る
Essential procedural knowledge and constraints for writing, debugging, and understanding the `at` programming language.
SKILL.md 本文
at 言語エージェント スキル
このスキルは、atコードを正常に記述およびデバッグするために必要な必須の手続き知識を提供します。atはAIエージェント向けに特別に設計された、高速で厳密型のプログラミング言語です。
設計哲学
atはエージェントの成功を支援するために設計されており、A Language For Agentsから着想を得ています:
- LSPなしのコンテキスト: 型は関数シグネチャと戻り値の型で明示的です。関数が何を受け入れるか、何を返すかを理解するためにLSPは不要です。ローカル変数は推論を使用してトークンを節約しますが、パブリックAPIは常に読みやすくなっています。
- インデントではなく波括弧:
atは有意な空白ではなく{ }デリミタを使用します。これにより、LLMがインデント区別言語で抱える効率の問題と外科的な編集の問題を回避します。 - 例外ではなく結果:
Result<T, E>と?の伝播を優先します。try/catch/finallyはエスケープハッチとして存在しますが、Resultがイディオマティックなエラーハンドリングパターンです。エージェントはデフォルトでResult型を返すべきです。 - 明示的な副作用: 副作用(ネットワーク、ファイルシステム、時間、ランダム性)は
needs { ... }ブロックを通じて宣言する必要があります。これにより、テストでのモッキングが簡単になり、関数が何に触れるかについてエージェントに明確な信号を与えます。 - 最小限の差分: 末尾カンマはすべての場所(配列、マップ、マッチアーム、関数パラメータ)でサポートされています。コードを垂直にフォーマットして、差分を単一行に保ちます。
- 検索可能なインポート: すべてのインポートにはエイリアスが必要です(
import "x" as y;)。すべてのシンボル使用にはモジュール名がプレフィックスされます(Goのcontext.Contextのように)。これにより、grepやsedなどの基本的なツールでコードを検索できます。 - ローカルな推論: 各ファイルは自己完結しています。暗黙的なグローバル、再エクスポート、バレルファイルはありません。ファイルを読むと、他のファイルをロードすることなく理解できます。
- マクロなし:
atにはマクロシステムがありません。コード記述の費用が低い場合、コード生成は不要です。 - 再エクスポートまたはバレルファイルなし: すべてのインポートはシンボルを定義するファイルを指します。宣言から使用への一対一マッピング。
- 依存関係認識ビルド: 循環インポートはありません。パッケージには明確な境界があります。テスト結果は積極的にキャッシュされます。
- 決定論的テスト: テストは時間とランダム性をピンします(
using time.fixed; using rand.seeded;)。設計上、フレーキーさが排除されます。 - 単一の失敗条件:
at checkは1パスで型チェックとリントを実行します。コードは合格するか失敗するか — 「コンパイルできるが型エラーがある」状態は存在しません。at testはすべてのテストを実行します。2つのコマンド、曖昧さなし。
重要な制約(最初にお読みください)
- 明示的な戻り値の型が必須: すべての関数は戻り値の型を宣言する必要があります
fn name() -> type {。 - 必須のインポートエイリアス: すべてのインポートにエイリアスを付ける必要があります(
import "./utils.at" as utils;)。グローバルインポート、再エクスポートはありません。 - 機能のサンドボックス化: スクリプトがネットワーク、ファイルシステム、時間に触れる場合、
needs { ... }ブロックを宣言する必要があります。 - トークン効率: コンパイラはローカル変数を推論します。トークンを節約するために
let x = 5;をlet x: int = 5;の代わりに使用してください。 - 変更には
setを使用: 変数はデフォルトで不変です。set x = newValue;を使用して変更します(let mutではなく)。 - セミコロンが必須: すべてのステートメントは
;で終わります。 - マッチアームはカンマを使用: マッチアームは
,で区切られます(改行ではなく)。 - マクロなし: マクロシステムはありません。明示的なコードを記述します。
try/catchよりResultを優先: エラーハンドリングにはResult<T, E>と?を使用します。FFIまたはレガシーコードをラップする場合を除き、try/catchを回避します。
1. 構文概要
変数と型
let immutable = 10;
let mutable = 20;
set mutable = 30; // 変更は `set` で(`let mut` ではなく)
// 型推論がこれらを自動的に処理
let array = [1, 2, 3];
let empty = []; // 空の配列リテラル
let m = map {}; // 空のマップリテラル
let m2 = map { "key": "value" };
関数とテスト
テストは同じ場所に配置され、at testで高度に最適化された速度で実行されます。
fn add(a: int, b: int) -> int {
return a + b;
}
test "adds numbers" {
assert(add(1, 2) == 3);
}
制御フロー
if a > b {
// ...
} else {
// ...
}
for item in array {
// ...
}
while condition {
// ...
}
エラーハンドリング
早期リターンにはResult<T, E>と?を使用します。これはイディオマティックパターンです — エージェントはデフォルトでtry/catchよりこれを優先するべきです。
fn divide(a: int, b: int) -> Result<int, string> {
if b == 0 {
return Err("Division by zero");
}
return Ok(a / b);
}
fn calculate() -> Result<int, string> {
let result = divide(10, 2)?;
return Ok(result + 1);
}
列挙体とパターンマッチング
enum Shape {
Circle(float),
Rect(float, float), // 複数フィールドのバリアントがサポート
Point, // ペイロードなしのバリアント
}
fn area(s: Shape) -> float {
return match s {
Shape::Circle(r) => 3.14159 * r * r,
Shape::Rect(w, h) => w * h,
Shape::Point => 0.0,
};
}
高階関数
map、filter、reduceはコンパイラインライン化されます(通常のビルトインではなく):
let nums = [1, 2, 3, 4, 5];
let doubled = map(nums, |x| x * 2);
let evens = filter(nums, |x| x % 2 == 0);
let total = reduce(nums, 0, |acc, x| acc + x);
2. ビルトインリファレンス
コア
print(value), assert(condition), assert_eq(a, b), len(collection), type_of(value)
数学
abs(n), min(a, b), max(a, b), floor(f), ceil(f), round(f), pow(base, exp), sqrt(f), sum(array)
文字列
contains(haystack, needle)(配列と文字列に対応), slice(arr, start, end), split(str, delim), trim(str), to_upper(str), to_lower(str), substring(str, start, end), join(array, sep), replace(str, old, new), starts_with(str, prefix), ends_with(str, suffix), repeat(str, n), parse_int(str), parse_float(str), to_string(value)
文字
char_code(str), from_char_code(n), is_digit(str), is_alpha(str), is_upper(str), is_lower(str)
配列
append(arr, value), sort(arr), reverse(arr), index_of(arr, value), count(arr, value), range(start, end)
マップ
keys(map), values(map)
正規表現
regex_match(str, pattern) -> bool, regex_find(str, pattern) -> array<string>, regex_replace(str, pattern, replacement) -> string
注:正規表現パターン内でリテラル{をエスケープするには{{を使用してください(例:[0-9]{3}の正規表現には"[0-9]{{3}}")。
オプションと結果
some(v), none(), is_some(opt), is_none(opt), ok(v), err(v), is_ok(res), is_err(res)
3. 明示的な副作用とサンドボックス化
エージェントはセキュアサンドボックスで実行されます。副作用は静的に宣言せずには実行できません。
needs { network, fs } // フェッチまたはファイル読み込みを行う場合は宣言が必須
import "std/http.at" as http;
fn fetch_data() -> Result<string, string> {
return http.get("https://example.com");
}
テストの決定論性については、決定論的な環境を宣言します:
using time.fixed;
using rand.seeded;
4. LLM向けコード生成チェックリスト
atコードを修正または生成する前に、以下を確認してください:
- 変更: 変更には
set x = value;を使用します。let mutではなく。 - エラーハンドリング:
Result<T, E>と?を使用します。try/catchではなく。 - フォーマット: 複数要素の配列、タプル、マップは差分の安定性を保つため垂直にフォーマットする必須があります。
- エイリアス: すべてのインポートにエイリアスを付けましたか?(
import "x" as y;) - 副作用: 外部システムにアクセスする場合、ファイルの先頭に
needs { ... }を宣言しましたか? - テスト: 関数用にコロケーションされた
test "name" { assert(...); }ブロックを記述していますか? - 型:
let x = ...を使用してローカル変数の型をコンパイラに推論させていますか? - セミコロン: すべてのステートメントが
;で終わります。 - マッチカンマ: マッチアームは
,で区切られています。 - 混合算術:
intとfloatは自由に混合できます(intはfloatに昇格)。 - マクロなし: 明示的なコードを記述します。マクロシステムはありません。
- ローカルな推論: 各ファイルは自己完結している必須があります。再エクスポート、バレルファイルなし。
5. 開発CLI
エージェントとして、これらのツールを使用してコードを反復的に検証できます:
at check- 1パスで型チェックとリント(即座で、すべてのエラーをランタイム前に検出)at test <file|dir>- ファイルまたはディレクトリ内のテストを再帰的に実行(積極的にキャッシュされ、非常に高速なフィードバックループ)at run <file>- スクリプトを実行at fix- コードを自動フォーマットしてリントを修正
6. 制限事項
これらはatが意図的にサポートしない、またはまだ実装されていないものです:
- クラスまたは継承なし。 構造体と列挙体(代数的データ型)のみ。
- 可変参照なし。 すべてのデータは不変/コピーオンライト(
Rc共有)。setは新しいコピーを作成します。 printを超えた標準I/Oなし。read_lineなし、ファイルI/Oビルトインなし(fs機能とそれに対応するビルトインが必要ですがまだ存在しません)。- ハッシュ/セットデータ構造なし。 配列と順序付きマップのみ。ダミー値を持つマップを回避策として使用します。
- パッケージマネージャーなし。 リモートインポートはキャッシング付きの直接URLフェッチ。
- nullなし。
option(some/none)を代わりに使用します。 - 暗黙的な戻りなし。
returnキーワードを使用する必須があります(ただし、ブロック式は暗黙的なテール値を持ちます)。 - 整数演算はオーバーフロー検出。 大きな計算はラップするのではなくエラーになります。
- シングルスレッド。 非同期は協調的で並列ではありません。OSレベルのスレッドなし。
- 再帰深度の保証なし。 サンドボックス実行用に設定可能な
max_frames制限が存在します。 - 文字列補間は
{expr}を使用。 文字列内のリテラル{を記述するには{{を使用します(数量詞{3}を含む正規表現パターンに関連)。
ライセンス: MIT(寛容ライセンスのため全文を引用しています) · 原本リポジトリ
詳細情報
- 作者
- aryaminus
- リポジトリ
- aryaminus/at
- ライセンス
- MIT
- 最終更新
- 2026/4/22
Source: https://github.com/aryaminus/at / ライセンス: MIT