Lisp可以很容易地以不可变的,功能性的方式使用吗?

3 haskell common-lisp

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

很好地讨论了CL"不是一种函数式语言",但我想知道它是否可以用作函数式语言.

例如,是否可以以不可变的方式使用所有数据类型?似乎使用了Common Lisp哈希表setf,这显然是可变方向.有没有办法以不可变的方式使用它?

除了Common Lisp的"IO"方面(Haskell的"纯粹"方面),我与文件,网络等进行交互,我可以在Lisp中轻松编写代码并确保代码具有引用透明性吗?

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

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

Sva*_*nte 12

是的,当然,但根据您希望限制执行的程度,您的里程可能会有所不同.

只是不要改变

你可以简单地避免setf和所有的地方机械.如果必须使用散列表或向量,则会复制很多,但对于许多应用程序,垃圾收集开销仍然可以管理.在许多地方,您可以使用alist或plist,它们几乎可以像功能数据结构一样处理.alexandria例如copy-hash-table,一些有用的实用程序具有key实际执行类似假设的事实的论据map-hash-table.所有其他功能善良,像高阶函数,map,reduce,remove等有许多种可用.此外,某些用例可以在声明中解决loop.

还有一些库使这种风格更容易,例如modf.

这可能会带你走得很远.我觉得很容易看出你打破参考透明度的地方并避免这种情况.

使用功能数据结构

FSet,它为您提供了许多功能数据结构,还有美国梧桐,它提供了更多功能.

使用传感器

系列于1990年出现在CLtL2中,几乎在1994年成为标准.还有水龙头,增加了一些有用的功能.

幽思

就个人而言,我不再那么认真了.有时,在循环中改变一个位置比在不同范围内处理多个绑定更容易理解.我只是把变异限制在一起; 这类似于数据所有权概念.但是,我喜欢在内存和磁盘上拥有更大规模的纯度,例如仅附加日志,数据库(bknr.datastore).