DrRacket运行火箭动画代码报错:开括号后预期函数却得到数字
Racket火箭动画代码报错原因及修复方案
核心报错原因
- 操作符与操作数缺少空格:Racket语法要求括号内第一个元素为函数,后续为参数,彼此必须用空格分隔。你写的
(-500(* 3 0))中-和500没有空格,Racket会把-500识别为数字,括号首元素不是函数就会触发你收到的报错;同理(*3 t)中*和3无空格也会触发同类问题。 - 函数与变量调用混淆:你提前用
(define height 500)把height定义为存储数值的变量,但后续代码错误地把height当作计算高度的函数调用,而你实际定义的高度计算函数名为altitude,变量无法作为函数调用,也会触发同类报错。 - 火箭图像未正确初始化:
(define rocket (image))中的image是构造函数,需要传入宽、高、模式、颜色参数,空调用会触发额外报错。
修复后的完整代码
(require 2htdp/image) (require 2htdp/universe) (define width 500) (define height 500) (define e-scene (empty-scene width height)) ; 定义红色矩形作为火箭示例,可自行替换为其他图像 (define rocket (rectangle 20 50 "solid" "red")) (define rocket-x (/ width 2)) ; 减号与500之间添加空格 (define H0 (- 500 (* 3 0))) (define H10 (- 500 (* 3 10))) ; 调用正确的高度计算函数altitude,而非变量height (check-expect (altitude 0) H0) (check-expect (altitude 10) H10) (define (altitude t) ; 补全空格:减号与500之间、*与3之间都添加空格 (- 500 (* 3 t))) (define img0 (place-image rocket rocket-x (altitude 0) e-scene)) (define img45 (place-image rocket rocket-x (altitude 45) e-scene)) (check-expect (create-rocket-scene 0) img0) (check-expect (create-rocket-scene 45) img45) (define (create-rocket-scene t) ; 火箭升至顶部后返回#f停止动画 (if (<= (altitude t) 0) #f (place-image rocket rocket-x (altitude t) e-scene))) (animate create-rocket-scene)
额外说明
操作符与操作数之间必须加空格是Lisp系语言(包含Racket)的基础语法规范,写代码时注意遵守即可避免同类识别错误。
内容的提问来源于stack exchange,提问作者Dima
相关产品推荐
相关产品推荐

