LISP算术实施

时间:2015-07-16 08:31:25

标签: c lisp arithmetic-expressions

我正在用D制作一个玩具lisp翻译,我不太了解Lisp的理论。

我想知道Lisp是否可以自己实现基本的算术函数(+, - ,×,÷)。 大多数Lisp / Scheme方言使用C语言,类似Java的语言实现它,并将其作为lisp代码重载(重复实现?)。

我想纯粹为Lisp代码编写算术函数。 有可能吗?

4 个答案:

答案 0 :(得分:5)

除非您想使用Church numerals等,否则您将不得不进入硬件算术指令(addsub,{{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的这个系列:

https://web.archive.org/web/20101208222557/http://www.mactech.com/articles/mactech/Vol.08/08.03/BigNums/index.html

上面的链接是web.archive.org。由于某种原因,原始链接仍然显示没有内容(http://www.mactech.com/articles/mactech/vol.08/08.03/bignums/index.html

答案 3 :(得分:0)

Peano arithmetic的全部基于三个功能:

  • 零,根据方言在Lisps中表示为zeropzero?
  • 后继者,用add1表示为Lisps;如果您的方言没有它,则无论如何都必须使用自举语言实现+;
  • 身份,用equal用Lisp表示。

使用这三个函数,您可以构建整个算法,但这并不容易!

我认为,以实现语言构建Lisp算术原语(加,减,乘,除)是明智的。如果您要具有一流的比率和大数,则尤其如此。