Lisp能否以不变的功能方式轻松使用?

时间:2019-01-26 03:38:03

标签: haskell common-lisp

我来自Haskell的背景,我想学习Common Lisp。

众所周知,CL不是“功能语言”,但我想知道它是否可以用作功能语言。

例如,是否可以以不变的方式使用所有数据类型?常见的Lisp哈希表似乎是使用setf来设置的,该值显然是可变的。有没有办法一成不变地使用它?

除了我与文件,网络等进行交互的Common Lisp的“ IO”方面(Haskell的“纯粹”方面)之外,我还可以用Lisp舒适地编写代码并确保该代码具有参照透明性。 ?

我可以从Common Lisp中流行的库中期望这些属性吗?

是否存在使这些困难的通用习语或语言方面?

1 个答案:

答案 0 :(得分:10)

是的,当然,但是取决于您希望执行多少限制,您的里程可能会有所不同。

只是不要变异

您可以简单地避免使用setf和所有场所机器。如果必须使用哈希表或向量,将进行大量复制,但是对于许多应用程序而言,垃圾回收开销仍然可以控制。在许多地方,您可以使用列表或列表列表,它们几乎可以像功能数据结构一样进行处理。 alexandria中有一些有用的实用程序,例如。 G。 copy-hash-table,它有一个key参数,实际上可以执行假设的map-hash-table之类的操作。所有其他功能方面的优点,例如高阶函数mapreduceremove等,都有很多风味。另外,某些用例可以在loop中以声明方式解决。

也有一些库可以使此样式明显更容易,例如e。 G。 modf

这可以带您走很远。我认为很容易看出您在哪里打破了参照透明性并避免了这种情况。

使用功能数据结构

FSet,可以为您提供许多功能数据结构,还有sycamore,可以为您提供更多功能。

使用传感器

SERIES出现在1990年的CLtL2中,几乎在1994年成为标准。还有taps,它增加了一些有用的功能。

冥想

就个人而言,我在追求纯洁之后不再那么努力。有时,与在不同范围内处理多个绑定相比,更改循环中的位置更容易理解。我只是将突变限制在外;这类似于数据所有权概念。但是,我希望在内存和磁盘(例如e)上都具有更大的纯度。 G。仅追加日志,数据库(bknr.datastore)。