我正在用D做一个玩具lisp解释器,但我不太了解Lisp的理论。
我想知道Lisp本身是否可以实现基本的算术函数(+,-,×,÷)。大多数Lisp/Scheme方言使用类似于Java的C语言内置来实现它,并将其重载为lisp代码(重复实现?)。
我只想把算术函数写成Lisp代码。有可能吗?
发布于 2015-07-16 17:27:35
除非您想使用Church numerals或类似的工具,否则在某些时候,您将不得不以某种方式使用硬件算术指令(add、sub、mul、div)。
如果沿着硬件指令的路线走下去,那么取决于您的Lisp实现,它可能是使用C代码实现的(特别是对于基于解释器的实现),或者那些指令可能是直接发出的(对于基于JIT编译器的实现)。
如果你想尽可能成为第一原则,你可以使用加法和减法指令来实现乘法和除法(在必要的情况下,你可以像在学校里学到的一样实现它们,尽管你使用的是单词大小的数字-即对于32位机器,每个数字都是基数4294967296而不是基数10)。
发布于 2015-07-16 18:23:26
非常简单的解决方案总是使用您的主机数字塔,但我理解您希望保持较低的原语。然而,结果是一种像第一个LISP一样的语言,它在性能上有一个很差的代号。
作为Chris的教会数字的替代方案,您可以使用列表对数字进行建模。例如:1234可以是(+ 4 3 2 1)。现在,你要么有一个低位的数字类型作为基元,要么你看到的数字只是简单的自我评估符号,你的数学函数知道是什么。如果你有一个小的数字类型,你可以添加一个指数,这样它就变成了1234的(+ 0 4 3 2 1),12340的(+ 1 4 3 2 1)和0.00000001234的(+ -11 4 3 2 1)。所有的算术运算都是列表迭代,使用的是你在学校学到的数学知识。它比教堂数字更有效,效率略高,打印和阅读它也更容易。
我在我的只有列表和符号的little lisp interpreter上使用了这个。
发布于 2015-07-16 18:44:01
如果你对在Lisp中实现bignums感兴趣,我可以推荐Andrévan Meulebrouck的这个系列:
上面的链接是web.archive.org。由于某些原因,原始链接仍然在线时不显示任何内容( http://www.mactech.com/articles/mactech/vol.08/08.03/bignums/index.html )
https://stackoverflow.com/questions/31449110
复制相似问题