gpt4 book ai didi

lisp - 在 Casting SPELls 中推送项目位置

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

我正在浏览 Casting SPELs in Lisp这是处理拾取对象的建议解决方案:

(define *location* 'living-room)

(define *object-locations*
'((whiskey-bottle living-room)
(bucket living-room)
(chain garden)
(frog garden)))

(define (pickup-object object)
(cond [(is-at? object *location* *object-locations*)
(push! (list object 'body) *object-locations*)
(string-append "You're now carrying the " (symbol->string object) ".")]
[else "There's no such object in here."]))

我是唯一发现这种效率低下的人吗?据我了解,push! 函数 cons 每次都会将一个新的 pair 设置为 *object-locations*玩家拿起一个物体。虽然这在像这样的小游戏中可能不是主要问题,但如果要添加从库存中放下元素的选项,*object-locations* 列表可能会无限增长......例如,pickup-object 不应替换 (whisky-bottle living-room)cdr,而不是添加另一个副本?

我是 Lisp 的新手,可能会弄错...有人可以解释一下我的假设是否正确,如果是这样,在 Lisp 文本冒险中处理拾取对象的最佳方法是什么?

最佳答案

代码有几个问题:

  • 列表*object-locations* 是一个文字。不应修改文字。你不能破坏性地改变 Frog 的位置。所以你需要在前面推一个新的位置。
  • 随着游戏的进行,列表会增加。
  • STRING-APPEND 为每个拾取操作创建一个新字符串。

但是

  • 作为一本书的例子,它很简单而且足够了。
  • 对象位置的堆栈将使某种撤消成为可能。
  • 推送项目和位置的新关联是一项快速操作。
  • 它为本书的读者留下了提高代码效率的机会。

在 Common Lisp 中很容易改变:

(defvar *object-locations*
(copy-tree
'((whiskey-bottle living-room)
(bucket living-room)
(chain garden)
(frog garden))))

(defun get-location (object)
(second (assoc object *object-locations*)))

(defun set-location (object location)
(setf (second (assoc object *object-locations*))
location))

CL-USER > (get-location 'frog)
GARDEN

CL-USER > (set-location 'frog 'living-room)
LIVING-ROOM

CL-USER > (get-location 'frog)
LIVING-ROOM

CL-USER > *object-locations*
((WHISKEY-BOTTLE LIVING-ROOM)
(BUCKET LIVING-ROOM)
(CHAIN GARDEN)
(FROG LIVING-ROOM))

看书Common Lisp: A Gentle Introduction to Symbolic Computation by David S. Touretzky了解 Lisp 的基本介绍。

关于lisp - 在 Casting SPELls 中推送项目位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4906203/

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