在lisp中可变的麻烦

时间:2011-06-14 23:45:46

标签: variables lisp common-lisp

我正在使用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的数据类型做出任何假设。

我怎样才能实现这一目标?或者甚至可能吗?

谢谢!

1 个答案:

答案 0 :(得分:7)

如果该功能具有破坏性,而您无法对其进行任何操作,那么您需要复制initial-state

避免预先配置initial-state包含的数据类型的一种可能性是,为调用者明确提供复制操作或使其成为通用操作并依赖其他人提供方法。< / p>

;; 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-stateread-state ......