我正在用D制作一个玩具lisp翻译,我不太了解Lisp的理论。
我想知道Lisp是否可以自己实现基本的算术函数(+, - ,×,÷)。 大多数Lisp / Scheme方言使用C语言,类似Java的语言实现它,并将其作为lisp代码重载(重复实现?)。
我想纯粹为Lisp代码编写算术函数。 有可能吗?
答案 0 :(得分:5)
除非您想使用Church numerals等,否则您将不得不进入硬件算术指令(add
,sub
,{{1} },mul
)这样或那样。
如果沿着硬件指令路由,那么根据你的Lisp实现,它可以使用C代码实现(特别是对于基于解释器的实现),或者可以直接发出那些指令(对于基于JIT编译器的实现) )。
如果你想尽可能地成为第一原则,你可以使用加法和减法指令来实现乘法和除法(在紧要关头,你可以像在学校里教的那样实现它们,尽管你'重新使用字大小的数字 - 也就是说,对于32位机器,每个数字都是base-4294967296而不是base-10。
答案 1 :(得分:3)
非常简单的解决方案总是使用你的主机数字塔,但我理解你希望保持原语低。然而,结果是像第一个LISP这样的语言,它对性能的反应很差。
作为克里斯教堂数字的替代品,您可以使用列表对数字进行建模。例如。 1234
可以是(+ 4 3 2 1)
。现在你要么是一个低数字类型作为基元,要么你看到的数字只是自我评估你的数学函数知道什么的符号。如果您的数字类型较低,则可以添加指数,使(+ 0 4 3 2 1)
为1234
,(+ 1 4 3 2 1)
为12340
,(+ -11 4 3 2 1)
为0.00000001234
。所有算术都是使用您从学校知道的数学精确的列表迭代。它比教堂数字更有效,效率更高,打印和阅读更容易。
我在我的little lisp interpreter上使用了这个,只有列表和符号。
答案 2 :(得分:2)
如果您有兴趣在Lisp中实施bignums,我可以推荐AndrévanMeulebrouck的这个系列:
上面的链接是web.archive.org。由于某种原因,原始链接仍然显示没有内容(http://www.mactech.com/articles/mactech/vol.08/08.03/bignums/index.html)
答案 3 :(得分:0)
Peano arithmetic的全部基于三个功能:
zerop
或zero?
; add1
表示为Lisps;如果您的方言没有它,则无论如何都必须使用自举语言实现+;
equal
用Lisp表示。使用这三个函数,您可以构建整个算法,但这并不容易!
我认为,以实现语言构建Lisp算术原语(加,减,乘,除)是明智的。如果您要具有一流的比率和大数,则尤其如此。