从eval/apply想到的一些东西

SICP 这本书里面有一章专门讨论如何编写解释器,最终将解释器本质归纳成为两个函数:eval/apply.

其中eval是evaluate的缩写,结合环境来计算表达式的值,而apply则是实际参数应用于过程,过程里面则存在新的环境和表达式。两个函数相互依赖,相互调用:只有表达式,则没有办法构造复杂程序;只有过程,则没有办法进行任何运算。下图展示了两个函数之间的关系,像极了中国的太极图。

sicp-eval-apply.png

某天晚上我睡不着觉,在考虑个人发展的事情,觉得这个事情和eval/apply有很强烈的类比。个人不断地提升自己的能力,输入通常就是来自于从这会上接触到的各种各样的信息,比如教科书,网站,同事之间的交流等等。但是仅仅有输入是不行的,还需要自己去消化这些输入,这就是 "eval" . 在不断消化的这个过程中,个人的认知得到提升,但是认知并不等同于能力。光自己知道是不行的,还需要实践,或者是需要将自己知道的东西输出,这是 "apply". apply这个过程,在真实世界中是存在副作用的,会影响到其他人,为这个世界创造财富,同时会让自己有更多的输入。

再进一步发散,我觉得eval/apply还可以类比到计算机里面的计算和存储。eval类似计算,apply则类似存储,而边界处则是网络通信。为了确保eval/apply这个过程通畅,我们必须确保网络通信不成为瓶颈。如何类比到C的函数调用的话,对于大的结构体参数,我们可以选择拷贝整个结构体到callee的堆栈上,也可以选择将结构体的指针拷贝到callee的堆栈上,但是显然后者的效率更高。

要提高个人能力,就要优化eval/apply两个过程以及eval/apply的交互。从eval上看,管理好个人的作息时间,掌握高效的学习方法,充分利用先进的工具等等。从apply上看,多将自己的知识进行输出,多参与同行之间的交流和讨论,参与到更加有影响力的项目当中去。而eval/apply的交互,则是书写表达以及沟通能力,是否可以准确地传递出信息,是否能够有效地和他人沟通和写作,这些都是存在一定技巧的。