如果該功能可能具有破壞性,並且您無法做任何事情,那麼很明顯您需要複製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)))
第一個版本是更普遍的,因爲它允許狀態是任何對象,而在第二個版本的複製操作取決於狀態對象類型(這意味着你不能有兩個主叫方都使用列表與狀態不同的複製語義)。 然而copy-state
是一個普通的操作,可以在其他地方使用,並使操作成爲泛型可用性(您不需要傳遞構建器函數)。它還允許引入其他通用操作,如compare-state
,write-state
,read-state
...