level 9
1936年,阿隆佐·邱奇提出 λ 演算,以函数为参数和返回值的函数,定义虚拟的机器编程系统。函数用希腊字母 λ 标识,这个形式系统因此得名。
1958年,MIT 的教授 John McCarthy 公开了表处理语言 Lisp。Lisp 是对阿隆佐·丘奇的 λ 演算系统的实现,同时工作在冯·诺依曼计算机上。
1973 年,MIT 人工智能实验室的一组程序员开发了被称为 Lisp 机器的硬件-阿隆佐 λ 演算的硬件实现!
JavaScript 对树的表示和计算,已经展现了其纯正的 Lisp 血统,也许不是那么直接。在这篇文字里,我想深度解释一下,“树”和“树”计算的思想是如何一层层的形成的。
2016年01月18日 03点01分
1
level 9
“树”的表示法则如果你看过JavaScript与Lisp,通向编程圣殿[1]: "树"的基础计算,应该明白 JavaScript 如何像 Lisp 一样来表示一棵树和计算树。
让我们重新简单清晰的分析一遍。
A / \ B C这是简单到不能再简单的树了,在JavaScript中你可以这样表示这棵树
['A', 'B', 'C']在 Lisp 中,这样表示这棵树
2016年01月18日 03点01分
2
level 9
(A B C)规则非常简单:
树由节点组成,A B C 三者都是节点。树本身就是一个最大的节点,一个大的节点内嵌了 A B C这些更小的节点。这就是树的根本规律,通过这个规律你可以层层嵌套,从而形成递归。
使用数组表示一棵树的节点,并且层层嵌套这些数组,你就能轻而易举的像 Lisp 一样表示一棵树
嵌套
既然节点是嵌套的,那么规律是非常简单的,我们很容易可以写出下面的树:
在上面的树,我们可以随意的拿出其中的一个节点['F', 'G'],他是其中的一项字节点,也是一棵树。前面我们说过,树本身就是节点,所以,节点也是树是成立的:
F / G用通俗的语言,我们可以这样认为,树是这样的结构:
[节点, 节点, 节点, ...]而其中任何一个节点都可以是:
[节点, 节点, ...]用图形表示一下,就是这样的:
[节点, 节点, 节点, ...] | \ \ | \ \ v \ \[节点, 节点, ...] \ \ v \ [节点, 节点, ...] \ v ...
['A'] 这段数组表示什么样的树?
A
['A', 'B'] 这段数组表示什么样的树?
A / B
['A', 'B', ['C', 'D']] 这段数组表示什么样的树?
A / \ B C / D
['A', ['B', 'E', ['F', 'G']], ['C', 'D']] 这段数组表示什么样的树?
A / \ B C / \ / E F D / G
2016年01月18日 03点01分
3
level 9
最后,再来聊聊 Lisp[1, [6, [6, 9], [3, [2, [7, 6]]]], 3]表示了一棵深度颇高的树,用在 Lisp 会这么表示:
(1 (6 (6 9) (3 (2 (7 6)))) 3)足够说明 JavaScript 具有非常纯正的 Lisp 血统。
最后,放上我们的 Lisp mmap:
(define mmap (lambda (lst f) (cond ((null? lst) '()) ((list? lst) (cons (mmap (car lst) f) (mmap (cdr lst) f))) (else (f lst)))))(display (mmap '(1 (6 (6 9) (3 (2 (7 6)))) 3) (lambda (x) (* x x))))// => (1 (36 (36 81) (9 (4 (49 36)))) 9)
友情提示:为了展示方便直观,本文中的数组操作使用了shift(),这会造成外部数组的破坏。实际使用时可以灵活采取splice(),,concat(),shift(),pop()不必拘泥于形式。
来源:(kj021320)
2016年01月18日 03点01分
6