IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

标签:SICP

共 1 篇相关文章

IT 累计浏览 3,161

编程珠玑番外篇 -J. 高级语言是怎么来的-6

这篇讲的是Scheme语言如何从LISP中诞生,并成为现代函数式编程重要里程碑。文章从“函数作为一级对象”这个概念切入,说明在LISP中函数可以像整数一样被传递和返回,这引出了高阶函数如apply、map和reduce的基础。 然而,当函数携带“自由变量”(即非参数也非内部变量)被传来传去时,问题就来了。作者用一个具体例子演示:在早期LISP中,定义一个返回“加n”函数的addn,当测试add1时,本应得到5却得到了8。这是因为解析器采用了动态作用域,在自由变量s被使用时才去当前栈中查找其值,导致变量绑定错误。 这个问题的根源在于函数丢失了其定义时的环境信息。文章追溯到LISP实现者Steve Russell的解决方案:他引入了FUNCTION修饰符,让lambda表达式在解析时就静态绑定到当时的环境——这就是“闭包”的雏形。这种静态作用域(文法作用域)确保了自由变量不会在函数传递过程中“幽灵般”乱跑,也解决了著名的FUNARG问题。 文章最后指出,Scheme正是基于这些对作用域和闭包的规范化,才为LISP家族注入了新的活力,影响了后续包括Common LISP在内的语言发展,甚至间接成就了Paul Graham等人的商业传奇。