Skip to content

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

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

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions