【问题标题】:Why does Smalltalk support first class functions, but not other functional features?为什么 Smalltalk 支持一流的功能,而不支持其他功能特性?
【发布时间】:2017-08-26 17:31:23
【问题描述】:

一个answerIs Javascript a Functional Programming Language?说:

函数式编程意味着程序被概念化为对函数的评估,而不是控制流。代码是对函数的描述,没有固有的控制流概念。

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

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

【问题讨论】:

  • 我认为您的问题存在问题。据我所知,Smalltalk 从来都不是函数式语言。 Smalltalk 是面向对象的,实际上是第一个面向对象的语言。现在,Smalltalk 的设计者决定使用词法闭包。

标签: oop functional-programming programming-languages smalltalk language-design


【解决方案1】:

Smalltalk 的设计基于虚拟机提供的以下功能

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

添加了现代实现

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

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

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

设计者考虑的不是函数式编程。相反,他们认为每件事都是一个对象,每个计算都是一个消息发送统一的隐喻。为此,块和非本地返回也起到了将“函数”建模为对象的作用,以确保每个已知概念都包含在 OO 范式中。这并不意味着他们将函数式编程作为目标。它们没有包含其他特性(功能性或非功能性),因为它们试图识别一组最小的原始元素,以支持无障碍的通用系统。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-12
    • 2011-02-20
    • 2015-01-22
    • 2012-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多