Sas*_*gov 41 stack factor-lang
我最近看了一下Factor,并且有一种基于堆栈概念的语言的想法非常有趣.(这是我第一次遇到面向堆栈的语言.)但是,我没有看到这种范式的任何实际优势.对我来说,它似乎比它的价值更麻烦.为什么我会使用像Stack或Forth这样的面向堆栈的语言?
我忽略了因素(借口双关语),例如工具和库的可用性.我只询问语言范式本身.
Ash*_*eyF 30
堆栈方向是一个实现细节.例如,Joy可以使用重写来实现 - 没有堆栈.这就是为什么有些人喜欢说"串联"或"组合".使用引号和组合器,您可以在不考虑堆栈的情况下进行编码.
用纯粹的构图表达自己,没有本地人或命名参数是关键.它非常简洁,没有句法开销.组合使得很容易分解冗余并"代数"地操纵你的代码; 把它归结为它的本质.
一旦你爱上了这种无点的风格,你就会被其他语言中最轻微的构图语法所困扰(即使只是一个点).在连接语言中,空格是组合运算符.
Rup*_*ick 10
我不确定这是否能完全回答你的问题,但你会发现因素首先将自身描述为一种串联语言.它恰好也有一个基于堆栈的执行模型.不幸的是,我找不到Slava的博客文章(?或者也许是在因子维基?上).
连接模型基本上意味着你传递"代码的深刻"(好吧,这就是你的编程方式)和组合看起来像连接.像currying这样的操作也很容易用基于堆栈的语言表达,因为你只是预先编写了一个向堆栈添加一个东西的代码.至少在因子中,这是通过一个叫做的词来表达的curry.这使得更高阶的编程变得更容易,并且序列上的映射最终成为"明显的方法".我是从Lisp那里来的,在使用Factor编程之后回过头来回过头来看起来很惊讶,就像bi在Lisp中那样做"明显的事情" .它确实改变了你表达事物的方式.
顺便说一句,明智的做法就是不要在整个堆栈操作上过于笼罩.使用locals词汇表(在此处描述:http://docs.factorcode.org/content/article-locals.html),您不必担心随意乱扔东西.通常有一种简洁的方式来表达没有局部变量的东西,但我倾向于那样做.
正在开发基于堆栈的语言的一个重要原因是因为它们的语义的极简主义允许直接的解释器和编译器实现,以及优化.
因此,这种范例的一个实际优点是,它允许发烧友们轻松地在他们之上构建更复杂的事物和范例.
Scheme编程语言就是另一个例子:极简主义的语法和语义,简单的实现,以及很多乐趣!
[已编辑] 我们已经有了很好的答案,但我对 Factor 语言一无所知。然而,正如所问的,支持堆栈使用是面向堆栈的范式的一个实际优势,也是采用这种范式的原因。
因此,我认为为了完整性,列出堆栈使用而不是堆分配的优点是值得的:
当然,实现起来可能更复杂,这取决于您的问题,但是在任何语言中,我们总是倾向于堆栈而不是堆。仅在实际需要时才使用 malloc/new(大小或生命周期要求)。