附录 A:FluffOS LPC 快速参考卡

附录 A:FluffOS LPC 快速参考卡

本附录为 FluffOS LPC 语言的精简速查手册,涵盖类型、运算符、修饰符、函数、预处理器、特殊形式和内置函数分类。适合作为日常开发的随身参考。


A.1 基本类型速查

类型 大小/范围 语义 值/引用
int 64 位有符号整数(-2⁶³ ~ 2⁶³-1) 整数,溢出为二进制补码回绕(-fwrapv 值类型
float C double,约 15 位有效数字 浮点数 值类型
string UTF-8 存储,长度按扩展字形簇计量 字符串,赋值复制 值类型
object 对象指针(32/64 位) 指向 LPC 对象的引用 引用类型
mapping 哈希表,键/值为 mixed 关联数组,赋值共享引用 引用类型
function 函数指针 一等函数,赋值共享引用 引用类型
buffer 字节数组,每元素 0-255 二进制缓冲区,赋值共享引用 引用类型
mixed 任意类型,关闭类型检查
void 仅用于函数返回值,表示无返回

数组声明: 类型名 *类型名 array,如 int *numsstring array names

Class 类型: class 类名,值类型结构体,不支持继承。

int *arr = ({ 1, 2, 3 });       // int 数组
mixed *stuff;                    // mixed 数组
class Person p = new(class Person);  // class 实例

A.2 运算符完整速查

算术运算符

运算符 说明 备注
+ 加法 也用于字符串拼接、数组合并、mapping 合并
- 减法 也用于数组差集
* 乘法 也用于 mapping 复合(数学意义)
/ 除法 INT_MIN / -1 为未定义行为
% 取模 INT_MIN % -1 为未定义行为

比较运算符

运算符 说明
== != 相等/不等(值类型比较值,引用类型比较指针)
< <= > >= 大小比较

逻辑运算符

运算符 说明 短路
&& 逻辑与
\|\| 逻辑或
! 逻辑非

位运算符

运算符 说明 备注
& 按位与
\| 按位或
^ 按位异或
~ 按位取反
<< >> 左移/右移 移位数截断到低 6 位(& 63

赋值运算符

运算符 说明
= 简单赋值
+= -= *= /= %= 算术复合赋值
&= \|= ^= 位运算复合赋值
<<= >>= 移位复合赋值

逻辑赋值运算符(FluffOS 扩展,短路求值)

运算符 等价于 说明
\|\|= x = x \|\| val falsy(0 或 undefined)时赋值
&&= x = x && val truthy 时赋值
??= x = x ?? val 仅 undefined 时赋值

自增/自减

++x    --x    // 前置(先变后用)
x++    x--    // 后置(先用后变)

条件与空值运算符

运算符 说明 示例
? : 三元条件 max = (a > b) ? a : b
?? 空值合并(左侧 undefined 时返回右侧) val = m["k"] ?? "default"

可选链(FluffOS 扩展,仅 mapping)

mapping m = 0;
mixed v = m?.key;        // 安全返回 0,不报错
mixed v2 = m?.["key"];   // 等价写法
mixed v3 = m.?[\"key\"]; // 另一种写法

注意: 0"" 不是 undefined,?? 不会替换它们。

逗号运算符

a = (x = 1, y = 2, x + y);  // a = 3

运算符优先级(从低到高)

优先级 运算符 结合性
最低 = += -= 等赋值 右结合
? : 三元 右结合
?? 空值合并 左结合
\|\| 逻辑或 左结合
&& 逻辑与 左结合
\| 按位或 左结合
^ 按位异或 左结合
& 按位与 左结合
== != 左结合
> >= < <= 左结合
<< >> 左结合
+ - 左结合
* / % 左结合
最高 ! ~ 一元 -

A.3 类型修饰符

修饰符 作用域 说明
private 函数/变量 不可被其他对象通过 -> 调用,不可被继承者访问
protected 函数/变量 类似 private(旧风格兼容)
public 函数/变量 即使私有继承也可访问
static 函数 不可被 -> 调用(仅本对象内部可用)
static 变量 不参与 save_object/restore_object 序列化
nomask 函数 禁止被继承覆盖或 shadow()
nosave 变量 不参与序列化保存(同 static 变量效果)
varargs 函数 可接受可变数量参数(未传的参数为 0)
virtual 函数/变量 虚函数/虚变量

组合使用:

private static int internal_counter;
public varargs mixed query(string key, mixed def) { ... }
static nosave int temp_data;

访问控制段落:

private:     // 后续定义默认为 private
int secret;
public:      // 后续定义默认为 public
void api() { ... }

A.4 函数语法速查

标准定义

int add(int a, int b) {
    return a + b;
}

前向声明(原型)

int add(int, int);     // 类型必须,参数名可选
void greet(string);

可变参数(varargs)

varargs mixed query(string key, mixed def) {
    // def 未传时为 0
    return def;
}

// ... 语法收集剩余参数为数组
varargs void debug(string fmt, mixed *args...) {
    // args 包含 fmt 之后的所有参数
}

默认参数

void greet(string name, string title : (: "friend" :)) {
    write("Hello, " + title + " " + name + "!\n");
}
greet("Alice");          // title = "friend"
greet("Bob", "Sir");     // title = "Sir"

默认值使用函数指针语法 (: expr :),在调用时调用者上下文中求值。

按引用传递(ref / &)

// 声明处
void increment(int ref value) { value++; }
void append(mixed & arr, mixed item) { arr += ({ item }); }

// 调用处
int x = 10;
increment(ref x);     // x = 11
increment(& x);       // x = 12

限制: 声明和调用处必须同时使用 ref/&;参数必须是左值。

函数调用方式

add(1, 2);                    // 本对象函数
ob->query("name");            // 其他对象方法
call_other(ob, "query", "name");  // 等价写法
efun::write("hello");         // 绕过 simul_efun,直接调用驱动内置
f(1, 2);                      // 通过函数指针调用
(*f)(1, 2);                   // 旧式写法
evaluate(f, 1, 2);            // 等价写法

函数名称限定

foo()                   // 本对象或全局函数
::foo()                 // 绕过继承,直接调用本对象的版本
Parent::foo()           // 调用指定继承类的方法
int::to_string(42)      // 内置类型方法

A.5 函数指针五种类型

类型 语法 参数求值时机 示例
本地函数 (: func :)func 创建时 function f = add;
efun 指针 (: efun :) 创建时 function f = (: write :);
call_other (: object, "method" :) 创建时 function f = (: ob, "query_name" :);
表达式函数 (: $1 + $2 :) 使用时 function f = (: $1 + $2 :);
匿名函数 function(type arg) { ... } 使用时 function f = function(int x) { return x*2; };

简化语法(新)

function f = add;              // 直接赋值函数名
function f = write;            // efun 也适用
int result = f(5, 3);          // 直接调用,无需 evaluate()

带绑定参数

function f = (: write, "Hello!\n" :);
f();  // 输出 "Hello!\n"

$N 参数占位符与 $() 捕获

function cmp = (: $1 - $2 :);              // $1, $2 引用调用时参数
function f = (: tell_object($1,            // $1 调用时求值
    $(this_player()->query_name()) + " bows.\n") :);  // $() 创建时求值

A.6 预处理器指令

宏定义

#define MAX_HP 100                        // 对象宏
#define SQUARE(x) ((x) * (x))            // 函数宏(括号紧跟名称)
#define STR(x) #x                         // 字符串化
#define CONCAT(a, b) a ## b              // 标记粘合
#define LONG(x) do { write(x); } while (0)  // 多行宏(反斜杠续行)
#undef MAX_HP                            // 取消定义

文件包含

#include "defs.h"       // 先相对当前文件,再搜索 include path
#include <mudlib.h>     // 只搜索 include path
#include CONFIG         // 文件名可由宏产生

条件编译

#ifdef FEATURE_X
    // FEATURE_X 已定义时编译
#endif

#ifndef GUARD_H
#define GUARD_H
    // include guard 模式
#endif

#if EXPRESSION
#elif OTHER_EXPR
#else
#endif

#if 表达式扩展:

  • defined(NAME) — 宏是否已定义
  • efun_defined(name) — 驱动是否编译了该 efun
#if defined(__PACKAGE_CRYPTO__) && efun_defined(hash)
string h = hash("sha256", data);
#endif

编译控制

#pragma strict_types       // 强制类型检查(强烈推荐每个文件开头使用)
#pragma warnings           // 启用警告
#pragma no_warnings        // 禁用警告
#pragma save_types         // 保存类型信息(供继承者类型检查)
#pragma optimize           // 启用额外优化

错误与警告

#error "This configuration is not supported"
#warn "This function is deprecated, use new_func instead"

预定义宏

说明
__FILE__ 当前文件名
__LINE__ 当前行号
__DIR__ 当前文件目录
FLUFFOS FluffOS 版本号
MAX_INT 最大整数值
__PACKAGE_*__ 各功能包是否编译(如 __PACKAGE_DB____PACKAGE_CRYPTO__

A.7 特殊内置形式

catch — 异常捕获

// 捕获表达式
string err = catch(some_dangerous_call());
if (err) write("Error: " + err + "\n");

// 捕获代码块
string err = catch {
    load_object("/dangerous");
    do_something();
};

sscanf — 字符串解析

string input = "Alice 25";
string name;
int age;
sscanf(input, "%s %d", name, age);
// name = "Alice", age = 25

parse_command — 命令解析

parse_command(cmd, env, fmt, lvalue, ...);

time_expression — 计时

int ticks = time_expression {
    some_expensive_operation();
};
write("Operation took " + ticks + " ticks.\n");

new — 克隆对象 / 创建 class 实例

object ob = new("/npc/goblin");                                    // 克隆对象
object ob = new("/npc/goblin", "Goblin King");                    // 带参数克隆
class Person p = new(class Person, name : "Alice", level : 10);  // class 实例

A.8 Efun 分类速查

FluffOS 提供约 250+ 个内置函数(efun),按功能分类:

数组操作

函数 说明
allocate(size) 分配指定大小的数组(初始化为 0)
sizeof(arr) 数组/字符串/mapping/buffer 长度
member_array(item, arr) 查找元素索引(未找到返回 -1)
filter(arr, func) 过滤数组
map(arr, func) 映射数组
sort_array(arr, func) 排序
distinct_array(arr) 去重
flatten_array(arr) 展平嵌套数组
intersect_array(a, b) 交集
union_array(a, b) 并集
unique_array(arr, func) 按函数分组

字符串操作

函数 说明
sprintf(fmt, ...) 格式化输出
sscanf(str, fmt, ...) 格式化解析
explode(str, delim) 分割为数组
implode(arr, delim) 合并为字符串
strsrch(str, target) 搜索子串位置
replace_string(str, old, new) 替换子串
strlen(str) 字符数(字形簇)
strwidth(str) 显示宽度(全角占 2 列)
lower_case(str) 转小写
capitalize(str) 首字母大写
trim(str) 去首尾空白
crypt(str, seed) 加密

正则表达式

函数 说明
pcre_match(str, pattern) PCRE 正则匹配
pcre_replace(str, pattern, rep) PCRE 替换
pcre_extract(str, pattern) PCRE 提取
regexp(arr, pattern) 用正则过滤数组

对象操作

函数 说明
clone_object(path) 克隆对象(等价 new
destruct(ob) 销毁对象
move_object(ob, env) 移动对象到新环境
environment(ob) 获取所在环境
all_inventory(ob) 获取所有内容物
find_object(path) 查找已加载对象
object_name(ob) / file_name(ob) 获取对象名/文件名
living(ob) / userp(ob) / interactive(ob) 类型判断

玩家交互

函数 说明
write(str) 向当前玩家输出
tell_object(ob, str) 向指定对象输出
say(str) 向***间所有人输出
input_to(func) 等待玩家输入
add_action(func, verb) 注册命令动词
this_player() 当前玩家对象
this_object() 当前对象

数学函数

函数 说明
abs(x) 绝对值
sqrt(x) 平方根
random(n) 随机数 0..n-1
to_int(x) / to_float(x) 类型转换
sin/cos/tan/asin/acos/atan 三角函数
pow(x, y) / log(x) / exp(x) 幂/对数/指数
floor(x) / ceil(x) 取整

文件操作

函数 说明
read_file(path) 读文件
write_file(path, str) 写文件
file_size(path) 文件大小(-1 不存在,-2 为目录)
rename(old, new) 重命名
rm(path) 删除文件
mkdir(path) 创建目录
get_dir(pattern) 列目录(支持通配符)

数据库

函数 说明
db_connect(host, user, pass) 连接数据库
db_exec(conn, sql) 执行 SQL
db_fetch(result, row) 获取结果行
db_close(conn) 关闭连接
db_status() 数据库状态

系统函数

函数 说明
time() 当前 Unix 时间戳
uptime() 驱动运行时间(秒)
memory_info() 内存使用信息
debug_info(level) 调试信息
call_out(func, delay) 延时调用(返回 ID)
remove_call_out(id) 取消延时调用

函数指针操作

函数 说明
evaluate(func, args...) 调用函数指针
function_owner(func) 获取函数所属对象

A.9 字面量速查

// 整数
42                  // 十进制
0xFF                // 十六进制(0x 前缀)
0777                // 八进制(0 前缀)
0b1010              // 二进制(0b 前缀)
1_000_000           // 下划线分隔符

// 浮点
3.14                // 标准形式
1.                  // 等价 1.0
2.5e6               // 科学记数法

// 字符串
"hello"             // 双引号
"hello" " world"    // 相邻自动拼接
"line1\nline2"      // 转义序列
"\u20ac"            // Unicode 转义
"\x41"              // 十六进制转义
"\101"              // 八进制转义

// 字符字面量(返回整数)
'A'                 // 65
'\n'                // 10

// 模板字面量(反引号)
`Hello, ${name}!`   // 支持 ${} 插值
`price is \$100`    // 美元转义

// Heredoc
@END                // 单个字符串(含末尾换行)
多行内容
END

@@END               // 字符串数组(每行一个元素)
第一行
第二行
END

// 复合字面量
({ })               // 空数组
({ 1, 2, 3 })       // 数组(支持尾逗号)
([])                 // 空 mapping
([ "k": v ])        // mapping(支持尾逗号)

A.10 控制流速查

// 条件
if (cond) { } else if (cond) { } else { }

// 循环
while (cond) { }
do { } while (cond);
for (init; cond; step) { }
foreach (var in expr) { }
foreach (k, v in expr) { }         // 带索引
foreach (int ref n in arr) { }     // 按引用遍历(可修改数组元素)

// 分支
switch (expr) {
    case "string": ...; break;     // 字符串 case
    case 1..10: ...; break;        // 整数范围
    case 51..: ...; break;         // 到无穷
    default: ...;
}

// 跳转
break; continue; return; return expr;

A.11 索引与切片速查

arr[0]              // 正向索引(第一个)
arr[<1]             // 反向索引(最后一个)
arr[<3]             // 倒数第三个
arr[0..4]           // 范围切片(包含两端)
arr[2..<1]          // 第三个到最后一个
arr[<3..<1]         // 倒数第三到倒数第二
arr[2..]            // 第三个到末尾
arr[..<2]           // 开头到倒数第三个
arr[1..3] = ({10}); // 范围赋值(可改变长度)
str[0]              // 返回 Unicode 码点(整数)
str[0..0]           // 返回子串(字符串)
m["key"]            // mapping 键查找
m->key              // mapping 箭头语法

A.12 继承速查

inherit "/std/object";              // 公有继承(默认)
private inherit "/std/internal";    // 私有继承
public inherit "/std/weapon";       // 公有继承(显式)

// 访问被覆盖的父函数
::query_long();                     // 当前对象中被覆盖的版本
Object::reset();                    // 指定继承类的方法

A.13 编码风格速查

项目 规范
缩进 2 空格,不用 Tab
行宽 100 列
花括号 K&R 风格
函数/变量名 lower_snake_case
宏/常量 ALL_CAPS
类名 PascalCase
类型检查 每个文件开头 #pragma strict_types
头文件保护 #ifndef / #define / #endif
宏参数 加括号:#define SQ(x) ((x)*(x))
多语句宏 do { ... } while(0) 包裹

本参考卡基于 FluffOS 源码 src/compiler/internal/grammar.ydocs/lpc/ 官方文档和 src/packages/*.spec 编写。更多细节请参阅正文各章节。

京ICP备13031296号-4