sma*_*ane 6 lisp variables common-lisp
我正在使用Common Lisp编写一个程序,我需要一个具有这个基本大纲的函数:
(defun example (initial-state modify mod-list)
(loop for modification in mod-list
collecting (funcall modify initial-state modification)))
Run Code Online (Sandbox Code Playgroud)
问题是我initial-state每次传递都需要相同modify,但modify可能具有破坏性.我只是复制一份,但我不想对什么类型的数据做出任何假设initial-state.
我怎样才能做到这一点?或者甚至可能吗?
谢谢!
如果该功能可能具有破坏性,而您无法对其进行任何操作,那么您需要复制该功能initial-state.
避免预先配置什么类型的数据所initial-state包含的一种可能性是,为调用者明确地提供复制操作或使其成为通用操作并依赖于其他人来提供方法.
;; Version 1: the caller must provide a function that
;; returns a new fresh initial state
(defun example (build-initial-state modify mod-list)
(loop for modification in mod-list
collecting (funcall modify (funcall build-initial-state) modification)))
;; Version 2: copy-state is a generic function that has been
;; specialized for the state type
(defun example (initial-state modify mod-list)
(loop for modification in mod-list
collecting (funcall modify (copy-state initial-state) modification)))
Run Code Online (Sandbox Code Playgroud)
第一个版本更通用,因为它允许状态为任何对象,而在第二个版本中,复制操作依赖于状态对象类型(这意味着您不能让两个调用者都使用列表作为具有不同复制语义的状态).但是copy-state,一般操作可以在其他地方使用,并使操作成为通用的增加可用性(您不需要传递构建器函数); 它也允许引进像其他的通用操作compare-state,write-state,read-state...