gpt4 book ai didi

variables - lisp 中的变量问题

转载 作者:太空宇宙 更新时间:2023-11-03 18:36:39 29 4
gpt4 key购买 nike

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

我怎样才能做到这一点?或者有可能吗?

谢谢!

最佳答案

如果该函数可能具有破坏性,而您对此无能为力,那么很明显您需要制作 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)))

第一个版本更通用,因为它允许状态是任何对象,而在第二个版本中,复制操作取决于状态对象类型(这意味着你不能让两个调用者都使用列表作为具有不同复制语义的状态).然而,copy-state 是一个通用操作,可能可以在其他地方使用,并使该操作成为通用操作,从而提高可用性(您不需要传递构建器函数);它还允许引入其他通用操作,如 compare-statewrite-stateread-state...

关于variables - lisp 中的变量问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6351475/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com