3

私はLispで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必要はありません?の別のコピーを追加しますcdr(whiskey-bottle living-room)pair

私はLispに不慣れで、間違っているかもしれません...誰かが私の仮定が正しいかどうか説明してもらえますか?もしそうなら、Lispテキストアドベンチャーでオブジェクトのピックアップを処理するための最良の方法は何でしょうか?

4

1 に答える 1

1

コードにはいくつかの問題があります。

  • リスト*object-locations*はリテラルです。リテラルは変更しないでください。カエルの位置を破壊的に変更することはできません。したがって、新しい場所を前にプッシュする必要があります。
  • ゲームを進めていくと、リストは大きくなります。
  • 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))

Lispの非常に基本的な紹介については、David S.Touretzky著の「CommonLisp:A Gentle Introduction toSymbolicComputation」を参照してください。

于 2011-02-05T10:31:30.027 に答える