2

Concatenative languages有一些非常有趣的特征,比如能够组合不同元素的函数并能够分解函数的任何部分。但是,许多人因为使用了后缀符号而忽视了它们,并且它很难阅读。此外,波兰人可能不赞赏使用他们精心制作的符号的人倒退。连接语言是否可以使用前缀符号?

那么,是否有可能有前缀符号?如果是这样,那么权衡是什么?

我对它是如何工作有一个想法,但我没有使用连接语言的经验,所以我可能错过了一些东西。基本上,一个函数将以相反的顺序进行评估,并且将以相反的顺序从堆栈中抽取值。为了演示这一点,我将比较postfix和前缀的样子。这里有一些与传统的后缀表示法连接的表达式。

5 dup *        ! Multiply 5 by itself 
3 2 -        ! Subtract 2 from 3 
(1, 2, 3, 4, 5) [2 >] filter length ! Get the number of integers from 1 to 5 
            ! that are greater than 2 

的表达式进行求值从左至右依次为:在第一实例中,5被压入堆栈,然后dup复制了堆栈顶部的值,则*乘以堆栈顶部的两个值。函数首先从堆栈中抽取最后一个参数:在第二个示例中,当调用-时,2位于堆栈的顶部,但它是最后一个参数。

这是我觉得前缀符号看起来像:

* dup 5 
- 3 2 
length filter (1, 2, 3, 4, 5) [< 2] 

的计算公式是从右到左评估,功能先拉自己的第一个参数从栈中。请注意前缀过滤器示例如何更接近其描述,并且看起来与应用风格类似。我注意到的一个问题是将因素考虑在内可能没有那么有用。例如,在后缀表示法中,您可以从3 2 -中分解出2 -以创建subtractTwo函数。在前缀表示法中,可以从- 3 2中分解出- 3以创建subtractFromThree函数,这看起来没有用处。

除了任何明显的问题,也许使用前缀符号的连接语言可能会赢得不喜欢后缀符号的人。任何见解都会被赞赏。

+0

组成在后缀表示法中看起来更好,您可以按照数据流的顺序编写它。这感觉不自然和尴尬 - 既不适用也不串连。 – 2012-03-02 23:12:31

+0

但是对于习惯于看到一个函数名称后跟其参数的人来说,这种风格是不是更吸引人?该过滤器示例看起来与其Haskell相似,除了它不需要任何时髦的组合运算符或括号。谓词很尴尬,但也许有办法让它看起来更好。 – 2012-03-03 00:30:56

+0

这是一个范例开关,总有你需要习惯的东西。功能vs命令也是一样 - 来自后者的人将被用于变量可变和动作总是顺序发生,但这不是改变函数式语言基本属性的论据。切换到concatenative后,postfix感觉很自然。 – 2012-03-03 00:55:14

回答

2

当然,如果你的话还是固定的话,那么这只是执行从右到左的令牌的问题。

这只是因为n元函数的前缀符号意味着括号,这只是因为想要人类“阅读顺序”来匹配执行顺序,因为堆栈语言意味着后缀。

+0

感谢您的简单客观答案。我也很关心什么是权衡,但这更多的是假设和主观的讨论。 – 2012-09-03 18:21:11

+0

至于权衡:我相信用固定的词语,前缀和后缀完全等同于机器的关心。你可以从字面上翻转或反向执行。人类可能会关心,取决于他们是自上而下还是自下而上的人:)有些人喜欢看“如果x做y”,而另一些人则喜欢“做y当x”。比如没有前向引用 – AshleyF 2012-09-04 13:06:37

+0

......甚至没有参数。所以postfix很好。但我认为这只是一种偏好,没有本质的区别。也许机器和我应该只是读“向后”:) – AshleyF 2012-09-04 13:15:00

0

我想象一个没有堆栈的连接前缀语言。它可以调用函数,然后它们可以自己解释代码,直到获得所有需要的操作数。口译员然后会调用下一个功能。它只需要一个内存构造 - 结果。在执行时可以从源代码读取其他所有内容。正如你可能已经注意到的那样,我正在谈论解释性语言,而不是编译一个。

+0

有趣的想法。你将如何处理多个中间结果?就像前缀表达式“ - + 1 1 + 3 3”一样,你将如何跟踪“+ 1 1”和“+ 3 3”的结果? – 2012-05-09 17:22:59

+0

我不知道。检出XY,这是一种带队列而不是堆栈的连接语言。还有其他一些可以引用的语言。 – majTheHero 2012-10-16 13:20:02

3

我现在正在写这样的语言,到目前为止,我喜欢使用前缀表示法的一些副作用。语义基于Joy:

  • 文件从左到右被解析,但是从右到左执行。
  • 通过扩展,定义必须在之后使用
  • 作为一个很好的副作用,评论是简单的列表被丢弃。

这里的阶乘的功能,例如:

def 'fact [cond [* fact - 1 dup] [1 drop] dup] 

我也觉得它更容易推理的代码为我写的,但我没有在衔接语言强大的背景。这是我的(可能是天真的)派生地图函数的列表。 'nb'函数会删除一些内容并用于评论。 '藏匿[f]'弹入临时状态,在堆栈的其余部分运行'f',然后将温度推回。

def 'map [q [cons map stash [head swap i] dup stash [tail dup]] [nb] is_cons nip] 
nb [map [f] (cons x y) -> cons map [f] x f y 
    stash [tail dup] [f] (cons x y)  = [f] y (cons x y) 
    dup     [f] y (cons x y)  = [f] [f] y (cons x y) 
    stash [head swap i] [f] [f] y (cons x y) = [f] x (f y) 
    cons map   [f] x (f y)   = cons map [f] x f y 

    map [f] [] -> []] 
3

我刚刚从阅读有关Om Language

来到看来你是在谈论什么。从它的介绍(重点煤矿):

庵语言是:

  • 一本小说,最大-简单拼接,homoiconic编程和算法的符号与语言:
    • 最小的语法,仅由三个元素组成。
    • 前缀表示法,其中函数处理程序本身的其余部分。 [...]

它还说,这还不算完,并经历了很多变化呢。

尽管如此,它似乎在工作,并且作为概念证明非常有趣。

相关问题