比对象更抽象的是函数 比函数更抽象的是list
在数据结构课程中我们学习了 list等价于树 或者 广义表 而图可以转化为树处理 所以list可以表示任何数据机构 简单的说就是一切皆为list
因此有一门语言叫Lisp, clojure是其在jvm上的方言版本.
我们无法把clojure简单归为面向对象或函数式语言.在clojure中,
map是匿名对象 lambda是匿名函数
而我们在面向对象编程中所说的类其实是函数, 如果看javascript 这一点很明显, es6增加了class, 但仍然只是函数的语法糖. 而对象是有名称的map
鉴于传统面向对象模式导致的过度复杂性 现代语言都在反思简化这一设计 如go就是使用了改良的struct 避免了复杂的类层级系统
用lisp的写法
(类名/函数名 域/局部变量)
对象最好只包含值 方法都在接口中 js是在原型中
而数据总可以表示为递归的list
(head tail)
从计算机的基础结构来看,任何计算都可以表示为list
(cpu memory)
汇编(机器)语言版本是
(指令 操作数)
(地址 值)
(根节点 子节点/森林)
(monad 函数list)
(进程 内存地址空间)
(硬件 软件)
(函数 数据)
而这背后的思想可以追溯到历史更为久远的lambda演算
(lambda 参数)
也可以叫做调用 或 规约
每个list都是lambda 可以规约到最简形式
规约 调用 之后 产生新的list
就像一个小计算机
数据放入内存 cpu处理后产生新的计算机
尽管从技术实现的角度看 很多操作是在原地更新 但是时间改变了 旧的状态成为了回不去的历史 实际是产生了新的状态
所谓大道至简 世界的本质就是 同一 与 和谐