Pico 文档

标准库

内置函数(无需导入)

print(值1, 值2, ...)
打印(值1, 值2, ...)

打印所有参数,空格分隔,末尾换行。

打印("hello", "world")   # hello world
打印(1, 2, 3)            # 1 2 3

range

range(n)         # 生成 [0, 1, ..., n-1]
range(start, end) # 生成 [start, ..., end-1]
range(5)         # [0, 1, 2, 3, 4]
range(2, 6)      # [2, 3, 4, 5]

len / 长度

len(字符串)   # 字节长度
len(列表)     # 元素个数

Mutex / 互斥锁

令 锁 = Mutex()
锁.lock()
锁.unlock()

Channel / 通道

令 ch = Channel(容量)   # 有缓冲通道
ch.send(值)
令 v = ch.recv()        # 阻塞直到有值

net / 网络

net.listen(端口, 处理函数)
网络.监听(端口, 处理函数)

启动 HTTP/1.1 服务器,阻塞运行:

net.listen(8080, fn(请求, 响应):
    响应.发送("hello")
)

data / 数据

data.json / 数据.json

序列化为 JSON 字符串:

data.json({name: "pico", ok: true})
# '{"name":"pico","ok":true}'

data.json([1, 2, 3])
# '[1,2,3]'

支持:nil → null,bool,int,float,string,list,map。


ui / 界面

需要 Qt 环境(编译时加 -DQT_AVAILABLE)。无 Qt 时函数返回 stub 值,不报错。

令 窗口 = ui.window("标题", 宽, 高)   # 创建窗口
令 按钮 = ui.button("文字")           # 创建按钮
令 标签 = ui.label("文字")            # 创建标签
令 输入 = ui.input("占位符")          # 创建输入框

ui.add(窗口, 按钮)                    # 向窗口添加控件
ui.show(窗口)                         # 显示窗口
ui.on_click(按钮, fn(): 打印("点击")) # 绑定点击事件
ui.exec()                             # 启动事件循环(阻塞)

中文别名:ui.窗口 ui.按钮 ui.标签 ui.输入框 ui.添加 ui.显示 ui.点击时 ui.运行

完整示例:

令 窗口 = ui.窗口("Pico App", 400, 300)
令 按钮 = ui.按钮("点击我")
令 标签 = ui.标签("等待点击...")

ui.点击时(按钮, fn():
    打印("按钮被点击")
)

ui.添加(窗口, 标签)
ui.添加(窗口, 按钮)
ui.显示(窗口)
ui.运行()

WASM / 浏览器运行

编译为 WebAssembly:

emcc -std=c11 -O2 -Isrc \
  src/ast.c src/error.c src/gc.c src/interpreter.c src/lexer.c \
  src/parser.c src/value.c src/wasm_entry.c src/stdlib/json.c \
  -s WASM=1 \
  -s EXPORTED_FUNCTIONS='["_pico_wasm_run","_malloc","_free"]' \
  -s EXPORTED_RUNTIME_METHODS='["ccall","cwrap"]' \
  -o pico.js

在浏览器中调用:

<script src="pico.js"></script>
<script>
Module.onRuntimeInitialized = () => {
  const run = Module.cwrap('pico_wasm_run', 'string', ['string']);
  const output = run('打印("hello from wasm")');
  console.log(output);
};
</script>

也可直接从 Releases 下载预编译的 pico-v*.js + pico-v*.wasm


字节码 VM

Pico 内置字节码编译器和虚拟机,支持 30+ 指令:

指令类别指令
字面量OP_CONST OP_NIL OP_TRUE OP_FALSE
变量OP_GET_LOCAL OP_SET_LOCAL OP_GET_GLOBAL OP_SET_GLOBAL
算术OP_ADD OP_SUB OP_MUL OP_DIV OP_MOD OP_NEG
比较OP_EQ OP_NEQ OP_LT OP_LE OP_GT OP_GE
逻辑OP_AND OP_OR OP_NOT
控制流OP_JUMP OP_JUMP_IF_FALSE OP_LOOP
集合OP_MAKE_LIST OP_MAKE_MAP OP_INDEX OP_GET_FIELD OP_SET_FIELD
函数OP_CALL OP_RETURN OP_MAKE_FN

VM 与树遍历解释器并存,当前默认使用解释器。


REPL 命令

命令说明
:quit / :exit / :退出退出 REPL

CLI 用法

pico                    # 启动 REPL
pico run <文件.pico>    # 运行脚本
pico build <文件.pico>  # 编译为原生二进制(开发中)