如何将结构实例添加到哈希表?我不断得到报价单

MyC*_*rum 4 racket

我正在写一个简单的小roguelike学习球拍。我被困在看似很简单的事情上-使用哈希表创建游戏对象工厂。我执行此操作的典型方式(如clojure或其他方法)是创建一个关键字(如“ player”),并为该类型的游戏对象添加一个对象实例,然后根据需要克隆该对象。

我显然在这里缺少基本的东西。很抱歉这个简单的问题。

我尝试了创建哈希列表的多个版本。我使它起作用的唯一方法是简单地将属性放在哈希列表中,而不是通过apply使用struct-copy。但是,当将它们的嵌套结构嵌套在基本结构中时,这不能很好地工作。

;racket
#lang racket

(struct loc (x y) #:transparent)
(struct object (rep color loc) #:transparent)
(struct world (player running) #:transparent)

(define object-templates 
  #hash(["player" . (object "@" "green" (loc 0 0))]))

(define (make-object type) (struct-copy object (dict-ref object-templates type)))


; struct-copy: contract violation
;   expected: object?
;   given: '(object "@" "green" (loc 0 0))
Run Code Online (Sandbox Code Playgroud)

我不知道为什么要把它作为报价单。而不是实例化的对象。我感觉好像在上面的(定义对象模板)中缺少一些语法糖,但是我一直找不到。

Sor*_*ase 6

尝试:

(define object-templates 
  (hash "player" (object "@" "green" (loc 0 0))))
Run Code Online (Sandbox Code Playgroud)

问题在于#hash(...)它将引用其中的所有内容。如果要允许求值,请使用hash(或make-hash用于可变哈希,尽管参数格式不同)。

这类似于'(object)vs (list object)#(object)vs (vector object)等。