打开/关闭搜索
搜索
打开/关闭菜单
65
32
5
2710
导航
首页
总览
沙盒页
备忘页
最近更改
随机页面
特殊页面
上传文件
打开/关闭外观设置菜单
无法加载偏好设置。请检查您的网络连接并重试。
重试
打开/关闭个人菜单
未登录
未登录用户的IP地址会在进行任意编辑后公开展示。
user-interface-preferences
个人工具
登录
查看“︁用户:DGCK81LNN/WhatLang”︁的源代码
来自 LNN的:not(博客)?
查看
阅读
查看源代码
查看历史
associated-pages
用户页
讨论
更多操作
←
用户:DGCK81LNN/WhatLang
因为以下原因,您没有权限编辑该页面:
您请求的操作仅限属于这些用户组的用户执行:
用户
、导入者
您可以查看和复制此页面的源代码。
WhatLang 的原始解释器,又称Koishi运行时,使用 TypeScript 编写,可作为[https://koishi.chat Koishi.js]的[https://www.npmjs.com/package/koishi-plugin-whatlang 插件]安装。使用bot命令 {{LNNBot命令链接|whatlang}},或直接发送以 <code>¿</code> 开头的代码即可运行。Koishi运行时内置 <code>help@</code> 帮助函数,可返回中文帮助信息。 WhatLang 解释器核心发布为 npm 包 [https://www.npmjs.com/package/whatlang-interpreter whatlang-interpreter],附带一个 Node.js 可执行程序 <code>what</code> 可在命令行使用。命令行环境暂未实现标准输入读取和文件系统交互功能。 DGCK81LNN 还开发了另一套运行时 WhatServer,内嵌在 Koishi 机器人的网页控制台中,处理所有路径以 <code>/what</code> 开头的 HTTP 请求。它支持 WhatNoter 与 WhatCommands,但不支持大部分Koishi运行时特有函数。 预防计划重构新版 WhatLang,引入“拉丁-1补充”区段的字符作为新命令,新增Map数据类型与局部变量,同时会带来多处不兼容语法变更。 == 运行机制 == WhatLang 拥有四种值类型:字符串(String)、数字(Number)、数组(Array)、未定义(Undefined)。数字为64位浮点数,包含 NaN。字符串和数字是不可变的;数组可原地修改,长度动态,可存放混合类型数据。 虚拟机内部维护一层栈中栈结构,称为'''帧栈'''(Frame Stack)。帧栈最顶层的栈称为'''主栈''',绝大多数代码命令都针对主栈。新数据压入栈顶,读取、弹出也从栈顶操作。使用 <code>[</code> 或 <code>|</code> 命令创建或编辑数组时,该数组会被压入帧栈,临时成为当前主栈;执行 <code>]</code> 后,数组从帧栈弹出,作为数组元素放回上一级栈。 数组与栈互相转换时不会生成新对象;若复制数组引用后通过 <code>| ]</code> 修改数组,所有引用该数组的位置都会同步变更。 虚拟机同时内置字典,用于存储具名变量。 部分运行时存在独立的「输出栈(Output Stack)」:每次打印内容都会压入输出栈。<code>send@</code>、<code>sends@</code> 等函数可弹出输出栈内容并立即发送;程序结束时,输出栈内剩余内容会统一输出。 Koishi运行时的输出栈可存放文本片段、附件、消息回复引用;其他环境支持打印原始字节数据。 本文档统一约定: * 栈为空时执行弹出操作,返回未定义(Undefined); * 一次性弹出多个值时,描述顺序为从栈底到栈顶; * 「返回某值」等价于将该值压入主栈; * 使用参数执行字符串函数:复制当前栈生成临时栈,将参数、函数字符串依次压入临时栈,执行 <code>@</code> 调用命令;执行结果为临时栈栈顶值,若临时栈为空则为未定义; * 字符串可视为字符串数组:常规遍历单位为**字符**,部分操作单位为**编码单元**。编码单元依实现不同可为单字符或UTF-16码元;官方实现采用UTF-16码元,一个「字符」可对应单个BMP平面Unicode字符,或一对UTF-16代理对。 该区分至关重要:不同函数对含非BMP字符的字符串处理逻辑不同。例如 <code>len@</code> 统计编码单元数量,<code>#</code> 按字符遍历字符串;<code>arr@</code> 将字符串拆分为字符数组,<code>""split@</code> 按编码单元分割字符串。 ;类型强制转换 将任意值转为字符串(String):按人类可读格式序列化;字符串自动添加引号并转义特殊字符;数字使用标准十进制输出;未定义转为 <code>undef</code>;数组元素逗号分隔、方括号包裹;自 [https://github.com/DGCK81LNN/whatlang-interpreter/commit/5759ee099781cb7982e257f28ac95d54e3f1356b v0.4.0] 起,超长或深层嵌套数组会用省略号截断。 将任意值强制转为数字(Number)规则如下: {|class="wikitable" ! 输入值 !! 转换结果 |- | 字符串 || 去除首尾空白后尝试解析为数字;支持二进制`0b`、八进制`0o`、十六进制`0x`前缀;支持科学计数法E/e(正负尾数、正负指数,正号可省略);不支持千位分隔符;无法解析时返回NaN |- | 未定义 || NaN |- | 数组 || 空数组返回0;仅含单个元素时递归转换该元素为数字;其余情况返回NaN |} 真值判定:除0、空字符串、未定义外均为真值;NaN、空数组均判定为真。 == 命令集 == {|class="wikitable" ! 命令 !! 名称 !! 说明 |- | <code>0</code> | 数字零 | 压入数值0。 |- | 1~9开头、后跟任意位0~9数字 | 正数字面量 | 压入对应数字。 |- | ASCII字母开头,后跟任意ASCII字母、数字、下划线 | 标识符字面量 | 将标识符转为全小写字符串压入栈。 |- | <code>'</code> 后跟单个字符 | 字符字面量 | 将单个字符作为字符串压入栈。 [https://github.com/DGCK81LNN/whatlang-interpreter/commit/8663d565a51a8f7176ac5eb8ece3ac509be2167a v0.3.0] 之前仅支持单个UTF-16编码单元,无法输入非BMP字符。 |- | <code>"</code> 包裹文本 | 引号字符串字面量 | 将包裹文本作为完整字符串压入栈。 换行 `\n`、制表符 `\t` 可转义;自 [https://github.com/DGCK81LNN/whatlang-interpreter/commit/e05c5d79abbbf59b6da719a8ca65daade085c7df v0.2.0] 新增 `\r` `\f` `\v`;单独反斜杠会让后一个字符原样输出。 |- | <code>`</code> 包裹文本 | 直接打印字面量 | 逻辑同双引号字符串,但不会压入栈,直接输出文本。 |- | <code>+</code> | 加法/拼接 | 弹出a、b两个栈顶值,执行合并运算: * 双方均为数组/均为字符串:执行拼接; * 一方为数组,另一方转为单元素数组后拼接; * 一方为字符串,另一方强制转字符串后拼接; * 任意一方为NaN/未定义,结果为NaN; * 其余场景执行数值加法。 数组拼接功能于 [https://github.com/DGCK81LNN/whatlang-interpreter/commit/cd29132f598e289faec40bdad04d6975ed6957d6 v0.2.2] 加入,此前数组相加行为未定义。 |- | <code>-</code> <code>*</code> <code>/</code> <code>%</code> | 四则运算 | 弹出a、b,统一转为数字,计算 `a 运算符 b` 并压入结果。 |- | <code>?</code> | 比较 | 弹出a、b进行比较:宽松相等(等价JS `==`;数组仅同一引用才算相等)返回0;a大于b返回1;a小于b返回-1;无法比较返回NaN。 |- | <code>~</code> | 逻辑非 | 弹出单个值;假值返回1,真值返回0。 |- | <code>[</code> | 新建数组栈 | 开辟一层空栈,用于构建数组。 |- | <nowiki>|</nowiki> | 切换至数组栈 | 弹出栈顶值,若非数组则抛出错误;将该数组设为当前操作栈。 |- | <code>]</code> | 关闭数组栈 | 将当前栈转为数组,退回上一级栈并把数组压入栈顶。 <code>[ ]</code>、<code>| ]</code> 必须成对匹配。 |- | <code>()</code> 包裹文本(允许括号嵌套) | 无转义字符串 | 直接提取括号内全部文本为字符串,不解析转义符。 |- | <code>.</code> | 打印栈顶 | 输出栈顶元素,不弹出;栈空则输出 `undef`。 |- | <code>\</code> | 交换栈顶两位 | 交换栈最上方两个元素;栈元素不足2个则无操作。 |- | <code>:</code> | 复制栈顶 | 复制栈顶元素压入栈;数组仅复制引用,不深拷贝;栈空无操作。 |- | <code>&</code> | 下沉栈顶 | 弹出栈顶元素,插入栈底;栈空无操作。 |- | <code>_</code> | 丢弃栈顶 | 弹出并丢弃栈顶值。 |- | <code>=</code> | 赋值具名变量 | 弹出字符串作为变量名,将剩余栈顶值赋予该变量;若无剩余值则赋值未定义。 |- | <code>^</code> | 读取具名变量 | 弹出字符串变量名;存在该变量则返回变量值;为内置函数名则返回「函数名@」;其余返回未定义。 |- | <code>@</code> | 函数调用/代码执行 | 弹出字符串:若是内置函数则直接调用;若是已定义变量,则将变量值作为代码执行(变量值必须为字符串);其余情况直接将字符串作为代码运行。 未来版本计划限制变量名规则:仅允许小写ASCII字母开头,仅包含小写字母、数字、下划线;不符合规则的标识符会直接作为代码文本执行。 |- | <code>></code> | 打包数组 | 弹出n并转为整数;取出栈顶n个元素,打包为新数组压入栈。 n为0或负数时,保留栈底 |n| 个元素,其余打包为数组。 |- | <code><</code> | 展开序列 | 弹出数组/字符串,将内部所有元素依次压入栈;输入非数组、非字符串则报错。 |- | <code>{</code> | 循环起始 | 弹出判断值;若为假,直接跳转到匹配的 <code>}</code>。 |- | <code>}</code> | 循环结束 | 弹出判断值;若为真,跳转回匹配的 <code>{</code>。 <code>{ }</code> 必须成对匹配。 |- | 连续多个 <code>!</code> | 跳出循环/终止执行 | 跳出对应层数嵌套循环;!数量超过循环嵌套层数时,终止当前代码块:退出当前@调用、终止#迭代、或直接结束程序。 |- | <code>#</code> | 映射遍历 | 弹出函数字符串func;遍历栈顶数组/字符串的每一项item,以item为参数执行func;将所有执行结果打包为数组返回。 栈顶必须是数组或字符串,否则报错;[https://github.com/DGCK81LNN/whatlang-interpreter/commit/e05c5d79abbbf59b6da719a8ca65daade085c7df v0.2.0] 前不支持字符串遍历。 |- | <code>,</code> | 读取序列下标 | 弹出下标n;取出栈顶数组/字符串对应下标元素。 n强制转为整数;栈顶非数组/字符串报错;字符串按下标取编码单元;负数下标从末尾倒数,-1代表最后一位;下标越界返回未定义。 |- | <code>;</code> | 修改序列下标 | 弹出n、value;修改栈顶数组下标n的元素为value。 n必须可转为整数或NaN;栈顶非数组报错;负数下标倒数;n等于数组长度/NaN时将value追加至数组末尾;其余越界下标不修改数组。 |- | <code>$</code> | 删除数组下标元素 | 弹出下标n;删除栈顶数组对应下标元素。 n强制转为整数;栈顶非数组报错;负数下标倒数;下标越界无操作;被删除元素后方所有元素下标自动前移一位。 |} == 内置函数 == === 核心通用函数 === {|class="wikitable" ! 函数 !! 说明 |- | <code>num@</code> | 弹出一个值,强制转为数字并返回。 |- | <code>str@</code> | 弹出一个值,强制转为字符串并返回。 [https://github.com/DGCK81LNN/whatlang-interpreter/commit/e05c5d79abbbf59b6da719a8ca65daade085c7df v0.2.0] 旧版本行为:字符串带引号转义;全单编码单元字符串数组直接拼接,空数组返回空串。 |- | <code>repr@</code> | 弹出值,返回可复现该值的WhatLang代码字符串。 |- | <code>arr@</code> | 弹出值:数组返回浅拷贝;字符串拆分为字符数组;其余类型报错。 |- | <code>pow@</code> | 弹出a、b转为数字,返回a的b次幂。 |- | <code>band@</code> <code>bor@</code> <code>bxor@</code> | 弹出两值转为有符号32位整数,依次执行按位与、按位或、按位异或并返回结果。 |- | <code>bnot@</code> | 弹出值转为有符号32位整数,返回按位取反结果。 |- | <code>rand@</code> | 返回0~1之间随机浮点数。 |- | <code>randint@</code> | 弹出两个数字,返回区间内随机整数(向下取整)。 |- | <code>flr@</code> | 弹出数字,向下取整返回整数。 |- | <code>range@</code> | 弹出n转为数字,n必须小于4294967296;返回 [0, n) 整数数组,小数部分直接截断。n为负则报错。 |- | <code>len@</code> | 返回栈顶数组/字符串长度;字符串统计**编码单元**数量。 [https://github.com/DGCK81LNN/whatlang-interpreter/commit/e05c5d79abbbf59b6da719a8ca65daade085c7df v0.2.0] 旧版本统计字符数。 |- | <code>split@</code> | 弹出字符串、分隔符;按分隔符分割字符串为字符串数组;分隔符为空则按编码单元拆分。 自 [https://github.com/DGCK81LNN/whatlang-interpreter/commit/cae889d00a70db3c532c2fefce2add7ad689bc53 v0.2.1]:分隔符为数组时视作正则表达式,匹配分组全部存入结果数组。 |- | <code>join@</code> | 弹出分隔符字符串;将栈顶数组/字符串全部转为字符串,以分隔符拼接为单一字符串;栈顶非数组/字符串报错。 |- | <code>reverse@</code> | 将栈顶数组/字符串转为数组并反转元素顺序,返回浅拷贝。 |- | <code>in@</code> | 弹出目标值;查找栈顶数组/字符串中首个匹配项下标,无匹配返回-1;栈顶非法类型报错。 |- | <code>filter@</code> | 弹出函数字符串;遍历栈顶数组/字符串,执行函数筛选真值项,返回筛选后的新数组;栈顶非法类型报错。 |- | <code>chr@</code> | 弹出数字/数字数组(Unicode码点),拼接为对应字符串;数值为负或超过1114111时报错。 |- | <code>ord@</code> | 弹出字符串,将每个字符/未配对代理对转为码点数字,返回数字数组。 |- | <code>and@</code> | 弹出a、b;a为空串/0/未定义则返回a,否则返回b。 |- | <code>or@</code> | 弹出a、b;a为空串/0/未定义则返回b,否则返回a。 |- | <code>nan@</code> | 返回NaN。 |- | <code>undef@</code> | 返回未定义。 |- | <code>inf@</code> | 返回正无穷。 |- | <code>ninf@</code> | 返回负无穷。 |- | <code>eq@</code> | 弹出两值,严格相等(等价JS `===`)返回1,否则0。 |- | <code>stak@</code> | 将当前主栈转为数组返回;会造成数组自包含。 名称含义:stack@ 去掉c(copy,不拷贝)。 |- | <code>stack@</code> | 返回主栈的浅拷贝数组。 |- | <code>try@</code> | 逻辑同@调用;运行时报错则返回 [错误名, 错误信息];无错误返回 [未定义, 未定义]。 |- | <code>throw@</code> | 弹出字符串作为错误信息,抛出名为Error的运行时异常。 |- | <code>match@</code> | 弹出待匹配字符串、正则表达式;执行JS正则匹配,返回匹配结果字符串数组,无匹配返回空数组。 待匹配值强制转字符串;表达式为数组时对应RegExp构造参数 [正则, 修饰符];普通字符串直接作为正则模板;正则非法则报错。带g修饰符返回全部完整匹配;无g修饰符返回完整匹配+各分组捕获内容。 |- | <code>repl@</code> | 弹出目标字符串、匹配模板、替换文本;全局替换所有匹配项并返回新字符串。匹配模板可为字面字符串或正则数组(同match@规则);替换文本内美元符号为分组引用,如需输出$需写两个$$。 |- | <code>time@</code> | 返回当前系统时间戳(毫秒级纪元时间)。 |- | <code>type@</code> | 弹出值,返回类型字符串:<code>"String"</code> / <code>"Number"</code> / <code>"Array"</code> / <code>"Undefined"</code>。 |- | <code>b64@</code> | 弹出字节数字数组,返回Base64编码字符串。 [https://github.com/DGCK81LNN/whatlang-interpreter/commit/4a23a8a2cec1577c7ff6110c80c65a3d59430933 v0.3.3] 新增。 |- | <code>nb64@</code> | 弹出Base64字符串,解码为字节数字数组返回。 [https://github.com/DGCK81LNN/whatlang-interpreter/commit/4a23a8a2cec1577c7ff6110c80c65a3d59430933 v0.3.3] 新增。解码前自动过滤非法Base64字符,末尾补等号至长度为4的倍数。 |- | <code>utf8@</code> | 弹出字符串,转为UTF-8字节数字数组返回。 [https://github.com/DGCK81LNN/whatlang-interpreter/commit/4a23a8a2cec1577c7ff6110c80c65a3d59430933 v0.3.3] 新增。 |- | <code>nutf8@</code> | 弹出UTF-8字节数字数组,解码为字符串返回。 [https://github.com/DGCK81LNN/whatlang-interpreter/commit/4a23a8a2cec1577c7ff6110c80c65a3d59430933 v0.3.3] 新增。 |} === 通用扩展函数 === 该组函数最初为Koishi运行时专属,现已在多数环境提供。 {|class="wikitable" ! 函数 !! 说明 |- | <code>you@</code> | 返回运行环境标识字符串。小石心格式:<code>"WhatLang/2024 Environment/messaging Framework/koishi Platform/平台标识 Id/机器人平台ID"</code>。 可在插件配置「Framework」与「Platform」之间自定义品牌字段,规范格式为 <code>Brand/机器人名称</code>。 2025年6月22日并入小石心插件:[https://github.com/DGCK81LNN/yufang-koishi-plugins/commit/279e74d166c8673a984ffd7ce0b64ac6c597f9bb] |- | <code>pr@</code> | Koishi运行时:等待当前频道内同一用户下一条消息,超时返回未定义;用于交互式读取用户输入。 |- | <code>cat@</code> | 弹出URL字符串,发起HTTP GET请求,返回响应文本;状态码异常/网络错误直接抛出异常。 命名来源LNNBot内置cat命令:传入URL则拉取网页,不传则读取下一条用户消息(逻辑近似pr@)。 |- | <code>ca@</code> | 逻辑同cat@,返回原始字节数字数组而非文本。 2025-05-14 在WhatServer以catb@上线,05-29更名ca@,含义:cat去掉text的t;2025-06-22接入Koishi运行时:[https://github.com/DGCK81LNN/yufang-koishi-plugins/commit/b63aebce036ad8339aad7d453593697a18d27ce0] |- | <code>fetch@</code> | 依次弹出请求方法、URL、请求头、请求体,发起HTTP请求;返回数组 [状态码数字, 状态描述字符串, 二维数组请求头, 响应文本字符串]。 2025年6月3日新增。 方法、URL必须为字符串;请求头为二维字符串数组;请求体为字节数字数组或字符串;GET/HEAD请求体必须为未定义。 |- | <code>fech@</code> | 逻辑同fetch@,响应体返回原始字节数组而非文本;名称含义fetch去掉t(text)。2025-06-03新增。 |- | <code>reesc@</code> | 弹出字符串,转义所有JS正则元字符后返回。 |- | <code>sleep@</code> | 弹出数字n,阻塞n秒;取值范围0 ≤ n ≤ 2147483.647。 |- | <code>nout@</code> | 弹出并丢弃输出栈最后存入(栈顶)的一条内容。 |- | <code>nouts@</code> | 弹出整数n,删除输出栈顶部n条内容;n≤0时保留底部|n|条,其余全部清空;无穷值视为0。 |- | <code>send@</code> | 弹出输出栈栈顶内容并立即发送;小石心返回发送消息的平台ID字符串数组。用于单条输出刷新。 |- | <code>sends@</code> | 弹出整数n,取出输出栈顶部n条内容批量发送;小石心返回消息ID数组。n≤0保留底部|n|条;无穷视为0。用于批量刷新输出栈。 |- | <code>ou@</code> | 弹出字节数字数组,直接打印原始二进制字节;小石心无此函数。2025-05-14 WhatServer以outb@上线,05-29更名ou@;命名类比ca/fech,out去掉t代表输出字节流。 |} === Koishi运行时专属函数 === 部分函数与机器人接收消息绑定;消息内容使用Koishi标准XML字符串格式。 {|class="wikitable" ! 函数 !! 说明 |- | <code>help@</code> | 帮助文档函数。弹出参数字符串,返回对应帮助主题文本;空串/未定义返回语言简介与help@使用教程。 |- | <code>helpall@</code> | 生成图片,打印几乎全部内置函数名称列表。 |- | <code>propt@</code> | 弹出用户ID;等待当前频道指定用户的下一条消息并返回内容;参数为假值则接收全体用户消息,支持传入单个/多用户平台ID。超时返回未定义。 |- | <code>prompt@</code> | 弹出频道ID、回调函数;监听目标频道消息,每条消息传入详情数组执行回调;回调返回真值时停止监听并返回消息详情,超时返回未定义。 |- | <code>me@</code> | 返回触发解释器的消息详情数组,字段定义: * 下标0:消息XML文本字符串 * 下标1:消息平台ID字符串 * 下标2:发送者用户名 * 下标3:发送者平台用户ID * 下标4:Koishi数据库用户ID(数字) * 下标5:当前频道平台ID * 下标6:被回复/引用消息ID,无则未定义 该函数在WhatServer可用,但字段语义变更(尽量保持接口兼容): * 下标0:请求方法+URL,例 <code>GET /whatfoo/bar</code>;URL编码字符自动解码 * 下标1:随机字符串 * 下标2、3:客户端IP地址 * 下标4:携带X-Lnnbot-Whatserver-Login-Token请求头时为数据库用户ID数字,否则未定义 * 下标5:固定字符串 <code>"__WHATSERVER__"</code> * 下标6:未定义 |- | <code>outimg@</code> <code>outaudio@</code> <code>outvideo@</code> <code>outfile@</code> | 弹出资源URL字符串,向输出栈写入对应类型附件。 |- | <code>outquote@</code> | 弹出消息ID字符串,输出对应消息的回复引用卡片。 |- | <code>outat@</code> | 弹出用户平台ID,输出@提及该用户。 |- | <code>outimag@</code> | 弹出文本字符串,使用等宽字体渲染为图片存入输出栈。 |- | <code>outksq@</code> | 弹出文本字符串,使用Kreative Square字体渲染图片输出;字体地址:[https://www.kreativekorp.com/software/fonts/ksquare/] |- | <code>outsvg@</code> | 弹出SVG描述数组,渲染矢量图存入输出栈;暂不支持动画。 数组规则:前两项为svg宽、高;后续每项为元素数组:首项元素类型字符串,第二项style样式,剩余参数随类型变化。 * <code>path</code> / <code>p</code>:路径标签,第三项为d路径数据; * <code>text</code> / <code>t</code>:文字标签,第三项x、第四项y、第五项文本内容; * <code>img</code> / <code>i</code>:图片标签,依次为x、y、宽、高、资源href地址。 |- | <code>outhtml@</code> | 弹出HTML文本,渲染网页截图存入输出栈。 2025年10月3日新增:[https://github.com/DGCK81LNN/yufang-koishi-plugins/commit/6c98e706c38ca9c2adbc7645bd3ebcb04b7ca524] 当前不支持class=wikitable表格快捷语法,因渲染环境禁用JS;开发组正在修复该问题。 |- | <code>nsend@</code> | 弹出消息ID,撤回当前频道对应消息。 |- | <code>sendsto@</code> | 依次弹出目标频道ID、整数n;逻辑同sends@,批量发送至指定频道,返回发送消息ID数组。 |- | <code>findmsg@</code> | 弹出回调函数;遍历当前频道历史消息,每条传入详情数组执行回调;回调返回真值时停止遍历并返回该消息详情;遍历至消息上限无匹配则返回未定义。 |- | <code>getmsg@</code> | 弹出消息ID,返回对应消息详情数组(同me@结构)。 |- | <code>guildmem@</code> | 弹出群组ID,返回群成员二维数组,每项格式 [用户名, 平台用户ID];机器人接收过该用户消息才会出现在列表中。 |} ==== WhatNoter 笔记存储模块 ==== 基于Koishi数据库用户ID的简易持久化存储;每个用户ID独立拥有公开笔记、保护笔记、私有笔记。 无需用户真实存在即可读取对应ID的公开笔记;任意一条笔记创建后,同ID其余两类笔记自动初始化为空串;从未写入的ID读取笔记返回未定义。 {|class="wikitable" ! 函数 !! 说明 |- | <code>notewc@</code> | 弹出数字用户ID、字符串文本,写入该用户公开笔记。 |- | <code>notewd@</code> | 弹出字符串文本,写入调用者的保护笔记。 |- | <code>notewe@</code> | 弹出字符串文本,写入调用者的私有笔记。 |- | <code>noterc@</code> | 弹出数字用户ID,读取其公开笔记内容。 |- | <code>noterd@</code> | 弹出数字用户ID,读取其保护笔记内容。 |- | <code>notere@</code> | 读取调用者私有笔记内容并返回。 |} ==== WhatCommands 自定义命令模块 ==== 允许使用WhatLang编写自定义命令;每条命令包含名称、执行代码、简短描述、详细帮助文档。 三种调用方式:发送 <code>¿¿命令名 参数</code>、调用机器人命令 <code>whatcmd</code>、WhatLang内置 <code>cmd@</code> 函数。 命令接收单个字符串输入,存放于栈顶。 示例:命令greet代码 <code>`Hello, `.`!`</code> 发送 <code>¿¿greet my friends</code>、执行机器人命令 <code>whatcmd greet my friends</code>、运行代码 <code>"my friends" greet cmd@</code> 均输出 <code>Hello, my friends!</code> 使用 <code>cmd@</code> 调用命令会返回执行结果,可作为退出状态码;¿¿前缀调用无法获取返回值。 {|class="wikitable" ! 函数 !! 说明 |- | <code>cmdset@</code> | 依次弹出代码字符串、命令名称,绑定命令执行代码。 |- | <code>cmdall@</code> | 返回全部已定义命令名称数组。 |- | <code>cmdsethelp@</code> | 依次弹出帮助文本、命令名,设置命令详细手册。 |- | <code>cmdseth@</code> | 依次弹出描述文本、命令名,设置命令简短介绍。 |- | <code>cmddel@</code> | 弹出命令名称,删除该自定义命令。 |- | <code>cmdget@</code> | 弹出命令名称,返回命令代码,无该命令返回未定义。 |- | <code>cmdgethelp@</code> | 弹出命令名称,返回命令详细手册文本,无则未定义。 |- | <code>cmdgeth@</code> | 弹出命令名称,返回命令简短描述,无则未定义。 |- | <code>cmd@</code> | 依次弹出输入参数字符串、命令名称,运行对应命令代码并返回执行结果。 旧版本无命令时无返回值;新版本直接抛出异常。 |} === WhatServer 网页服务端专属函数 === {|class="wikitable" ! 函数 !! 说明 |- | <code>hset@</code> | 依次弹出响应头键、值字符串,设置HTTP响应头。 |} 除内置函数外,WhatServer预定义三个全局变量: <code>reqh</code>:请求头二维字符串数组; <code>reqm</code>:请求方法字符串; <code>reqb</code>:请求体,依请求方式与Content-Type分为字符串、字节数组、未定义三种类型。 == 惯用写法与标准范式 == * 字面量赋值变量:<code>值 变量名 =_</code> ** 末尾 <code>_</code> 丢弃赋值后栈中残留的变量名,一般无保留必要。 ** 自定义函数写法:用括号包裹代码作为字符串存入变量;函数可从栈顶读取参数、返回任意数量结果;调用格式 <code>函数名@</code> * 获取负一/任意负整数:<code>01-</code> * 超大浮点数(例3×10¹⁰⁰):<code>(3e100)num@</code> ** 用字符串承载数字字面量,再通过num@转为数值。 * If条件块:<code>条件 { 执行语句 !}</code> ** 利用单次循环+末尾跳出实现分支。 * If-Else分支方案1(借助临时变量):<code>条件 c={ 真分支 !} c^~{ 假分支 !}</code> * If-Else方案2(无变量):<code>1{ 条件 { 真分支 !!} 假分支 !}</code> * If-Else方案3(数组映射):<code>条件 ~[(真分支)(假分支)] \,_@</code> * 两值比较(返回真值代表条件成立) ** 宽松相等(a?b==0):<code>?~</code> ** a大于b(a?b==1):<code>?1?~</code> ** a小于b:<code>?(-1)?~</code> 或 <code>\?1?~</code> ** 小于等于:<code>?1\?1?~</code> ** 大于等于:<code>\?1\?1?~</code> ** 删除末尾 <code>~</code> 可对结果取反。 ** 通用比较模板:<code>?[相等结果 大于结果 小于结果] \,_</code>,填入0/1自定义每种情况返回值;两值不可比较时视为相等。 *** 处理不可比较场景扩展模板:<code>?2+[不可比较返回 小于返回 相等返回 大于返回] \,_</code> * 向数组尾部追加元素(栈顶为数组):<code>len@ 数值 ;</code> 或 <code>nan@ 数值 ;</code> * 代码注释写法:<code>0{ 注释文本 }</code> 或 <code>(注释文本)_</code> == 外部资源 == * [https://github.com/DGCK81LNN/whatlang-interpreter whatlang-interpreter]:DGCK81LNN维护的解释器核心分支,附带简易命令行运行时 ** 同时发布至npm:[https://www.npmjs.com/package/whatlang-interpreter] * [https://github.com/YufangProbably/koishi-plugins/tree/main/plugins/whatlang/src/ 原始解释器源码](核心库+Koishi运行时) * [https://github.com/DGCK81LNN/yufang-koishi-plugins/tree/main/plugins/whatlang DGCK81LNN 维护的Koishi运行时分支] * [https://dgck81lnn.github.io/whatlang/ DGCK81LNN 网页版在线解释器] ** 旧版Babel转译网页端(已过时):[http://哼.site/whatlang/],兼容IE11、Safari5 * [https://yufangprobably.github.io/whatlang/ 余方网页版解释器](内置语法高亮编辑器,存在部分bug) * [https://gitee.com/DGCK81LNN/lnnbot-miniplugs/blob/master/plugins/common/-lnnbot-whatapi.js WhatServer 完整源码] * [https://dgck81lnn.github.io/blog/pages/whatapi#1-whatserver WhatServer 中文文档]
此页面嵌入的页面:
模板:LNNBot指令链接
(
查看源代码
)
返回
用户:DGCK81LNN/WhatLang
。
查看“︁用户:DGCK81LNN/WhatLang”︁的源代码
来自 LNN的:not(博客)?