Auto编程语言
Auto编程语言(Auto Lang)有如下特点:
- 设计目标:自动化
- 类型:类C
- 生态:C/C++/Rust
- 实现语言:Rust
Auto语言是Soutek公司推出的技术产品Soutek Auto Stack的一部分。
用途
1. 作为配置语言,替代JSON/YAML
// 标准库
use upper;
// 变量
var dir = "/home/user/data"
// {key : value}对
root: dir
// 函数调用
root_upper: root.upper
// 字符串
views: f"${dir}/views"
// 可以在配置中查找key
styles: f"${views}/styles"
// 对象
attrs:
Auto语言的配置文件(Auto Config)后缀名为.ac
。
2. 作为构建器
配合Auto Builder,可以实现类似CMake的C/C++工程构建:
project: "osal"
version: "v0.0.1"
// 依赖项目,可以指定参数
dep
// 本工程中的库
lib
// 可以输出到不同的平台,指定不同的编译工具链、架构和芯片
port
port
// 可执行文件
exe
3. 作为脚本
#!auto
// 脚本模式下内置了常用的库
print "Hello, world!"
// 下面的命令会自动转化为函数调用:`mkdir("src/app", p=true)`
mkdir -p src/app
cd src/app
touch main.rs
// 也可以定义变量和函数
var ext = ".c"
// 可以顺序调用命令
touch "merged.txt"
for f in find_c_files
// 可以异步调用多个命令
let downloads = for f in readlines.map
// 可以选择等待所有的文件都下载完成
await downloads.join
Auto语言的脚本(Auto Script)文件后缀名为.as
。
Auto语言提供了一个动态执行环境(Auto Shell),可以用于脚本执行、开发调试等。
4. 作为模板
${title}
${title}
$ for n in 1..10 {
Item $n
}
模板可以替代任意形式的文本。
Auto语言的模板(Auto Template)文件后缀名为.at
。
Auto模板是Auto Gen代码生成系统的基础。
5. 作为UI系统的DSL
在Auto UI系统中,Auto模板用来描述UI界面。 Auto UI模板的语法风格类似Kotlin,组织模式类似于Vue.js。
// 定义一个组件
widget counter
语法概览
变量
// 变量定义
var a = 1
// 指定类型
var b bool = false
// 多变量
var c, d = 2, 3
// 常量定义
const PI = 3.14
函数
// 函数定义
int
// 函数变量(Lambda)
var my_mul =
// 函数作为参数
int
// 函数调用
calc
calc
数组
// 数组
var arr =
// 下标
println
println // 最后一个元素
// 切片
var slice = arr // [2, 3]
var slice1 = arr // [1, 2, 3, 4]
var slice2 = arr // [4, 5]
var slice3 = arr // [1, 2, 3, 4, 5]
// 范围(Range)
var r = 0..10 // 0 <= r < 10
var r1 = 0..=10 // 0 <= r <= 10
控制流
// 条件判断
if a > 0 else if a == 0 else
// 循环访问数组
for i in
// 循环一个范围
for n in 0..5
// 带下标的循环
for i, n in arr
// 无限循环
var i = 0
loop
// 模式匹配,类似switch/match
when a
对象
// 对象
var obj =
// 访问对象成员
println
// 成员赋值
obj.name = "Tom"
// get or else
println
// get or insert
println
// 所有成员
println
println
println
// 遍历对象
for k, v in obj
// 删除
obj.remove
枚举(TODO)
// 带成员的枚举
// 枚举变量
var a = Scale.M
// 访问枚举成员
println
// 枚举匹配
when a
// 联合枚举
// 联合枚举匹配
var s = get_shape
when s as Shape
// 获取联合枚举的数据
var p = s as Point
println
类型(TODO)
// 类型别名
type MyInt = int
// 类型组合
type Num = int | float
// 类型判断
type MyInt
MyInt as Printable
// 类型判断
var myint = MyInt
print
type MyArray
// 复杂类型判断,参数为type,且返回bool的函数,可以用来做任意逻辑的类型判断
bool
// 这里参数arr的类型只要通过了IsArray(T)的判断,就能够调用,否则报错
add_all
var d = 15
add_all // Error! d既不是[]int数组,也没有实现Iterable接口
type MySet
// MySet实现了Iterable接口,所以可以用于for循环
add_all
生成器(TODO)
// 生成器
// 使用生成器
for n in fib
// 或者函数式
fib.take.foreach
异步(TODO)
// 任意函数
str
// do关键字表示异步调用
let r = do fetch
// 返回的是一个Future,需要等待结果
println
// 多个异步调用
let tasks = for i in 1..10
// 等待所有任务都完成(或者超时)
let results = wait tasks
println
节点
// 节点
node button
// 新建节点
button
// 多层节点
node div
node li
node ul
node label
ul
使用与安装
Auto语言编译器本身只依赖于Rust和Cargo。
> git
> cd
> cargo