为什么 Smalltalk 支持 first class 函数,而不支持其他函数特性?

Why does Smalltalk support first class functions, but not other functional features?

一个answer to Is Javascript a Functional Programming Language?说:

Functional programming means that the program is conceptualized as a evaluation of a function, rather than a control flow. The code is a description of functions, and has no inherent concept of a control flow.

我了解到,当一种语言支持第一个 class 函数并且没有控制流时,从它的设计 objective 来看,它必须被定义为函数式语言。

那么为什么函数式语言 Smalltalk 不支持其他函数式特性,例如不变性、代数数据类型、模式匹配、部分应用?

Smalltalk 是在虚拟机提供的以下功能之上设计的

  1. 对象分配: #basicNew#basicNew: 原语
  2. 自动释放: GC
  3. 消息发送: send 字节码家族
  4. 块: [:arg | ...] 语法(见下文)
  5. 非本地 returns: [:arg | ... ^result] 语法
  6. 后期绑定:方法查找机制
  7. 本机代码编译:解释器(见下文)

添加了现代实现

  1. 块闭包:替换了块
  2. 快速编译: JIT 编译器,它取代了解释器
  3. 堆栈展开: #ensure: 消息

请注意,其他 "features" 如 Smalltalk 编译器、调试器或异常机制不在列表中,因为它们可以从其他派生(即,它们在用户代码中实现)。

这些功能被确定为通用面向对象环境的基本构建块,意味着 运行 在裸机上(即没有操作系统支持。)

设计者的想法不是函数式编程。相反,他们想到了 一切都是对象,每个计算都是一个消息发送 统一的隐喻。为此,块和非本地 returns 也扮演了将 "functions" 建模为对象的角色,以确保每个已知概念都包含在 OO 范例中。这并不意味着他们将函数式编程作为目标。他们没有包括其他 功能 (功能性或非功能性),因为他们试图确定一组最小的原始元素,这些元素将无障碍地支持通用系统。