非 lambda

简介

Unlambda 是一个无变量、基于组合子逻辑、图灵完备的编程语言。

Hello world

Unlambda 的 Hello world 是这样的

1
`r```````````.H.e.l.l.o. .w.o.r.l.di

解析

这个 Hello world 还是比较简单的。只涉及到 r.i 三种元素。

“`” 是函数调用操作符。

相当于 C 语言函数后面的 ()

.x 是一系列的函数,如 .a.b , .c 等。

这一系列的函数都是接收一个参数,打印对应的 “x”,如 “a”,”b”,”c” 等, 并返回这个参数。

1
`.H

这样调用时错误的。因为 .x 系列的函数需要接收一个参数。

这样调用相当于 C 语言

1
H() // 错误 H 函数需要接收一个函数。

r 函数是 .x 函数中,x 为换行符的函数的语法糖。作用就是输出换行,返回接收的参数。

i 函数就是 $identity$ 函数,原封不动的返回接收到的函数。用 JavaScript 表示就是

1
2
3
function i(x){
return x
}

假设需要输出字符 “H” ,要怎么写呢。

首先需要 .H 函数。然后使用 “`” 操作符应用函数。

函数要求有一个参数,这个参数如果没有用到那么可以随便传。

所以答案出炉了

1
2
3
4
5
`.H.i
`.H.a
`.H.b
`.H.c
...

以上的任意一种都可以。

为什么 “`.H.a” 没有打印出 “Ha” 呢?

因为只使用了一个 “`” 函数调用操作符。

相当于

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
function i(x){
return x
}
function H(x){
console.log("H")
return x
}

function a(x){
console.log("a")
return x
}

// "`.H.a" 相当于
H(a)
// 如梭想要打印出 "Ha",要这样
// "``.H.a.a" 或者 "``.H.a.H" 或者 "``.H.a.i" 反正返回值不使用
// 相当于
H(a)(i)

回到 Hello world

1
`r```````````.H.e.l.l.o. .w.o.r.l.di

翻译成 JavaScript 就是

1
r(H(e)(l)(l)(o)( )(w)(o)(r)(l)(d)(i))

FAQ

Unlambda 中只有函数,没有类似循环的结构,那么怎么循环呢?

如果对 lambda 比较熟悉就会清楚应该使用递归。

Unlambda 中没有数字,要怎么表达数字呢?

类似地,使用丘奇数。

Unlambda 中没有列表等数据结构。

参考 Lisp,先构建 conscarcdr 剩下的就是想象力的问题了。

详情参考 Unlambda 官方入门教程