Unlambda
Aug 6, 2017
非 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 | function i(x){ |
假设需要输出字符 “H” ,要怎么写呢。
首先需要 .H
函数。然后使用 “`” 操作符应用函数。
函数要求有一个参数,这个参数如果没有用到那么可以随便传。
所以答案出炉了
1 | `.H.i |
以上的任意一种都可以。
为什么 “`.H.a” 没有打印出 “Ha” 呢?
因为只使用了一个 “`” 函数调用操作符。
相当于
1 | function i(x){ |
回到 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,先构建 cons
、car
和 cdr
剩下的就是想象力的问题了。
详情参考 Unlambda 官方入门教程