Language agnostic 为什么要区分返回值的方法和不返回值的方法;T
为什么有些语言区分返回值的方法和不返回值的方法 i、 在Oracle的PL/SQL中,函数和过程之间的主要区别在于函数必须返回值,而过程不能返回值 同样地,对于不需要的语言,为什么不呢Language agnostic 为什么要区分返回值的方法和不返回值的方法;T,language-agnostic,programming-languages,language-design,Language Agnostic,Programming Languages,Language Design,为什么有些语言区分返回值的方法和不返回值的方法 i、 在Oracle的PL/SQL中,函数和过程之间的主要区别在于函数必须返回值,而过程不能返回值 同样地,对于不需要的语言,为什么不呢 编辑:我发现了一个相关的问题,阅读此问题的人可能会感兴趣: 在纯效果或效果类型的设置中存在着巨大的差异,因为“不返回任何内容”的方法显然只对其副作用有用 这类似于表达式和语句之间的区别,它可以分离一种语言并消除一类通常错误的程序(当然,这就是为什么C不这么做;) 举一个小例子,当您清楚地区分表达式和语句时,
编辑:我发现了一个相关的问题,阅读此问题的人可能会感兴趣:
if(x=3)
,而不是if(x==3)
在语法上是不正确的(用于在需要表达式的地方使用语句),而不仅仅是类型错误(用于在需要布尔值的地方使用整数)。这样做的好处是,在赋值为具有右操作数值的表达式的上下文中,基于类型的规则允许if(x=true)
在使用单子封装效果的语言中,重要的区别在于:
- 返回
的函数是纯函数,只能返回一个名为()
或发散的无用空值()
- 返回
(或某些其他monad中的单位)的函数,这些函数除了IO(或任何一个)monad中的效果外,没有“结果”IO()
- 函数将其返回地址和返回值放在机器堆栈上
- 过程使用堆上的链接列表。程序代码是扁平的,它不使用机器堆栈李>
- 出于性能原因,无法在控制交换上复制计算机堆栈
- 出于内存管理的原因,交换堆栈指针也不是一个选项
因为在计算机科学理论和实践的原始概念中,函数和子程序实际上没有任何关系 FORTRAN通常被认为是实现这两种语言并展示其区别的第一种语言。(早期的LISP在这方面也有一些相反的作用,但在学术界之外几乎没有影响) 遵循数学传统(CS在60年代仍然是数学的一部分),函数仅被视为参数化数学计算的封装,其目的仅在于将值返回到更大的表达式中。您可以称之为“裸”(F=方位角(秒))只是一个微不足道的用例 另一方面,子例程被视为一种命名一组语句的方法,这些语句具有一定的效果。参数极大地提高了它们的可用性,允许它们返回修改后的参数值的唯一原因是,它们可以报告自己的状态,而不必依赖全局变量 所以,除了封装和参数,它们实际上没有概念上的联系 真正的问题是:“那么多开发人员怎么会认为他们是一样的?” 答案是C 当K+R最初为PDP-11设计高级宏汇编类型语言时(可能是从PDP-8开始的?),他们没有硬件独立性的错觉。实际上,该语言的每一个“独特”特性都反映了PDP机器语言和体系结构(请参见i++和--i)。其中之一是实现了功能和子例程在PDP中的实现是相同的,只是调用方忽略了子例程的返回值(在R0[,R1])
void指针就这样诞生了,在C语言占领了整个编程世界之后,随之而来的是一种误解,即这种硬件/操作系统实现工件(尽管在几乎所有后续平台上都是如此)与语言语义相同。请原谅我回答一个两年前的问题,特别是我自己的语言Felix的独特之处,但无论如何,这里有:) 在Felix中,函数和过程是根本不同的,不仅仅是过程有副作用并在语句中调用,而函数没有副作用并在表达式中使用(因为Felix还有生成器,它们是具有副作用的函数……) 不,执行模型从根本上是不同的,主要是出于性能原因,但并非完全不同。模型是: