# Abs Syntax Reference

> ABS 语法快速参考：权威 ABS 规则与示例 skill，覆盖块连接类型、参数顺序、语句输入、变量引用与常见示例。触发词：ABS、语法、块脚本

- Skill: `ailyproject/abs-syntax-reference` (Agent Skill)
- Install (CLI): `npx skillmds@latest add ailyproject/abs-syntax-reference`
- Raw SKILL.md: https://api.skillmd.com/api/skills/ailyproject/abs-syntax-reference/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: ailyproject (https://skillmd.com/u/ailyproject)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/ailyproject/abs-syntax-reference

---


# ABS (Aily Block Syntax) 快速参考

本 skill 只负责 ABS 语法规则与示例。项目规划、库安装、证据读取、工作区同步和验证流程由当前 host profile、可用工具说明及 `blockly-best-practices` skill 负责；不要从本语法参考重建那些流程。

使用库块时，参数顺序必须来自该库当前的 `readme_ai.md` 或 `block.json`，不能仅根据本文件中的通用示例推断。

## Block Connection Types

| Type | Role | Parameter Style |
|------|------|-----------------|
| **Value** | 作为值嵌入到其他块参数中 | 所有参数都写在括号内：`logic_compare($a, EQ, $b)` |
| **Statement** | 独立成行，通过 next 串联 | 普通参数写在括号内，语句输入使用 `@NAME:` |
| **Hat** | 根入口块，如 `arduino_setup`、`arduino_loop` | 规则与 Statement 相同 |

## Syntax Rules

| Element | Syntax | Example |
|---------|--------|---------|
| Block call | `block_type(param1, param2)` | `serial_println(Serial, text("Hi"))` |
| Empty params | `block_type()` | `time_millis()` |
| Statement input | `@NAME:` + 换行 + 缩进 | `@DO0:\n    action()` |
| Variable ref | `$varName` | `$count`, `$sensor` |

## Parameter Types

| Type | Syntax | Example |
|------|--------|---------|
| Dropdown | `ENUM_VALUE` | `Serial`, `HIGH`, `EQ`, `AND` |
| Text | `"string"` | `"hello"`, `"dht"` |
| Number | `123` | `9600`, `13` |
| Variable | `$name` | `$count`, `$temp` |
| Value block | `block(args)` | `math_number(10)`, `$var` |

## 参数顺序规则

**参数顺序必须严格遵循 block.json 中 `args0` 的定义顺序**，字段和输入可能交错出现，不能想当然地把下拉字段放到最前面。

例如 `logic_compare` 的 `args0` 顺序是：`A(input_value), OP(field_dropdown), B(input_value)`，因此：

- 正确：`logic_compare($a, EQ, $b)`
- 错误：`logic_compare(EQ, $a, $b)`

## Value Blocks

值块的所有参数都必须写在括号里，不能使用命名输入。

```abs
# Comparison: logic_compare(A, OP, B)
logic_compare($a, EQ, math_number(10))
logic_compare($temp, GT, math_number(30))

# Logic: logic_operation(A, OP, B)
logic_operation($sensor1, AND, $sensor2)
logic_operation(logic_compare($a, GT, math_number(0)), OR, logic_compare($a, LT, math_number(100)))

# Math: math_arithmetic(A, OP, B)
math_arithmetic($a, ADD, $b)

# Ternary: logic_ternary(condition, trueValue, falseValue)
logic_ternary(logic_compare($score, GTE, math_number(90)), text("A"), text("B"))

# Negate
logic_negate($flag)

# Boolean
logic_boolean(TRUE)
```

## Statement Blocks with Statement Inputs

语句输入必须使用 `@NAME:`，并且子块体使用 4 个空格缩进。

```abs
# If-Else: statement inputs use @NAME:
controls_if()
    @IF0: logic_compare($temp, GT, math_number(30))
    @DO0:
        serial_println(Serial, text("Hot"))
    @ELSE:
        serial_println(Serial, text("OK"))

# If-ElseIf-Else
controls_if()
    @IF0: logic_compare($v, GT, math_number(100))
    @DO0:
        action1()
    @IF1: logic_compare($v, GT, math_number(50))
    @DO1:
        action2()
    @ELSE:
        action3()

# Loop
controls_repeat_ext(math_number(10))
    serial_println(Serial, text("Loop"))

controls_for($i, math_number(0), math_number(10), math_number(1))
    serial_println(Serial, $i)
```

## Simple Statement Blocks

无语句输入的语句块，同样全部使用括号参数。

```abs
serial_begin(Serial, 115200)
serial_println(Serial, text("Hello"))
serial_println(Serial, $count)
time_delay(math_number(1000))
variables_set($count, math_number(0))
math_change($count, math_number(1))
```

## Program Structure

```abs
arduino_setup()
    serial_begin(Serial, 115200)

arduino_loop()
    serial_println(Serial, text("Hello"))
    time_delay(math_number(1000))
```

## Variable Reference Context

| Target Type | `$var` Becomes |
|-------------|-----------------|
| field_variable | 变量字段，如 `variables_set($x, ...)` |
| input_value | `variables_get` 表达式，如 `serial_println(Serial, $x)` |

## Checklist

- 必须写括号：`block()`，不能省略为 `block`
- `input_value` 位置的数字应写成 `math_number(n)`
- `input_value` 位置的文本应写成 `text("s")`
- 下拉值使用枚举值，如 `HIGH`、`Serial`、`EQ`、`AND`
- 语句体使用 4 空格缩进
- 只有语句输入才使用命名输入：`@IF0:`、`@DO0:`、`@ELSE:`
- 值块的所有参数都在括号里，不能写命名输入
- 参数顺序严格遵循 block.json 的 `args0` 定义，而不是“字段优先”

## 调试建议

1. 读取当前 `project.abs` 并从具体报错位置开始定位；host 已在提交 turn 前同步可见工作区。
2. 仅当工作区可能在 turn 开始后发生变化时，才使用 `syncAbs action="export"` 刷新文件。
3. 对照相关库 `readme_ai.md` 或 `block.json` 的 `args0` 顺序，修正参数位置、缩进和值块包装方式。
4. 使用当前 host 同步能力重新导入并验证，依据最近的报错做最小修复。

