C LISP算法的实现

C LISP算法的实现,c,lisp,arithmetic-expressions,C,Lisp,Arithmetic Expressions,我正在用D做一个玩具lisp解释器,我对lisp的理论不太了解 我想知道Lisp是否可以自己实现基本的算术函数(+、-、×、÷)。 大多数Lisp/Scheme方言都是用C语言的内置语言实现的,类似Java语言,并将其重载为Lisp代码(复制的实现?) 我想把算术函数纯粹地写在Lisp代码中。 有可能吗?除非您想使用或类似的方法,否则在某个时候您必须以某种方式进入硬件算术指令(add,sub,mul,div) 如果遵循硬件指令路线,则根据您的Lisp实现,它可能使用C代码实现(特别是对于基于解释

我正在用D做一个玩具lisp解释器,我对lisp的理论不太了解

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

我想把算术函数纯粹地写在Lisp代码中。 有可能吗?

除非您想使用或类似的方法,否则在某个时候您必须以某种方式进入硬件算术指令(
add
sub
mul
div

如果遵循硬件指令路线,则根据您的Lisp实现,它可能使用C代码实现(特别是对于基于解释器的实现),或者直接发出这些指令(对于基于JIT编译器的实现)


如果你想尽可能成为第一原则,你可以使用加法和减法指令来实现乘法和除法(在必要的情况下,你可以用学校教给你的方法来实现乘法和除法,尽管你使用的是字号大小的数字,也就是说,对于32位机器,每个数字都是base-4294967296,而不是base-10).

非常简单的解决方案是始终使用主机数字塔,但我理解您希望保持原语的低位。然而,结果是出现了一种类似于第一个LISPs的语言,它在性能方面表现不佳

作为克里斯教堂数字的替代品,你可以使用列表对数字进行建模。例如,
1234
可以是
(+4321)
。现在,要么将低数值类型作为基元,要么看到的数字只是数学函数知道的自评估符号。如果您有一个低数值类型,您可以添加一个指数,使其成为
1234
(+043231)
,以及
12340
(+14321)
(+-114321)
。所有的算术都是使用你从学校学到的数学来列出迭代次数。它比教堂数字更有效,效率略高,而且更容易打印和阅读


我在我的上使用过这个,它只有列表和符号。

如果您对在Lisp中实现bignums感兴趣,我可以推荐Andrévan Meulebrouck的这个系列:

上面的链接是web.archive.org。由于某些原因,原始链接在仍处于活动状态时没有显示任何内容()

所有内容都基于三个功能:

  • 零,在Lisps中表示为
    zerop
    zero?
    ,具体取决于方言
  • 继任者,在Lisps中由
    add1
    表示;如果你的方言没有它,你将不得不在你的引导语言中实现+
  • 标识,在Lisp中用
    equal
    表示
使用这三个函数,您可以构建整个算术,但这并不容易

在我看来,在实现语言中构建Lisp算术原语(加、减、乘、除)是明智的。如果你想拥有一流的比率和bignum,情况尤其如此