首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >LISP算法的实现

LISP算法的实现
EN

Stack Overflow用户
提问于 2015-07-16 16:31:25
回答 4查看 242关注 0票数 2

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

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

我只想把算术函数写成Lisp代码。有可能吗?

EN

回答 4

Stack Overflow用户

发布于 2015-07-16 17:27:35

除非您想使用Church numerals或类似的工具,否则在某些时候,您将不得不以某种方式使用硬件算术指令(addsubmuldiv)。

如果沿着硬件指令的路线走下去,那么取决于您的Lisp实现,它可能是使用C代码实现的(特别是对于基于解释器的实现),或者那些指令可能是直接发出的(对于基于JIT编译器的实现)。

如果你想尽可能成为第一原则,你可以使用加法和减法指令来实现乘法和除法(在必要的情况下,你可以像在学校里学到的一样实现它们,尽管你使用的是单词大小的数字-即对于32位机器,每个数字都是基数4294967296而不是基数10)。

票数 5
EN

Stack Overflow用户

发布于 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上使用了这个。

票数 3
EN

Stack Overflow用户

发布于 2015-07-16 18:44:01

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

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 )

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31449110

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档