Skip to content

Latest commit

 

History

History
1206 lines (883 loc) · 27.8 KB

File metadata and controls

1206 lines (883 loc) · 27.8 KB

Nexa 语法参考手册 (v1.3)

本手册涵盖了 Nexa 语言从基础语法到 v1.3 引入的全部高级特性,包括智能体声明、路由协作、语义分支、测试断言、MCP 扩展、传统控制流、Intent-Driven Development、Design by Contract 以及 Agent-Native Tooling。所有符合本手册规范的代码皆可由 Nexa Compiler 直接转译并在 Nexa Runtime 中执行。

🆕 v1.3 新特性

本版本新增以下核心特性:

  1. 传统控制流 - 确定性的 if/else if/else、for each、while、break、continue
  2. Python 逃生舱 - 使用 python! """...""" 直接嵌入 Python 代码
  3. 二元运算符扩展 - 支持 +、-、*、/、% 算术运算
  4. 比较运算符 - 支持 ==、!=、<、>、<=、>= 比较运算
  5. Intent-Driven Development (IDD) - @implements/@supports 注解 + .nxintent 文件 + IAL 引擎
  6. Design by Contract (契约式编程) - requires/ensures/invariant 契约,支持确定性条件和语义(自然语言)条件
  7. Agent-Native Tooling - nexa inspect/validate/lint 命令,Agent 感知的代码分析

1. 核心层级结构 (Core Hierarchy)

Nexa 采用极简的顶层声明系统。核心一等公民包括 agent, tool, protocol, flow, test

1.1 工具声明 (tool)

用于挂载外部执行能力。支持绑定本地 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"
}

1.2 协议声明 (protocol)

基于强制类型的输出约束,在底层被转译为 Pydantic Schema。

protocol AnalysisReport {
    title: "string",
    sentiment: "string",
    confidence: "number"
}

1.3 智能体声明 (agent)

定义语言模型实例及其附带的工具或协议。支持模型路由与系统指令。

@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."
}

2. 编排与控制流 (Choreography & Control Flow)

2.1 主流程 (flow)

控制调度的中心单元。支持类似 Unix 管道的语法符。

flow main {
    raw_data = SearchMCP.run("AAPL Q3 index");
    // 管道组合符 >> 将前面的输出传递给后一节点
    summary = raw_data >> FinancialAnalyst >> Formatter;
    print(summary);
}

2.2 意图路由 (match intent)

依据自然语言使用底层文本大模型进行分发。

match user_req {
    intent("查询天气") => WeatherBot.run(user_req),
    intent("查询股市") => StockBot.run(user_req),
    _ => SmallTalkBot.run(user_req)
}

2.3 语义分支 (semantic_if & fast_match)

允许在传统布尔逻辑之外,针对非结构化文本进行语义条件判断。v0.9 引入了基于正则前置过滤的快速匹配,避免重复消耗 Token。

semantic_if "包含具体的日期和地点" fast_match r"\\d{4}-\\d{2}-\\d{2}" against user_input {
    schedule_tool.run(user_input);
} else {
    print("需要进一步澄清");
}

2.4 语义级循环 (loop until)

条件终止支持自然语言求值机制。

loop {
    draft = Editor.run(feedback);
    feedback = Critic.run(draft);
} until ("Article is engaging and grammatically perfect")

3. 测试与断言 (Testing Framework)

在 v0.9-alpha 引入的原生测试与调试支持。可通过 nexa test 调用。

test "financial_analysis_basic_pipeline" {
    mock_input = "Tesla revenue 2023";
    result = FinancialAnalyst.run(mock_input);
    
    // 断言结果符合特定语义预期
    assert "包含具体的马斯克管理评价" against result;
}

4. 完整的 EBNF 语法定义归档

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"' [^"]* '"'

5. DAG 操作符 (v0.9.7+)

Nexa v0.9.7 引入了用于复杂拓扑编排的 DAG 操作符。

5.1 分叉操作符 (|>>||)

将输入并行发送到多个 Agent:

// |>> 等待所有结果返回
results = input |>> [Agent1, Agent2, Agent3];

// || 不等待(fire-and-forget)
input || [Logger, Analytics];

5.2 合流操作符 (&>>&&)

将多个结果合并:

// &>> 顺序合流
result = [Researcher, Analyst] &>> Reviewer;

// && 共识合流(需要 Agent 达成一致)
consensus = [Agent1, Agent2] && JudgeAgent;

5.3 条件分支操作符 (??)

根据条件选择执行路径:

// 根据输入特征选择处理 Agent
result = input ?? UrgentHandler : NormalHandler;

5.4 复杂 DAG 拓扑

组合使用操作符构建复杂流程:

// 分叉后合流
final = topic |>> [Researcher, Analyst] &>> Writer >> Reviewer;

