Racket 如何将结构的实例添加到哈希表中?我一直收到一份报价单

Racket 如何将结构的实例添加到哈希表中?我一直收到一份报价单,racket,Racket,我在写一个简单的小流氓来学习球拍。我一直在做一件看起来很简单的事情——使用哈希表创建游戏对象工厂。我这样做的典型方式(如clojure或其他)是创建一个关键字(如“player”)并为该类型的游戏对象添加一个对象实例,然后根据需要进行克隆 很明显,我遗漏了一些基本的东西。很抱歉这个简单的问题 我尝试过创建哈希列表的多个版本。唯一可行的方法是简单地将属性放入哈希列表中,而不是使用“应用”来使用结构副本。但是,当它们的结构嵌套在基本结构中时,这不起作用 ;racket #lang racket (

我在写一个简单的小流氓来学习球拍。我一直在做一件看起来很简单的事情——使用哈希表创建游戏对象工厂。我这样做的典型方式(如clojure或其他)是创建一个关键字(如“player”)并为该类型的游戏对象添加一个对象实例,然后根据需要进行克隆

很明显,我遗漏了一些基本的东西。很抱歉这个简单的问题

我尝试过创建哈希列表的多个版本。唯一可行的方法是简单地将属性放入哈希列表中,而不是使用“应用”来使用结构副本。但是,当它们的结构嵌套在基本结构中时,这不起作用

;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))
我不知道为什么我把它作为一个引用列表。而不是一个实例化的对象。我觉得我在上面的(定义对象模板)中缺少了一些语法糖,但我一直找不到它。

试试:

(define object-templates 
  (hash "player" (object "@" "green" (loc 0 0))))
问题是
#hash(…)
将引用其中的所有内容。如果要允许计算,请使用
hash
(或
make hash
进行可变哈希,尽管参数格式不同)


这类似于
'(对象)
vs
(列表对象)
,或
#(对象)
vs
(向量对象)
,等等。

啊!我想我已经试过了,错过了那个细微差别。谢谢!