On this page:
2.4.1 匿名函数与it
2.4.2 管道语法
->>
2.4.3 组合函数
>->
<-<
8.3

2.4 管道与匿名函数

2.4.1 匿名函数与it

在一些小众语言中可能会见过it关键字,它指代该条语句为匿名函数:

(+ 1 it)
(lambda (it) (+ 1 it))

以上两条代码可视为等价,换言之,第一条可展开为第二条语句。需要注意的是,it仅能用在特定的语法中,不能随处使用。

Example:
> (+ 1 it)

it: 指代不明,请在特定语法中使用!

2.4.2 管道语法

syntax

(->>  管道 ...)

 
 = 任何表达式
     
管道 = it表达式
  | 副作用表达式
  | 中断表达式
     
it表过式 = 普通表达式
  | 带有it关键词表达式
     
副作用表达式 = (! 表达式)
     
中断表达式 = (break 任何值)
创建一个管道,依次流经每个管道

Example:
> (->> 1
       (+ it 1)
       (+ it it))

4

->>还可以接受普通的单参数函数。

Example:
> (->> 1
       add1
       (+ it 10))

12

同时它还能提前中断。

Example:
> (->> 1
           (when (= it 1) (break 20))
           add1)

20

2.4.3 组合函数

syntax

(>-> 管道 ...+)

 
管道 = 普通函数
  | 带有it关键字函数
  | 副作用区块
     
副作用区域 = (! 普通函数或带有it关键字函数)
类似->>,不同在于它只接受函数,并返回一个新的组合函数,相当于compose高级版。

Examples:
> (define f (>-> add1 (+ it it)))
> (f 1)

4

> (f 2)

6

副作用区域可以让你做些小动作,而不改变数值。

Examples:
> (define f
    (>-> add1
     (! (displayln it)
        (+ it 10))
     add1))
> (f 1)

2

3

> (f 2)

3

4

syntax

(<-< 管道 ...+)

>->参数反向版本,使用方式完全一致。