Skip to content

表达式不能填表达式,或者运算符优先级错误,附带一些语法优化和语法严谨性建议 #10

@4everDimensions

Description

@4everDimensions
`
{%
$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前将使用文档阅读完成。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions