-
Notifications
You must be signed in to change notification settings - Fork 8
Description
`
{%
$con = 'cn';
$con == 'con' ? 'ok' : $con == 'cn' ;输出1,符合预期
%}
`
`
{%
$con = 'cn';
$con == 'con' ? 'ok' : $con == 'cn' ? 'ok':'no' ;报错,异常
%}
`
`
{%
1 == 'cn' ? 'ok' : 'no' ;输出no,符合预期
%}
`
`
{%
1 == 1 ? 'ok' ;输出ok,符合预期
%}
`
;这个"expr ? expr : expr"本身是不是表达式???
;如果是的话为什么第二个写法报错??
;如果不是的话为什么第三四个可以正常输出?
个人猜测可能导致错误的原因
1、解释器把'ok':'no'的冒号当作$con=='con'的三目运算符部分了(真的会吗?没看过项目代码的tokenizer、AST树处理方法,纯猜测)
这种错误很可能是三目运算符的右结合只做了一半(我确实不懂这个,猜测)
另作建议,
当下花括号文档中说明是语句块,按理来讲官网文档说的最后一个语句不要加分号,那就和rust花括号表达式一样应该泄露出最后一个子表达式的值,但当前什么也不会发生,并且可能会报错。
建议将花括号改为表达式而不是“语句块”。
如此我便可以:
`
{%
$tQQ=='QQ:123'?"主人你好":{d2==1?"我在":"我不在"}
%}
`
或
`
{%
if ($tQQ......){"主人你好"}else{if d2==1{"我在"}else{"我不在"}}
%}
`
两者等价。这意味着if的用法改为if expr1 expr2 else expr3并等价于expr1?expr2:expr3,这样也一定程度上能够保证兼容性。
说到兼容性的保证,这就需要严格区分语句和表达式了,对于语句应当始终返回空,显然当前并不是这样的。
`
{
$t0 = 1;
}
`
预期返回:空
实际返回:1
我记得在雪豹bot框架的文档写了语句块(“{}”)最后一个语句应当不使用分号,这个其实我不太理解,我会按照rust的思想去评估,如果花括号是语句块,那么其中最后一个语句不加分号就应当作为表达式,并成为父级的值,
引用原文:
多个语句可以用 ; 分隔,取分隔后的最后一项的值,为整个表达式的值,例如:
$t0 = 1;2;3
此时 $t0 的值为 3。
注意:分号的使用
不要在最后一条语句的后面再使用分号,会变得不幸。
// 正确写法
if 1 {
$t0 = 1;
$t1 = 2 // [!code highlight]
}
// 错误写法
if 1 {
$t0 = 1;
$t1 = 2; // [!code error]
}
这里很奇怪,我不太能解释我的疑虑在哪里。
嗯我想了一下,我认为更合适的写法与结果为:
$t0 = {1;2;3}
;此时$t0值为3
$t0 = {1;2;3;}
;此时$t0值为null
因为这个脚本语言很奇怪,用花括号语句块给人一种C的感觉,但是$t0 = 1;2;3时$t0=3又给人一种python-like游标卡尺语法。(意思是对换行、空格过度敏感)
分号应当表示语句的结束,所以$t0 = 1;2;3应当被解析为
$t0 = 1; 这是一个语句,赋值$t0为1
2; 这是一个语句,无意义
3 这是一个表达式,值为3
并返回3
而按照原写法,$t1值应当为1。
!!!!!!!
:(edited)我刚刚测试了,引擎和文档写的行为不一致。
$t0 = 1;2;3
$t0
输出为1而不是3
是不是旧版遗留的问题,,?这么看来这个应该问题不大,但是文档问题很大(
受限于我的文化水平和信息技术能力,我只能提供这么多反馈与建议,很感谢官方的辛劳付出。
我已确定在提交issue前将使用文档阅读完成。