// 多阶段并行处理
report = data |>> [Preprocess1, Preprocess2] &>> Aggregator >> Formatter;

6. 传统控制流 (v1.0.1-beta)

v1.0.1-beta 引入了确定性传统控制流,与语义控制流(semantic_if、loop...until)明确区分。

6.1 传统 if/else if/else 语句

使用确定性比较运算符进行条件判断:

// 基本语法
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 - 逻辑或

6.2 for each 循环

遍历集合或数组:

// 基本语法
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);
}

6.3 while 循环

基于条件的循环:

// 基本语法
while (condition) {
    // 循环体
}

// 示例
counter = 0;
while (counter < 5) {
    print(counter);
    counter = counter + 1;
}

6.4 break 和 continue

循环控制语句:

// 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);  // 只打印奇数
}

6.5 二元运算符

v1.0.1-beta 支持基本算术运算:

运算符 含义 示例
+ 加法 x + y
- 减法 x - y
* 乘法 x * y
/ 除法 x / y
% 取模 x % y
count = count + 1;
average = total / count;
remainder = num % 2;

6.6 与语义控制流的区别

特性 传统控制流 语义控制流
条件判断 确定性比较 LLM 语义判断
语法 if (x > 5) semantic_if "条件" against var
循环终止 while (x < 10) loop...until(语义条件)
执行确定性 完全确定 依赖 LLM 输出

7. Python 逃生舱 (v1.0.1-beta)

当需要直接使用 Python 功能时,可以使用 python! 关键字嵌入原生 Python 代码。

7.1 基本语法

python! """
# Python 代码
import math
result = math.sqrt(16)
print(result)
"""

7.2 使用场景

  1. 复杂算法实现
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}")
"""
  1. 第三方库调用
python! """
import os
import json

