调用高阶函数时出现「Application not a procedure」错误排查(Racket)
问题分析与解决
你的错误根源在于update-movie的递归逻辑错误:每次递归调用时,你把proc处理当前帧后得到的图像当成了新的proc参数传入,而不是保留原有的处理过程proc。当第二次递归执行时,程序会尝试把这个图像当作过程调用,自然抛出“不是过程”的错误。
另外你的代码里还有一个语法错误:define rate 5)缺少左括号,应该写成(define rate 5)。
修正后的代码
#lang racket (require 2htdp/image) (require 2htdp/universe) (define bird-imgs (list ...)) ; 这里填入你的图像列表 (define rate 5) (define (draw-cage img) (define cage-frame (rectangle 460 400 "outline" (pen "black" 10 "solid" "round" "round"))) (overlay/align "middle" "middle" cage-frame img)) (define (update-movie proc frameslst) (if (null? frameslst) '() ; 用cons把当前帧处理后的结果和剩余帧的处理结果拼接,递归时保留原proc (cons (proc (car frameslst)) (update-movie proc (cdr frameslst))))) (run-movie (/ 1 rate) (update-movie draw-cage bird-imgs))
关键修正说明
- 原递归调用
(update-movie (proc (car frameslst)) (cdr frameslst))错误地将处理后的图像作为新的proc传入,修正后通过cons把处理好的图像加入结果列表,同时递归时仍传递原处理过程proc。 - 修复了
define rate 5)的语法错误,补充左括号。
内容的提问来源于stack exchange,提问作者Gulez
相关产品推荐
相关产品推荐

