Racket 如何将图形对象列表映射到符号集合?使用`(定义值)`?

Racket 如何将图形对象列表映射到符号集合?使用`(定义值)`?,racket,Racket,我试图通过遵循“Racket王国”中的代码示例来学习Racket。目前在第8章,我决定重构一些重复的代码来帮助自己更快地学习。具体地说,我正在尝试将游戏图形列表分配给一组符号,但我一直遇到错误 这是原始的orc world.rkt源文件。代码运行良好 (需要2htdp/image) ;; 计算图像帧的常数 (定义ORC(位图“graphics/ORC.png”)) (定义HYDRA(位图“graphics/HYDRA.png”)) (定义SLIME(位图“graphics/SLIME.bmp”)

我试图通过遵循“Racket王国”中的代码示例来学习Racket。目前在第8章,我决定重构一些重复的代码来帮助自己更快地学习。具体地说,我正在尝试将游戏图形列表分配给一组符号,但我一直遇到错误

这是原始的
orc world.rkt
源文件。代码运行良好

(需要2htdp/image)
;; 计算图像帧的常数
(定义ORC(位图“graphics/ORC.png”))
(定义HYDRA(位图“graphics/HYDRA.png”))
(定义SLIME(位图“graphics/SLIME.bmp”))
(定义BRIGAND(位图“graphics/BRIGAND.bmp”))
(定义PIC-LIST(列出ORC HYDRA SLIME BRIGAND))
(定义w(应用最大值(贴图图像宽度PIC-LIST)))
(定义h(应用最大值(地图图像高度PIC-LIST)))
(定义播放器图像(位图“graphics/PLAYER.bmp”))
(定义框架(带“轮廓”白色的矩形))
(定义目标(圆圈((/w 2)2)“轮廓”蓝色)
(定义ORC-IMAGE(覆盖ORC帧))
(定义HYDRA-IMAGE(叠加HYDRA帧))
(定义粘液图像(覆盖粘液帧))
(定义BRIGAND-IMAGE(覆盖BRIGAND帧))
基本上,它是从磁盘读取一组位图图像并将它们分配给符号。有很多代码重复。我正试图改变它,以尽量减少代码重复,同时了解Racket的标准库是如何工作的

我的版本,现在忽略
(覆盖)
代码:

(需要2htdp/image)
(定义基本路径“/Applications/Racket v7.3/share/pkgs/realm/chapter8/graphics/”)
(定义文件名“(“orc.png”“hydra.png”“slime.bmp”“brigand.bmp”“player.bmp”))
(定义路径(映射(lambda(x)(字符串附加BASEPATH x))文件名))
(定义图片(映射(lambda(x)(位图/文件x))路径))
(定义PIC-LIST(ORC HYDRA SLIME BRIGAND PLAYER-IMAGE))
我希望遍历图片列表,并将每张图片分配给列表中的一个符号。我可以做一个
(定义ORC(第一张图片))
(定义HYDRA(第二张图片))
等,但这不是我想要的。似乎我们可以使用
(map)
,因为两者都是相同长度的列表,但我得到以下错误

(映射(lambda x y)(定义x y)PIC-LIST图片);错误。定义:中的表达式上下文中不允许使用:定义
(地图(λx y(定义值(x)(值y))PIC-LIST图片);错误。定义值:在中的表达式位置不允许:(定义值(x)(值y))
(地图(λ(xy)(定义xy))PIC-LIST图片);错误。begin(可能是隐式的):在中的一系列内部定义之后没有表达式:
;  (开始(定义x和y))
;  (定义x和y)
单独使用
(定义值)
也不起作用

(定义值PIC-LIST(值图片));语法错误,因为PIC-LIST是一个列表
希望有人能给我指出正确的道路。这一定是我忽略的非常简单的事情,因为这是一项非常普通的任务

感谢您阅读本文。

您可以这样使用:

 (match-define (list ORC HYDRA SLIME BRIGAND PLAYER-IMAGE) IMAGES)
只要事先知道图像的数量,它就可以工作,不能将变量名列表作为参数传递(我们在这里进行模式匹配)

我想这没关系,因为不管怎样,在给每一张图片命名之前,你应该知道你想如何命名你的图片,你有多少张图片,以及它们的出现顺序。如果我必须重构原始代码,它会是这样的:

#lang racket

(require 2htdp/image)

(define paths '("graphics/orc.png"
                "graphics/hydra.png"
                "graphics/slime.bmp"
                "graphics/brigand.bmp"
                "graphics/player.bmp"))

(match-define (list ORC HYDRA SLIME BRIGAND PLAYER-IMAGE)
  (map bitmap paths))
(define PIC-LIST (list ORC HYDRA SLIME BRIGAND))

(define w (apply max (map image-width PIC-LIST)))
(define h (apply max (map image-height PIC-LIST)))
(define FRAME (rectangle w h 'outline 'white))
(define TARGET (circle (- (/ w 2) 2) 'outline 'blue))

(match-define (list ORC-IMAGE HYDRA-IMAGE SLIME-IMAGE BRIGAND-IMAGE)
  (map (λ (img) (overlay img FRAME)) PIC-LIST))

请注意,有三个不同的变量列表,每个变量只定义一次,因此代码重复被最小化。

您好,感谢您的回复。不是这样;我故意从我的帖子中漏掉了
#lang racket
,以关注我遇到的问题。我在上面的代码中遇到了一个错误,因为我的文件系统看起来显然不同,但除此之外,我没有得到你提到的
定义
错误。您确定问题中的5行是触发
define
错误的行吗?在我看来,你的代码的结果只是一个名为
图片
图像的列表,没有任何错误。我将编辑原始帖子以使事情更清楚。@Greenhorn这是另一回事,现在问题清楚了。请始终确保您在问题中发布的代码实际上再现了问题并生成了您收到的错误消息。好的,明白了。谢谢