# 文件操作
files = os.listdir('.')
config = {"files": files}
print(json.dumps(config, indent=2))
"""
  1. 性能关键代码
python! """
# 快速数据处理
data = list(range(1000000))
filtered = [x for x in data if x % 2 == 0]
print(f"Filtered {len(filtered)} even numbers")
"""

7.3 安全设计

Python 逃生舱使用 python! 关键字和三引号定界符,避免了:

  • Markdown 代码块冲突(不使用 ```)
  • 大括号嵌套问题(不使用 {})
  • 清晰的边界标识

8. Intent-Driven Development (IDD) (v1.1)

Nexa 的 IDD 系统让需求文档变成可执行测试,形成"需求→实现→验证"的闭环。这是从 NTNT 语言学习的灵魂特性,融合了 Agent-native 验证,超越 NTNT 的 HTTP-only 模式。

8.1 @implements 注解

在 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"
}

8.2 .nxintent 文件

.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'"]

8.3 IAL 引擎

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
[✓, ✓]

8.4 CLI 命令

# 验证代码是否符合 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

8.5 Intent 声明语法

// 声明意图
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 规范的近似匹配解析

9. Design by Contract (契约式编程) (v1.2)

Nexa v1.2 引入了 Design by Contract (DbC) 系统,为 Agent 编程带来契约式编程范式。开发者可以指定前置条件、后置条件和不变条件,在运行时验证 Agent 行为。

9.1 Contract 语法

requires: input != None
ensures: result.length > 0
invariant: self.state in ["idle", "running"]

三种契约类型

契约 关键字 语义
前置条件 requires 函数/方法调用前必须满足
后置条件 ensures 函数/方法返回后必须满足
不变条件 invariant 对象生命周期中始终满足

9.2 ContractViolation

契约违反时抛出 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

9.3 语义契约

除了确定性条件,Contract 还支持语义(自然语言)条件:

requires: "input contains a valid email address"
ensures: "response is helpful and accurate"
invariant: "agent always maintains professional tone"

语义条件通过 LLM 评判器在运行时验证。

10. Agent-Native Tooling (v1.3)

Nexa v1.3 引入了内置 CLI 工具,提供智能体感知的代码检查、验证和 lint 功能。

10.1 inspect — 结构化分析

nexa inspect script.nx

输出包含:

  • Agent 声明及其属性(role、model、prompt)
  • Tool 声明及参数定义
  • Flow 声明及管道依赖
  • Agent-Tool 依赖关系图

10.2 validate — 语义验证

nexa validate script.nx

验证内容:

  • Agent 的 prompt/model/工具是否配置完整
  • Protocol 字段是否匹配 Agent 输出
  • Tool 参数是否与 Agent uses 对应
  • Flow 管道引用是否指向已声明的 Agent

10.3 lint — 风格检查

nexa lint script.nx

Lint 规则:

  • Agent prompt 长度是否合理(>10 字符)
  • Agent 命名是否符合 PascalCase 规范
  • Tool 命名是否符合 CamelCase 规范
  • 是否有未使用的 Agent 或 Tool
  • 是否缺少必要的 description 属性

10.4 intent-check 和 intent-coverage

参见 §8 IDD 系统中的 CLI 命令描述。

11. Gradual Type System (v1.3.1)

Nexa 的渐进类型系统允许可选的类型注解,根据 NTNT_TYPE_MODE 环境变量决定强制程度。

11.1 类型注解

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)

11.2 类型模式

模式 环境变量值 行为
strict NTNT_TYPE_MODE=strict 类型违反 → TypeViolation 异常
warn NTNT_TYPE_MODE=warn 类型违反 → TypeWarning 日志
forgiving NTNT_TYPE_MODE=forgiving 类型违反 → 忽略

11.3 类型检查

运行时类型检查通过 TypeCheckerTypeInferrer 实现:

  • TypeChecker.check(expression, expected_type) — 验证表达式类型
  • TypeInferrer.infer_from_expression(expr) — 推断表达式类型
  • TypeCheckResult — 检查结果(pass/fail/warning)

12. Error Propagation (v1.3.2)

Nexa 的错误传播操作符提供 Rust 风格的简洁错误处理。

12.1 ? 操作符

将错误向上传播(类似 Rust 的 ?):

let value = parse(input) ?
// 如果 parse 返回错误,立即向上传播
// 如果 parse 返回成功值,解包并继续

12.2 otherwise 操作符

提供错误回退值:

let result = risky_operation() otherwise "fallback"
// 如果 risky_operation 失败,返回 "fallback"

12.3 try 块

尝试操作并捕获错误:

try {
    data = fetch(url)
    result = process(data) ?
} catch (e) {
    result = handle_error(e)
}

12.4 NexaResult 和 NexaOption

// NexaResult — 成功或错误
Ok(value)   // 成功结果
Err(error)  // 错误结果

// NexaOption — 有值或无值
Some(value)  // 有值
None         // 无值

Agent-Native: wrap_agent_result() 将 Agent 返回值自动包装为 NexaResult。

13. Background Job System (v1.3.3)

Nexa 的 Job 系统提供后台任务处理 DSL。

13.1 Job DSL 语法

job SendEmail on "emails" (retry: 2, timeout: 120) {
    perform(user_id) {
        // 执行任务逻辑
    }
    on_failure(error, attempt) {
        // 失败回调
    }
}

13.2 优先级队列

优先级
Low 0
Normal 1
High 2
Critical 3

13.3 退避策略

策略 说明
Fixed 固定间隔重试
Exponential 指数退避重试
Linear 线性递增重试

13.4 Cron 调度

schedule every 30s { health_check() }
schedule every 1h { cleanup() }

14. Built-In HTTP Server (v1.3.4)

Nexa 的 HTTP Server 提供声明式 Web 服务 DSL。

14.1 Server DSL 语法

server 8080 {
    static "/assets" from "./public"
    cors { origins: ["*"], methods: ["GET", "POST"] }
    route GET "/chat" => ChatBot
    route POST "/analyze" => DataExtractor |>> Analyzer
}

14.2 CORS 配置

cors {
    origins: ["https://example.com"]
    methods: ["GET", "POST", "PUT"]
    headers: ["Content-Type", "Authorization"]
    credentials: true
    max_age: 3600
}

14.3 路由守卫

ContractViolation 与路由集成:

  • requires violation → HTTP 401 (前置条件不满足)
  • ensures violation → HTTP 403 (后置条件不满足)

14.4 静态文件

static "/assets" from "./public"
static "/docs" from "./documentation" (index: true)

15. Database Integration (v1.3.5)

Nexa 的 Database 模块提供 SQLite 和 PostgreSQL 集成。

15.1 Database DSL 语法

db connect "sqlite://data.db" {
    query "SELECT * FROM users WHERE id = ?" [user_id]
    execute "INSERT INTO logs (msg) VALUES (?)" [message]
}

15.2 事务管理

db transaction {
    execute "INSERT INTO orders (...) VALUES (...)" [order_data]
    execute "UPDATE inventory SET count = count - 1 WHERE id = ?" [item_id]
}

15.3 Agent-Native 记忆 API

// 存储 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")

16. Auth & OAuth (v1.3.6)

Nexa 的 3 层认证系统。

16.1 Auth DSL 语法

auth_decl {
    providers: [google(client_id, client_secret), github(client_id, client_secret)]
    session_store: memory
    require_auth: ["/admin", "/api"]
}

16.2 三层认证

层级 方式 说明
Layer 1 API Key nexa-ak-{random32hex} 格式
Layer 2 JWT (HS256) JWT 签名验证
Layer 3 OAuth 2.0 (PKCE) Google/Github OAuth flow

16.3 Agent-Native

// 生成 agent API Key
agent_api_key_generate(agent)

// 获取认证上下文
agent_auth_context(agent)

17. Structured Concurrency (v1.3.6)

Nexa 的结构化并发模块。

17.1 Concurrency DSL 语法

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() }
}

17.2 18 API 函数

类别 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

17.3 Agent-Native

spawn 接受 NexaAgent → agent.run(context),自动将 Agent 作为并发任务执行。

18. KV Store (v1.3.6)

Nexa 的内置 Key-Value 存储系统。

18.1 KV DSL 语法

kv_decl {
    open "sqlite://cache.db"
}

18.2 15 通用 API

open/get/set/del/has/list/expire/ttl/flush/set_nx/incr + get_int/get_str/get_json

18.3 3 Agent-Native API

// 语义查询
agent_kv_query(agent, "recent results")

// 存储 agent 数据
agent_kv_store(agent, "session_data", value)

// 上下文感知检索
agent_kv_context(agent, "preferences")

19. Template System (v1.3.6)

Nexa 的模板引擎系统。

19.1 Template 语法

// 变量插值 + 滤镜
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}}"""

