口齿不清的麻烦

| 我正在用Common Lisp编写程序,其中我需要一个具有以下基本轮廓的函数:
(defun example (initial-state modify mod-list)
  (loop for modification in mod-list
        collecting (funcall modify initial-state modification)))
问题在于,每次传递给
modify
时,我都需要
initial-state
相同,但是
modify
可能具有破坏性。我只想制作一个副本,但是我不想对“ 1”是什么类型的数据做任何假设。 我怎样才能做到这一点?甚至有可能吗? 谢谢!     
已邀请:
        如果该函数具有破坏性,而您对此无能为力,那么很显然您需要复制
initial-state
。 避免预配置ѭ1包含哪种数据的一种可能性是,为调用者提供明确的复制操作留给调用者一个问题,或者使其成为通用操作并依靠其他人来提供一种方法。
;; 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)))
第一个版本比较笼统,因为它允许状态成为任何对象,而在第二个版本中,复制操作取决于状态对象类型(这意味着您不能让两个调用者都将列表用作具有不同复制语义的状态)。 但是,“ 8”是通用操作,可以在其他地方使用,并且使该操作具有通用性,从而提高了可用性(您无需传递构建器函数);它还允许引入其他通用运算,例如
compare-state
write-state
read-state
...     

要回复问题请先登录注册