本手册涵盖了 Nexa 语言从基础语法到 v1.3 引入的全部高级特性,包括智能体声明、路由协作、语义分支、测试断言、MCP 扩展、传统控制流、Intent-Driven Development、Design by Contract 以及 Agent-Native Tooling。所有符合本手册规范的代码皆可由 Nexa Compiler 直接转译并在 Nexa Runtime 中执行。
本版本新增以下核心特性:
- 传统控制流 - 确定性的 if/else if/else、for each、while、break、continue
- Python 逃生舱 - 使用
python! """..."""直接嵌入 Python 代码 - 二元运算符扩展 - 支持 +、-、*、/、% 算术运算
- 比较运算符 - 支持 ==、!=、<、>、<=、>= 比较运算
- Intent-Driven Development (IDD) -
@implements/@supports注解 +.nxintent文件 + IAL 引擎 - Design by Contract (契约式编程) -
requires/ensures/invariant契约,支持确定性条件和语义(自然语言)条件 - Agent-Native Tooling -
nexa inspect/validate/lint命令,Agent 感知的代码分析
Nexa 采用极简的顶层声明系统。核心一等公民包括 agent, tool, protocol, flow, test。
用于挂载外部执行能力。支持绑定本地 Python 模块,并在 v0.9-alpha 中支持 MCP (Model Context Protocol)。
// 绑定本地工具
tool Calculator {
description: "Perform basic math operations",
parameters: {"expression": "string"}
}
// v0.9 绑定 MCP 工具
tool SearchMCP {
mcp: "github.com/nexa-ai/search-mcp"
}
基于强制类型的输出约束,在底层被转译为 Pydantic Schema。
protocol AnalysisReport {
title: "string",
sentiment: "string",
confidence: "number"
}
定义语言模型实例及其附带的工具或协议。支持模型路由与系统指令。
@limit(max_tokens=2048)
agent FinancialAnalyst implements AnalysisReport uses Calculator, SearchMCP {
role: "Senior Financial Advisor",
model: "claude-3.5-sonnet",
prompt: "Analyze financial data and output standard reports."
}
控制调度的中心单元。支持类似 Unix 管道的语法符。
flow main {
raw_data = SearchMCP.run("AAPL Q3 index");
// 管道组合符 >> 将前面的输出传递给后一节点
summary = raw_data >> FinancialAnalyst >> Formatter;
print(summary);
}
依据自然语言使用底层文本大模型进行分发。
match user_req {
intent("查询天气") => WeatherBot.run(user_req),
intent("查询股市") => StockBot.run(user_req),
_ => SmallTalkBot.run(user_req)
}
允许在传统布尔逻辑之外,针对非结构化文本进行语义条件判断。v0.9 引入了基于正则前置过滤的快速匹配,避免重复消耗 Token。
semantic_if "包含具体的日期和地点" fast_match r"\\d{4}-\\d{2}-\\d{2}" against user_input {
schedule_tool.run(user_input);
} else {
print("需要进一步澄清");
}
条件终止支持自然语言求值机制。
loop {
draft = Editor.run(feedback);
feedback = Critic.run(draft);
} until ("Article is engaging and grammatically perfect")
在 v0.9-alpha 引入的原生测试与调试支持。可通过 nexa test 调用。
test "financial_analysis_basic_pipeline" {
mock_input = "Tesla revenue 2023";
result = FinancialAnalyst.run(mock_input);
// 断言结果符合特定语义预期
assert "包含具体的马斯克管理评价" against result;
}
program ::= script_stmt*
script_stmt ::= tool_decl | protocol_decl | agent_decl | flow_decl | test_decl
tool_decl ::= "tool" IDENTIFIER "{" tool_body "}"
tool_body ::= ("description:" STRING_LITERAL "," "parameters:" json_object) | ("mcp:" STRING_LITERAL)
protocol_decl ::= "protocol" IDENTIFIER "{" (IDENTIFIER ":" STRING_LITERAL)+ "}"
agent_modifier ::= "@" IDENTIFIER "(" IDENTIFIER "=" NUMBER ")"
agent_decl ::= [agent_modifier] "agent" IDENTIFIER ["implements" IDENTIFIER] ["uses" identifier_list] "{" agent_body "}"
agent_body ::= (IDENTIFIER ":" STRING_LITERAL)+
flow_decl ::= "flow" IDENTIFIER "{" flow_stmt* "}"
test_decl ::= "test" STRING_LITERAL "{" flow_stmt* "}"
flow_stmt ::= assignment_stmt | expr_stmt | semantic_if_stmt | loop_stmt | match_stmt | assert_stmt | try_catch_stmt
assignment_stmt ::= IDENTIFIER "=" expression ";"
expr_stmt ::= expression ";"
assert_stmt ::= "assert" STRING_LITERAL "against" IDENTIFIER ";"
try_catch_stmt ::= "try" block "catch" "(" IDENTIFIER ")" block
semantic_if_stmt ::= "semantic_if" STRING_LITERAL ["fast_match" REGEX_LITERAL] "against" IDENTIFIER "{" flow_stmt* "}" ("else" "{" flow_stmt* "}")?
loop_stmt ::= "loop" "{" flow_stmt* "}" "until" "(" STRING_LITERAL ")"
match_stmt ::= "match" IDENTIFIER "{" match_branch+ ("_" "=>" expression)? "}"
match_branch ::= "intent" "(" STRING_LITERAL ")" "=>" expression ","
expression ::= dag_expr | pipeline_expr | fallback_expr | base_expr
# DAG 表达式 (v0.9.7+)
dag_expr ::= dag_fork_expr | dag_merge_expr | dag_branch_expr
dag_fork_expr ::= base_expr ("|>>" | "||") "[" identifier_list "]"
dag_merge_expr ::= "[" identifier_list "]" ("&>>" | "&&") base_expr
dag_branch_expr ::= base_expr "??" base_expr ":" base_expr
pipeline_expr ::= base_expr (">>" base_expr)+
fallback_expr ::= base_expr "fallback" expression
base_expr ::= join_call | method_call | STRING_LITERAL | IDENTIFIER
join_call ::= "join" "(" identifier_list ")" ["." IDENTIFIER "(" argument_list ")"]
method_call ::= IDENTIFIER ("." IDENTIFIER)? "(" (argument_list)? ")"
argument_list ::= expression ("," expression)*
IDENTIFIER ::= [a-zA-Z_][a-zA-Z0-9_]*
STRING_LITERAL ::= '"' [^"]* '"'
REGEX_LITERAL ::= 'r"' [^"]* '"'Nexa v0.9.7 引入了用于复杂拓扑编排的 DAG 操作符。
将输入并行发送到多个 Agent:
// |>> 等待所有结果返回
results = input |>> [Agent1, Agent2, Agent3];
// || 不等待(fire-and-forget)
input || [Logger, Analytics];
将多个结果合并:
// &>> 顺序合流
result = [Researcher, Analyst] &>> Reviewer;
// && 共识合流(需要 Agent 达成一致)
consensus = [Agent1, Agent2] && JudgeAgent;
根据条件选择执行路径:
// 根据输入特征选择处理 Agent
result = input ?? UrgentHandler : NormalHandler;
组合使用操作符构建复杂流程:
// 分叉后合流
final = topic |>> [Researcher, Analyst] &>> Writer >> Reviewer;
// 多阶段并行处理
report = data |>> [Preprocess1, Preprocess2] &>> Aggregator >> Formatter;
v1.0.1-beta 引入了确定性传统控制流,与语义控制流(semantic_if、loop...until)明确区分。
使用确定性比较运算符进行条件判断:
// 基本语法
if (condition) {
// then block
} else if (another_condition) {
// else if block
} else {
// else block
}
// 示例:分数等级判断
score = 85;
if (score >= 90) {
result = "优秀";
} else if (score >= 80) {
result = "良好";
} else if (score >= 60) {
result = "及格";
} else {
result = "不及格";
}
比较运算符:
| 运算符 | 含义 |
|---|---|
== |
等于 |
!= |
不等于 |
< |
小于 |
> |
大于 |
<= |
小于等于 |
>= |
大于等于 |
逻辑运算符:
and- 逻辑与or- 逻辑或
遍历集合或数组:
// 基本语法
for each item in collection {
// 处理 item
}
// 带索引遍历
for each index, item in collection {
// 使用 index 和 item
}
// 示例
for each item in data_list {
processed = DataProcessor.run(item);
print(processed);
}
基于条件的循环:
// 基本语法
while (condition) {
// 循环体
}
// 示例
counter = 0;
while (counter < 5) {
print(counter);
counter = counter + 1;
}
循环控制语句:
// break - 立即终止循环
while (counter < 10) {
if (counter == 5) {
break; // 当 counter == 5 时退出循环
}
counter = counter + 1;
}
// continue - 跳过当前迭代
for each num in numbers {
if (num % 2 == 0) {
continue; // 跳过偶数
}
print(num); // 只打印奇数
}
v1.0.1-beta 支持基本算术运算:
| 运算符 | 含义 | 示例 |
|---|---|---|
+ |
加法 | x + y |
- |
减法 | x - y |
* |
乘法 | x * y |
/ |
除法 | x / y |
% |
取模 | x % y |
count = count + 1;
average = total / count;
remainder = num % 2;
| 特性 | 传统控制流 | 语义控制流 |
|---|---|---|
| 条件判断 | 确定性比较 | LLM 语义判断 |
| 语法 | if (x > 5) |
semantic_if "条件" against var |
| 循环终止 | while (x < 10) |
loop...until(语义条件) |
| 执行确定性 | 完全确定 | 依赖 LLM 输出 |
当需要直接使用 Python 功能时,可以使用 python! 关键字嵌入原生 Python 代码。
python! """
# Python 代码
import math
result = math.sqrt(16)
print(result)
"""
- 复杂算法实现:
python! """
import math
def calculate_statistics(data):
n = len(data)
mean = sum(data) / n
variance = sum((x - mean) ** 2 for x in data) / n
return mean, math.sqrt(variance)
data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
mean, std = calculate_statistics(data)
print(f"Mean: {mean}, Std: {std}")
"""
- 第三方库调用:
python! """
import os
import json
# 文件操作
files = os.listdir('.')
config = {"files": files}
print(json.dumps(config, indent=2))
"""
- 性能关键代码:
python! """
# 快速数据处理
data = list(range(1000000))
filtered = [x for x in data if x % 2 == 0]
print(f"Filtered {len(filtered)} even numbers")
"""
Python 逃生舱使用 python! 关键字和三引号定界符,避免了:
- Markdown 代码块冲突(不使用 ```)
- 大括号嵌套问题(不使用 {})
- 清晰的边界标识
Nexa 的 IDD 系统让需求文档变成可执行测试,形成"需求→实现→验证"的闭环。这是从 NTNT 语言学习的灵魂特性,融合了 Agent-native 验证,超越 NTNT 的 HTTP-only 模式。
在 Nexa 源代码中使用 @implements 注解将 agent 链接到 intent feature:
// @implements: feature.weather_bot
agent WeatherBot uses WeatherAPI implements WeatherReport {
role: "Weather Assistant",
prompt: "Provide weather information"
}
也支持 @supports 注解链接约束:
// @supports: constraint.output_format
agent Formatter {
role: "Format output"
}
.nxintent 文件定义 Feature、Scenario 和 Glossary,描述期望行为:
## Glossary
| Term | Means |
|------|-------|
| a user asks {question} | agent run with input {question} |
| the agent responds with {text} | output contains {text} |
| the response is valid | protocol check passes |
---
Feature: Weather Bot
id: feature.weather_bot
description: "Weather information agent"
Scenario: Weather query
When a user asks "What is the weather in Beijing?"
→ the agent responds with "weather"
→ the response is valid
Scenario: Invalid query handling
When a user asks "xyzzy"
→ the agent responds with "clarification"术语类型:
- 模式术语:含
{param}占位符,如they see {text} - 精确术语:无占位符,如
the response is valid - 展开术语:映射到多个断言,如
success response → ["status 2xx", "body contains 'ok'"]
IAL (Intent Assertion Language) 是术语重写引擎,将自然语言断言递归解析为可执行测试:
"they see success response"
↓ vocabulary lookup
"component.success_response"
↓ component expansion
["status 2xx", "body contains 'ok'"]
↓ standard term resolution
[Check(InRange, "response.status", 200-299), Check(Contains, "response.body", "ok")]
↓ execution
[✓, ✓]
# 验证代码是否符合 intent
nexa intent-check weather_bot.nx
# 显示特性覆盖率
nexa intent-coverage weather_bot.nx
# 指定 intent 文件路径
nexa intent-check weather_bot.nx --intent weather_bot.nxintent
# 详细输出
nexa intent-check weather_bot.nx --verbose// 声明意图
intent Bot shall "respond politely to user questions"
// 声明约束
intent Bot shall not "generate harmful content"
// 声明偏好
intent Bot prefers "concise responses over verbose ones"
关键能力:
- Intent 覆盖率测量:代码路径被 intents 覆盖的百分比
- Intent 验证:运行时检查 intent 满足情况
- 模糊 Intent 匹配:部分 intent 规范的近似匹配解析
Nexa v1.2 引入了 Design by Contract (DbC) 系统,为 Agent 编程带来契约式编程范式。开发者可以指定前置条件、后置条件和不变条件,在运行时验证 Agent 行为。
requires: input != None
ensures: result.length > 0
invariant: self.state in ["idle", "running"]
三种契约类型:
| 契约 | 关键字 | 语义 |
|---|---|---|
| 前置条件 | requires |
函数/方法调用前必须满足 |
| 后置条件 | ensures |
函数/方法返回后必须满足 |
| 不变条件 | invariant |
对象生命周期中始终满足 |
契约违反时抛出 ContractViolation 异常,包含违反类型、条件文本和上下文信息:
try {
result = SecureBot.run(user_input);
} catch (ContractViolation e) {
print("Contract violated: " + e.clause);
}
ContractViolation 集成:
- HTTP Server: 401 → requires violation, 403 → ensures violation
- KV Store: 失败操作 → ensures violation
- Concurrent: 任务失败 → contract violation
- ADT: 无效操作 → ContractViolation
除了确定性条件,Contract 还支持语义(自然语言)条件:
requires: "input contains a valid email address"
ensures: "response is helpful and accurate"
invariant: "agent always maintains professional tone"
语义条件通过 LLM 评判器在运行时验证。
Nexa v1.3 引入了内置 CLI 工具,提供智能体感知的代码检查、验证和 lint 功能。
nexa inspect script.nx输出包含:
- Agent 声明及其属性(role、model、prompt)
- Tool 声明及参数定义
- Flow 声明及管道依赖
- Agent-Tool 依赖关系图
nexa validate script.nx验证内容:
- Agent 的 prompt/model/工具是否配置完整
- Protocol 字段是否匹配 Agent 输出
- Tool 参数是否与 Agent uses 对应
- Flow 管道引用是否指向已声明的 Agent
nexa lint script.nxLint 规则:
- Agent prompt 长度是否合理(>10 字符)
- Agent 命名是否符合 PascalCase 规范
- Tool 命名是否符合 CamelCase 规范
- 是否有未使用的 Agent 或 Tool
- 是否缺少必要的
description属性
参见 §8 IDD 系统中的 CLI 命令描述。
Nexa 的渐进类型系统允许可选的类型注解,根据 NTNT_TYPE_MODE 环境变量决定强制程度。
let name: String = "hello"
let count: Int = 42
let active: Bool = true
let score: Float = 3.14
let scores: List[Int] = [1, 2, 3]
let config: Map[String, Int] = {"key": 1}
let maybe: Option[T] = Some(42)
let result: Result[T, E] = Ok(value)
| 模式 | 环境变量值 | 行为 |
|---|---|---|
| strict | NTNT_TYPE_MODE=strict |
类型违反 → TypeViolation 异常 |
| warn | NTNT_TYPE_MODE=warn |
类型违反 → TypeWarning 日志 |
| forgiving | NTNT_TYPE_MODE=forgiving |
类型违反 → 忽略 |
运行时类型检查通过 TypeChecker 和 TypeInferrer 实现:
TypeChecker.check(expression, expected_type)— 验证表达式类型TypeInferrer.infer_from_expression(expr)— 推断表达式类型TypeCheckResult— 检查结果(pass/fail/warning)
Nexa 的错误传播操作符提供 Rust 风格的简洁错误处理。
将错误向上传播(类似 Rust 的 ?):
let value = parse(input) ?
// 如果 parse 返回错误,立即向上传播
// 如果 parse 返回成功值,解包并继续
提供错误回退值:
let result = risky_operation() otherwise "fallback"
// 如果 risky_operation 失败,返回 "fallback"
尝试操作并捕获错误:
try {
data = fetch(url)
result = process(data) ?
} catch (e) {
result = handle_error(e)
}
// NexaResult — 成功或错误
Ok(value) // 成功结果
Err(error) // 错误结果
// NexaOption — 有值或无值
Some(value) // 有值
None // 无值
Agent-Native: wrap_agent_result() 将 Agent 返回值自动包装为 NexaResult。
Nexa 的 Job 系统提供后台任务处理 DSL。
job SendEmail on "emails" (retry: 2, timeout: 120) {
perform(user_id) {
// 执行任务逻辑
}
on_failure(error, attempt) {
// 失败回调
}
}
| 优先级 | 值 |
|---|---|
| Low | 0 |
| Normal | 1 |
| High | 2 |
| Critical | 3 |
| 策略 | 说明 |
|---|---|
| Fixed | 固定间隔重试 |
| Exponential | 指数退避重试 |
| Linear | 线性递增重试 |
schedule every 30s { health_check() }
schedule every 1h { cleanup() }
Nexa 的 HTTP Server 提供声明式 Web 服务 DSL。
server 8080 {
static "/assets" from "./public"
cors { origins: ["*"], methods: ["GET", "POST"] }
route GET "/chat" => ChatBot
route POST "/analyze" => DataExtractor |>> Analyzer
}
cors {
origins: ["https://example.com"]
methods: ["GET", "POST", "PUT"]
headers: ["Content-Type", "Authorization"]
credentials: true
max_age: 3600
}
ContractViolation 与路由集成:
requiresviolation → HTTP 401 (前置条件不满足)ensuresviolation → HTTP 403 (后置条件不满足)
static "/assets" from "./public"
static "/docs" from "./documentation" (index: true)
Nexa 的 Database 模块提供 SQLite 和 PostgreSQL 集成。
db connect "sqlite://data.db" {
query "SELECT * FROM users WHERE id = ?" [user_id]
execute "INSERT INTO logs (msg) VALUES (?)" [message]
}
db transaction {
execute "INSERT INTO orders (...) VALUES (...)" [order_data]
execute "UPDATE inventory SET count = count - 1 WHERE id = ?" [item_id]
}
// 存储 agent 记忆
agent_memory_store(agent, "user_preference", data)
// 查询 agent 记忆
agent_memory_query(agent, "recent conversations")
// 列出 agent 记忆
agent_memory_list(agent)
// 删除 agent 记忆
agent_memory_delete(agent, "old_session")
Nexa 的 3 层认证系统。
auth_decl {
providers: [google(client_id, client_secret), github(client_id, client_secret)]
session_store: memory
require_auth: ["/admin", "/api"]
}
| 层级 | 方式 | 说明 |
|---|---|---|
| Layer 1 | API Key | nexa-ak-{random32hex} 格式 |
| Layer 2 | JWT (HS256) | JWT 签名验证 |
| Layer 3 | OAuth 2.0 (PKCE) | Google/Github OAuth flow |
// 生成 agent API Key
agent_api_key_generate(agent)
// 获取认证上下文
agent_auth_context(agent)
Nexa 的结构化并发模块。
concurrent_decl {
spawn my_task { ... }
parallel [task_a, task_b, task_c]
race [fast_task, slow_task]
channel ch = channel()
after 500ms { cleanup() }
schedule every 30s { health_check() }
}
| 类别 | API |
|---|---|
| Channel | channel, send, recv, recv_timeout, try_recv, close, select |
| Task | spawn, await_task, try_await, cancel_task |
| Parallel | parallel, race |
| Timing | after, schedule, cancel_schedule, sleep_ms |
| Utility | thread_count, parse_interval |
spawn 接受 NexaAgent → agent.run(context),自动将 Agent 作为并发任务执行。
Nexa 的内置 Key-Value 存储系统。
kv_decl {
open "sqlite://cache.db"
}
open/get/set/del/has/list/expire/ttl/flush/set_nx/incr + get_int/get_str/get_json
// 语义查询
agent_kv_query(agent, "recent results")
// 存储 agent 数据
agent_kv_store(agent, "session_data", value)
// 上下文感知检索
agent_kv_context(agent, "preferences")
Nexa 的模板引擎系统。
// 变量插值 + 滤镜
template"""Hello {{name | upper}}!"""
// for 循环 + 元数据
template"""{{#for item in items}}{{@index}}:{{item}}{{/for}}"""
// if/elif/else 条件
template"""{{#if is_admin}}Admin{{#elif is_mod}}Mod{{#else}}User{{/if}}"""
// partial 引用
template"""{{> card user_data}}"""
| 变量 | 说明 |
|---|---|
@index |
0-based 索引 |
@index1 |
1-based 索引 |
@first |
是否第一个 |
@last |
是否最后一个 |
@length |
总长度 |
@even |
偶数索引 |
@odd |
奇数索引 |
upper/lower/capitalize/trim/truncate(n)/replace(from,to)/escape/raw/safe/default(val)/length/first/last/reverse/join(sep)/slice(start,end)/json/number(n)/url_encode/strip_tags/word_count/line_count/indent/date/sort/unique/abs/ceil/floor
// 自动注入 agent 上下文
agent_template_prompt(agent, template_str, context)
// 多源 slot 填充(优先级:explicit_data > auth_context > kv_data > memory > agent_attrs)
agent_template_slot_fill(agent, template_str, slot_sources)
// 注册 agent 专用模板
agent_template_register(agent, name, template_str)
管道操作符实现左到右数据流。
// x |> f → f(x)
result |> format_output
// x |> f(a,b) → f(x, a, b)
data |> std.text.upper |> process(delimiter=",")
// 链式管道
prompt |> agent.run |> extract_answer |> format_output
| 输入 | 脱糖结果 |
|---|---|
| `x | > f` |
| `x | > f(a)` |
| `x | > f(a,b)` |
| `x | > obj.method` |
defer 语句确保清理操作在作用域退出时执行,LIFO 顺序。
defer cleanup(db)
defer log("operation complete")
defer agent_cleanup(agent)
defer first() // 第二个执行
defer second() // 第一个执行
// 作用域结束时:先执行 second(),再执行 first()
安全回退值操作符。
result ?? "fallback"
config.timeout ?? 30
agent.run(prompt) ?? "I couldn't process that"
?? 右侧回退值在以下条件下触发:
- expr 为
None - expr 为
Option::None - expr 为空 dict
{}
a ?? b ?? c
// 逐级回退:a 为 None → 尝试 b → b 为 None → 尝试 c
Ruby 风格字符串插值。
"Hello #{name}, you are #{age} years old!"
"Status: #{result ?? 'pending'}"
"Agent #{agent.name} responding"
| 表达式类型 | 示例 | Python 生成 |
|---|---|---|
| 标识符 | #{name} |
name |
| 点访问 | #{user.name} |
user["name"] |
| 括号访问 | #{arr[0]} |
arr[0] |
| 组合 | #{data.items[0].name} |
data["items"][0]["name"] |
| 类型 | 转换规则 |
|---|---|
None |
→ "" |
bool |
→ "true"/"false" |
int/float |
→ str(value) |
dict/list |
→ json.dumps(value) |
Option::Some |
→ unwrap inner |
Option::None |
→ "" |
\#{ → literal #{(不插值)
7 种模式类型。
match result {
Option::Some(answer) => answer
Option::None => "no response"
}
match status {
200 => "success"
404 => "not found"
_ => "unknown"
}
| 模式 | 语法 | 说明 |
|---|---|---|
| Wildcard | _ |
匹配任何值,不绑定 |
| Variable | name |
匹配任何值,绑定变量 |
| Literal | 42, "hello", true |
匹配精确值 |
| Tuple | (a, b) |
匹配元组/数组 |
| Array | [a, b, ..rest] |
匹配数组 + rest |
| Map | { name, age: a, ..other } |
匹配 dict + rest |
| Variant | Option::Some(v) |
匹配枚举变体 |
let (key, value) = entry
let [first, ..rest] = items
let { name, age: a } = user_data
for (name, score) in rankings { ... }
for [head, ..tail] in sequences { ... }
代数数据类型系统。
struct Point { x: Int, y: Int }
struct AgentResult { answer: String, confidence: Float, tokens: Int }
let p = Point(x: 1, y: 2)
enum Option { Some(value), None }
enum Result { Ok(value), Err(error) }
enum AgentState { Idle, Running, Error(message) }
let opt = Option::Some(42)
let state = AgentState::Idle
trait Printable {
fn format() -> String
}
trait Serializable {
fn to_json() -> String
fn from_json(data: String) -> Self
}
impl Printable for Point {
fn format() -> String {
"Point(x=#{self.x}, y=#{self.y})"
}
}
所有 ADT 实例使用带 _nexa_* 前缀键的 Python dict:
Struct:
{"_nexa_struct": "Point", "_nexa_struct_id": 1, "x": 1, "y": 2}Enum variant:
{"_nexa_variant": "Some", "_nexa_enum": "Option", "_nexa_variant_id": 1, "value": 42}Unit variant:
{"_nexa_variant": "None", "_nexa_enum": "Option"}match opt {
Option::Some(v) => v
Option::None => 0
}
match state {
AgentState::Idle => "waiting"
AgentState::Running => "processing"
AgentState::Error(msg) => "error: #{msg}"
}