2011-06-14 42 views
6

我寫用Common Lisp程序中,我需要一個函數與此基本輪廓:可變麻煩口齒不清

(defun example (initial-state modify mod-list) 
    (loop for modification in mod-list 
     collecting (funcall modify initial-state modification))) 

的問題是,我需要initial-state每次傳遞時間是相同的到modify,但modify可能是破壞性的。我只是簡單地複印一份,但我不想對initial-state是什麼類型的數據做任何假設。

我該如何做到這一點?或者甚至有可能?

謝謝!

回答

7

如果該功能可能具有破壞性,並且您無法做任何事情,那麼很明顯您需要複製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-statewrite-state,read-state ...