在racket中使用图像模块的递归问题

在racket中使用图像模块的递归问题,racket,Racket,我在第27行有以下错误: first: expects a non-empty list; given: #<image> first:需要一个非空列表;鉴于:# 这是递归的问题吗 我一直在研究,但找不到递归使用图像包的示例 我想不出什么,我不明白为什么它会给我这个错误:( ;您必须制作一个需要n个图形列表的程序,您将绘制这些图形, ;用户指示的所有颜色选项,并按您确定的固定距离分隔。 ;这些数字包含名称(取决于您设置的命名选项), ;根据图形要求的一个或多个测量值,以及是否绘制

我在第27行有以下错误:

first: expects a non-empty list; given: #<image>
first:需要一个非空列表;鉴于:#
这是递归的问题吗

我一直在研究,但找不到递归使用图像包的示例

我想不出什么,我不明白为什么它会给我这个错误:(

;您必须制作一个需要n个图形列表的程序,您将绘制这些图形,
;用户指示的所有颜色选项,并按您确定的固定距离分隔。
;这些数字包含名称(取决于您设置的命名选项),
;根据图形要求的一个或多个测量值,以及是否绘制完整或仅绘制轮廓的指示器。
;注:这些图纸必须使用包装的图像绘制。
(需要2htdp/图像)
(定义结构三角形(完成颜色大小))
(定义结构cuadrado_389;(颜色大小完成))
(定义结构循环(颜色大小完整))
(定义圆环(使圆环为黄色10轮廓)
(定义三角形(使三角形为“蓝色”10“实心”))
(定义cuadrado(制作“橙色”10“轮廓”))
(定义列表图(cons circulo(cons triangulo(cons cuadrado empty)))
(定义(validar figura ID)
(续)
[(空?图a)ID]
[(和(圆圈)(第一个图形))(正)(圆圈大小(第一个图形))(数字)(圆圈大小(第一个图形)))(字符串)(圆圈颜色(第一个图形))(字符串)(圆圈完整(第一个图形)))(validar(其余图形)#t)]
[(和(cuadrado?(第一个图形))(正)(cuadrado?大小(第一个图形)))(数字)(cuadrado?大小(第一个图形)))(字符串?(cuadrado?颜色(第一个图形)))(字符串?(cuadrado?完成(第一个图形)))(validar(其余图形)#
[(和(三角图)(第一个图))(正)(三角图大小(第一个图))(数字)(三角图大小(第一个图))(字符串)(三角图颜色(第一个图))(字符串)(三角图完整(第一个图)))(validar(其余图)#t)]
[其他(validar(其余数字)#f)])
(定义(图a)
(续)
[(空?图a)空]
[(圆形)(第一个图形))(路径(圆形(圆形-尺寸(第一个图形))(圆形-完整(第一个图形))(圆形-颜色(第一个图形)))]
[(三角形(第一个图形))(路径(三角形(三角形-大小(第一个图形))(三角形-完整(第一个图形))(三角形-颜色(第一个图形)))]
[(第一个图形)(通道(正方形(第一个图形)(第一个图形)(第二个图形)(第一个图形)(第二个图形)(第一个图形)(第一个图形)(第二个图形)(第一个图形)(第二个图形)(第二个图形)(第二个图形)(第二个图形)(第二个图形)(第二个图形)(第二个图形)(第二个图形)(第二个图形)(第二个图形)(第二个图形)(第二个图形)(第
[其他(路径(休息图))])
(定义(主图A)
(续)
[(布尔=?(validar图0)#t(路径图)]
[else“错误,单独许可:[圆形,cuadrados y三角形]”))
(主列表a_图)

这是一个类型错误。在对
路径的递归调用中,您传递的是一个图像,但它需要一个包含triangulo_/cuadrado_/circulo_的列表。此外,
validar
中cond子句的右侧有多个表达式,每个表达式都将从左到右求值,但它们的值并不重要,甚至不重要如果它们是
false
。最好将每个字段的验证与
结合起来

首先,为您定义的结构命名,我们称之为
ImageConfig

在更高的层次上,设计的问题在于,您将列表处理与列表中元素的处理混为一谈。最好将它们分开

现在将
validar
路径的
[图像配置列表]
处理与
ImageConfig
分开

; validar-l : [List-of ImageConfig] -> Boolean
; validar   : ImageConfig -> Boolean
; pathway-l : [List-of ImageConfig] -> [List-of Image]
; pathway   : ImageConfig -> Image
; main      : [List-of ImageConfig] -> [List-of Image]

;您必须制作一个需要n个图形列表的程序,您将绘制这些图形,
;用户指示的所有颜色选项,并按您确定的固定距离分隔。
;这些数字包含名称(取决于您设置的命名选项),
;根据图形要求的一个或多个测量值,以及是否绘制完整或仅绘制轮廓的指示器。
;注:这些图纸必须使用包装的图像绘制。
(需要2htdp/图像)
;ImageConfig是其中之一
(定义结构三角形(完成颜色大小))
(定义结构cuadrado_389;(颜色大小完成))
(定义结构循环(颜色大小完整))
(定义圆环(使圆环为黄色10轮廓)
(定义三角形(使三角形为“蓝色”10“实心”))
(定义cuadrado(制作“橙色”10“轮廓”))
(定义列表图(cons circulo(cons triangulo(cons cuadrado empty)))
;[ImageConfig列表]->Boolean
(定义(validar-l fl)
(条件[(空?fl)为真]
[else(和(validar(第一层))(validar-l(剩余层))]))
;ImageConfig->Boolean
(定义(validar f)
(续)
[(圈大小f)(和(正的圈大小f))(数字圈大小f))(字符串圈颜色f))]
[(cuadrado_0;f)(和(正)(cuadrado_0;f-size f))(数字(cuadrado_0;f-size f))(字符串(cuadrado_0;f-color f))]
[(triangulo_u?f)(和(正数?(triangulo_?f-size))(数字?(triangulo_?f))(字符串?(triangulo_?f-color)))])
;图像配置->图像
(定义(路径f)
(续)
[(圆形-尺寸f)(圆形-完整f)(圆形-颜色f))]
[(三角形(三角形-大小f)(三角形-完整f)(三角形-颜色f))]
[(cuadrado?f)(正方形(cuadrado?f大小)(cuadrado?f完整)(cuadrado?f颜色)))
;[图像配置列表]->[图像列表]
(定义(路径l-fl)
(续)
[(空?fl)空]
[其他(cons(通路(第一个fl))(通路-l(剩余fl)))]
;[图像配置列表]->[图像列表]
(定义(主层)
(续)
[(布尔=?(validar-l fl)真)(路径-l fl)]
[else(错误“error,solo se permiten:[circulos,cuadrados y triangulos]”)
(主列表a_图)
Res
; validar-l : [List-of ImageConfig] -> Boolean
; validar   : ImageConfig -> Boolean
; pathway-l : [List-of ImageConfig] -> [List-of Image]
; pathway   : ImageConfig -> Image
; main      : [List-of ImageConfig] -> [List-of Image]
; You must make a program that needs a list of n figures, which you will paint,
; all the color options that the user indicates and separates by a fixed distance that you determine.
; These figures contain a name (they depend on the naming options that you set),
; a measurement or measurements according to what the figure requires and an indicator of whether it is painted full or only the silhouette.
; NOTE: These drawings must be made using the image of the package.


(require 2htdp/image)

; ImageConfig is one of
(define-struct triangulo_ (color size complete))
(define-struct cuadrado_  (color size complete))
(define-struct circulo_   (color size complete))

(define circulo   (make-circulo_   "yellow" 10 "outline"))
(define triangulo (make-triangulo_ "blue"   10 "solid"))
(define cuadrado  (make-cuadrado_  "orange" 10 "outline"))

(define lista_figuras (cons circulo (cons triangulo (cons cuadrado empty))))

; [List-of ImageConfig] -> Boolean
(define (validar-l fl)
  (cond [(empty? fl) true]
        [else (and (validar (first fl)) (validar-l (rest fl)))]))

; ImageConfig -> Boolean
(define (validar f)
  (cond
    [(circulo_? f)   (and (positive? (circulo_-size f))   (number? (circulo_-size f))   (string? (circulo_-color f)))]
    [(cuadrado_? f)  (and (positive? (cuadrado_-size f))  (number? (cuadrado_-size f))  (string? (cuadrado_-color f)))]
    [(triangulo_? f) (and (positive? (triangulo_-size f)) (number? (triangulo_-size f)) (string? (triangulo_-color f)))]))


; ImageConfig -> Image
(define (pathway f)
  (cond
    [(circulo_?   f) (circle   (circulo_-size f)   (circulo_-complete f)   (circulo_-color f))]
    [(triangulo_? f) (triangle (triangulo_-size f) (triangulo_-complete f) (triangulo_-color f))]
    [(cuadrado_?  f) (square   (cuadrado_-size f)  (cuadrado_-complete f)  (cuadrado_-color f))]))

; [List-of ImageConfig] -> [List-of Image]
(define (pathway-l fl)
  (cond
    [(empty? fl) empty]
    [else (cons (pathway (first fl)) (pathway-l (rest fl)))]))

; [List-of ImageConfig] -> [List-of Image]
(define (main fl)
  (cond
    [(boolean=? (validar-l fl) true) (pathway-l fl)]
    [else (error "Error, solo se permiten: [ circulos, cuadrados y triangulos <equilateros> ]")]))

(main lista_figuras)