19.2 ForLoop 元数据

变量 说明
@index 0-based 索引
@index1 1-based 索引
@first 是否第一个
@last 是否最后一个
@length 总长度
@even 偶数索引
@odd 奇数索引

19.3 30+ 滤镜

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

19.4 Agent-Native 模板

// 自动注入 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)

20. Pipe Operator |> (v1.3.7)

管道操作符实现左到右数据流。

20.1 基本语法

// 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

20.2 脱糖规则

输入 脱糖结果
`x > f`
`x > f(a)`
`x > f(a,b)`
`x > obj.method`

21. defer Statement (v1.3.7)

defer 语句确保清理操作在作用域退出时执行,LIFO 顺序。

21.1 语法

defer cleanup(db)
defer log("operation complete")
defer agent_cleanup(agent)

21.2 LIFO 执行顺序

defer first()   // 第二个执行
defer second()  // 第一个执行
// 作用域结束时:先执行 second(),再执行 first()

22. Null Coalescing ?? (v1.3.7)

安全回退值操作符。

22.1 语法

result ?? "fallback"
config.timeout ?? 30
agent.run(prompt) ?? "I couldn't process that"

22.2 触发条件

?? 右侧回退值在以下条件下触发:

  • expr 为 None
  • expr 为 Option::None
  • expr 为空 dict {}

22.3 链式使用

a ?? b ?? c
// 逐级回退:a 为 None → 尝试 b → b 为 None → 尝试 c

23. String Interpolation #{expr} (v1.3.7)

Ruby 风格字符串插值。

23.1 语法

"Hello #{name}, you are #{age} years old!"
"Status: #{result ?? 'pending'}"
"Agent #{agent.name} responding"

23.2 表达式支持

表达式类型 示例 Python 生成
标识符 #{name} name
点访问 #{user.name} user["name"]
括号访问 #{arr[0]} arr[0]
组合 #{data.items[0].name} data["items"][0]["name"]

23.3 类型转换

类型 转换规则
None ""
bool "true"/"false"
int/float str(value)
dict/list json.dumps(value)
Option::Some → unwrap inner
Option::None ""

23.4 转义

\#{ → literal #{(不插值)

24. Pattern Matching + Destructuring (v1.3.7)

7 种模式类型。

24.1 match 表达式

match result {
    Option::Some(answer) => answer
    Option::None => "no response"
}

match status {
    200 => "success"
    404 => "not found"
    _ => "unknown"
}

24.2 7 种模式类型

模式 语法 说明
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) 匹配枚举变体

24.3 let 解构

let (key, value) = entry
let [first, ..rest] = items
let { name, age: a } = user_data

24.4 for 解构

for (name, score) in rankings { ... }
for [head, ..tail] in sequences { ... }

25. ADT — Struct/Trait/Enum (v1.3.7)

代数数据类型系统。

25.1 struct 声明

struct Point { x: Int, y: Int }
struct AgentResult { answer: String, confidence: Float, tokens: Int }

let p = Point(x: 1, y: 2)

25.2 enum 声明

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

25.3 trait 声明

trait Printable {
    fn format() -> String
}

trait Serializable {
    fn to_json() -> String
    fn from_json(data: String) -> Self
}

25.4 impl 声明

impl Printable for Point {
    fn format() -> String {
        "Point(x=#{self.x}, y=#{self.y})"
    }
}

25.5 Handle-as-dict 表示

所有 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"}

25.6 match 与 ADT 配合

match opt {
    Option::Some(v) => v
    Option::None => 0
}

match state {
    AgentState::Idle => "waiting"
    AgentState::Running => "processing"
    AgentState::Error(msg) => "error: #{msg}"
}