翻转图像似乎使用懒惰评估

时间:2014-07-31 17:52:37

标签: image racket lazy-evaluation

我正在尝试使用球拍“2htdp / image”翻转图像列表。

以下是不起作用的最小示例:

#lang racket
(require 2htdp/image)
(define images 
  (list
     (bitmap "../data/player/player1.png")
     (bitmap "../data/player/player2.png")
     (bitmap "../data/player/player3.png")))
(define flipped (map flip-horizontal images))

在我看来(由于图像在DrRacket中绘制的速度),“翻转”列表的内容被懒惰地评估。只有在我尝试访问图像时才会计算其翻转版本。一旦我将这个球拍文件导入到宇宙中(使用“2htdp / universe”),这就成了一个问题,因为我在使用翻转的图像时性能很差。

我看了implementation的“翻转水平”,我看不出任何明显的原因。我还没有考虑“make-translate”和“make-image”的实现。

我无法强制使用force评估图像,调试器显示object:image作为列表内容。我不确定究竟发生了什么以及如何防止这个问题,并在启动时实际计算所有图像。

为什么会发生这种情况和/或如何正确修复它?感谢。

批准的答案是我的问题的解决方案,所以我最后只是将最后一行更改为:

(define flipped (map (compose freeze flip-horizontal) images))

1 个答案:

答案 0 :(得分:2)

你是对的,在显示图像内容时才会实际计算图像内容。如果您需要提前计算,可以使用freeze将图像转换为位图。

在您的示例中,尝试将flipped的定义更改为以下内容:

(define flipped (map (compose1 freeze flip-horizontal) images))