为什么我不能在函数体中进行两次make函数调用?

dot*_*00b 4 scheme racket

所以我将阅读如何设计程序第2版的第一章.我相信我取得了不错的进步.但是有一个"建议"将另一个图形添加到网格中.每次我尝试我都会收到错误.此时,我被困住了.下面是代码和错误.

注意:ROCKET图像在第1章中.我只是将其复制并粘贴到IDE中.

注意:"建议"是:如何更改程序以使火箭落在比场景底部高10个像素的平坦岩床上?别忘了改变风景.

HTDP第1章

这是有效的代码.

(define BOARDWIDTH 200)
(define BOARDHEIGHT 200)
(define STARTPOSITION 50)
(define BOARDBKGR "blue")
(define GAMEBOARD (empty-scene BOARDWIDTH BOARDHEIGHT BOARDBKGR))

(define ROCKET .)
(define UFO (overlay (circle 10 "solid" "red")
                     (rectangle 40 4 "solid" "green")))
(define FLATBED (rectangle 60 10 "outline" "black"))
(define (SPACESHIP option)
  (cond
    [(= option 1) ROCKET]
    [(= option 2) UFO]))
(define SHOWNSHIP (SPACESHIP 1))

(define V 20) ;Velocity
(define A 1)  ;Acceleration

(define (distance t)  ;t = Time
  (- (* V t) (* 1/2 A (sqr t))))

(define SPACESHIP-BOTTOM (- BOARDHEIGHT (/ (image-height SHOWNSHIP) 2)))

(define (render-shownship x y)
  (place-image SHOWNSHIP x y GAMEBOARD))

(define (create-rocket-scene.v7 t)
  (cond 
    [(<= (distance t) SPACESHIP-BOTTOM)
     (render-shownship STARTPOSITION (distance t))]
    [(> (distance t) SPACESHIP-BOTTOM)
     (render-shownship STARTPOSITION SPACESHIP-BOTTOM)]))
Run Code Online (Sandbox Code Playgroud)

这是不起作用的代码:

(define BOARDWIDTH 200)
(define BOARDHEIGHT 200)
(define STARTPOSITION 50)
(define BOARDBKGR "blue")
(define GAMEBOARD (empty-scene BOARDWIDTH BOARDHEIGHT BOARDBKGR))

(define ROCKET .)
(define UFO (overlay (circle 10 "solid" "red")
                     (rectangle 40 4 "solid" "green")))
(define FLATBED (rectangle 60 10 "outline" "black"))
(define (SPACESHIP option)
  (cond
    [(= option 1) ROCKET]
    [(= option 2) UFO]))
(define SHOWNSHIP (SPACESHIP 1))

(define V 20) ;Velocity
(define A 1)  ;Acceleration

(define (distance t)  ;t = Time
  (- (* V t) (* 1/2 A (sqr t))))

(define SPACESHIP-BOTTOM (- BOARDHEIGHT (/ (image-height SHOWNSHIP) 2)))

(define (render-shownship x y)
  (place-image SHOWNSHIP x y GAMEBOARD)
  (place-image FLATBED STARTPOSITION 195 GAMEBOARD))  ;offender

(define (create-rocket-scene.v7 t)
  (cond 
    [(<= (distance t) SPACESHIP-BOTTOM)
     (render-shownship STARTPOSITION (distance t))]
    [(> (distance t) SPACESHIP-BOTTOM)
     (render-shownship STARTPOSITION SPACESHIP-BOTTOM)]))
Run Code Online (Sandbox Code Playgroud)

而我得到的错误是:

define:期望函数体只有一个表达式,但找到1个额外部分

nad*_*eem 5

place-image总是需要4个参数 - 要放置的图像,x和y坐标,以及放置图像的场景(背景).代码中的问题是表达式(place-image FLATBED STARTPOSITION 195)只提供3个输入place-image.

所以,稍微备份并考虑:第一个表达式产生什么?(place-image SHOWNSHIP x y GAMEBOARD)制作一个有船的游戏板场景,对吗?现在在那个场景的顶部你还想放置FLATBED.因此,不是对场景图像函数调用进行排序,而是考虑编写它们 - 即您认为缺失的部分是(place-image FLATBED STARTPOSITION 195 ____)什么?在什么场景你想放置FLATBED?(提示:我们刚刚回答了上述内容).什么表达产生那个场景?(提示:你已经有了这个表达).

如果您理解了这个想法,您会看到在场景中放置多个图像,您可以编写或嵌套函数调用(而不是在尝试时对它们进行排序):

(place-image img1 x1 y1 (place-image img2 x2 y2 ...))
Run Code Online (Sandbox Code Playgroud)