Я прохожу Приведение SPEL в Лиспе , и это предлагаемое решение для обработки захвата объектов:
(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
заменить * Например, 1012 * из (whiskey-bottle living-room)
вместо добавления другой копии pair
?
Я новичок в Лиспе и, возможно, ошибаюсь ... Может кто-нибудь объяснить, верны ли мои предположения, и если да, то какой будет лучший способ справиться с подбором объектов в текстовом приключении на Лиспе?