Skip to content

Blocks As Pipeline Body

Neuron Teckid edited this page Dec 29, 2015 · 2 revisions

将语句块作为管道体

如果一个管道表达式的管道分隔符为 |: 且于该分隔符之后直接换行, 那么此后的若干缩进相同且缩进多于该表达式所属的行 (详情参见下面语句缩进规则) 的连续多行均视作该管道的 末节. 并且, 在这些语句块中出现的函数返回语句将被视作向结果列表中添加元素并进入下一次循环. 如

[2, 3, 5, 7, 11, 13] |:
    sqr: $ * $
    if sqr % 4 = 3
        $result.push(sqr)

这将被转换成与下面 Javascript 表达式对应等价的表达式

(function(list) {
    var key, index = 0, result = [];
    for (key in list) {
        (function(index, element, key) {
            var sqr = element * element;
            if (sqr % 4 === 3) {
                result.push(sqr);
            }
        })(index, list[index], key);
    }
    return result;
})([2, 3, 5, 7, 11, 13])

而相应地, 行间管道的两种形式如

list: [2, 3, 5, 7]
list |: $ * $
list |? $ % 3 != 0

等价于下面的代码

list: [2, 3, 5, 7]
list |:
    $result.push($ * $)
list |:
    if $ % 3 != 0
        $result.push($)

管道语句与管道中断

当一个管道表达式直接作为一个语句时, 如以下例子中的后者

# this pipeline to `someList` is an pipeline expression right value
x: someList |:
    console.log($ * 2)
    $result.push($ * 2)

# this pipeline is a statement
someList |:
    console.log($ * 2)

该管道表达式会被以语句的方式编译. 区别是, 管道语句中允许使用 return 语句, 而管道表达式中不可.

使用 return 语句后, 管道所在的函数会立即返回, 返回值是 return 之后的表达式.

Clone this wiki locally