然后是工程上的问题。前缀表达式的实现需要维护一个列表 “树”——每个函数都可以看成是一个列表的开头,而函数的每个参数组成列表的每个空位,它们可由值,也可由其他函数 “列表” 填上(待会儿再求值)。这组成了一个很吃内存的树形结构,并且仰赖复杂的解释器进行优化、化简和求值。这也是最早的函数式语言 Lisp 名字的来历:LISP = LISt Process 表处理语言。
进一步地,看着这个 ((+ 1) 1),我们可以认为加号本身并不是一个返回两参数和的二元函数,而是个返回一个函数的一元函数。其返回的又是一个一元函数,然后返回的是一个值,即和。如果继续推广下去,我们可以发现,任何一个函数,都可以看成是返回一个值的一元函数,或者返回一元函数的一元函数。这种嵌套返回叠加 n 次,就模仿出了一个 n 元函数。
返回函数的函数,我们称为高阶函数。将 n 元函数转换成一连串一元高阶函数的过程,我们称之为柯里化。当然这是非形式的定义——这只是一个漫谈级别的科普文章,笔者也恳请大家不要奢求这里作出形式化的定义。有兴趣的话,可以去查阅维基百科:柯里化。在百科中,大家也能看到高阶函数和柯里化的种种效果和应用。