括号只是打字机

2021-06-25 06:00:12

我们如何将此转换为堆栈语言?堆栈语言区域镜像Lisps的镜像,用Postfix写作而不是前缀表示法。 SOA sturk的此表达式的版本在没有括号的情况下反转相同的单词:

但为什么这必然必须写入Postfix?评估右到左的第四次看起来几乎与前缀符号语言相同,没有分隔符。

它不是比原来更可读的。但是,如果你扭转这个词,评价它就好像它一样,表达式是相同的,有或没有宫殿。

这里的一种方式来看:对于简单的表达式,括号是静态typechecking的形式。如果将LISP模拟为左侧评估的堆栈语言,则每个括号块必须恰好推动一个值ONTOTHE堆栈,并且不得使用任何值。在第四条术语中,每个(...)强制其内容是类型 - a。

这次等价作出了一些假设。对于一个,它' s假设lisp-2(即使是方案是lisp-1),因为从堆栈语言函数返回的关闭时,只会靠在堆栈上,所以((组成ab)c)worln&#39 ;工作。

我也只在这里谈论简单的表达式,忽略了Lisps和Forth之间的其他奇异性差异,如列表和variadicfunctions(它仍然需要括号),以及可变定义versus stack munging运算符,如dup或swap。

即使是这些警告,等价仍在迷人。它使Meaware在堆栈语言和Lisps的设计空间中的一些空白:

...一种左右评估的堆栈语言?基于非堆栈的语言在单个表达式内评估左右,因此这可能令人惊讶直观。是的,我们经常期望函数参数向右左右,但一些主流语言(特别是c)leaveargument评估命令未定义。

...允许括号作为理智检查的堆栈语言? - AExpressions是常见的,并且允许程序员将它们包装中的inparenthes来强制执行此类型可以使堆栈代码更可读。 (Ihaven' t实际上使用了许多堆栈语言,所以这可能存在,我justhaven' t看它。)

......当意义从Context清晰时,可以将嵌套括号丢弃的Lisp?这一点采取一些解释。

考虑一个LISP-2,其中函数以uppercamelcase of oblow-kebab-case中的值写入。然后可以将表达式(Foo Bar(BAZ Qux))重写为(Foo Bar Baz Qux)。

最简单的版本,假设每个参数都转到左侧的第一个函数。那已经有用的,但它已经有用,但它并不依赖'在谈论的情况下。

如果我们不进行这种简化的假设,那么就像(a b c)一样模糊。这将是(a(b)(c))如果b和c取0 argumesand a需要2,但是(a(b 。我们可以使用StackInstead,但随后它并不是一个真正的Lisp了。