在Racket中使用struct

时间:2014-08-30 18:36:20

标签: scheme racket

我是Racket的新手。我正在尝试here中的问题1。以下是我可以制作的代码:

#lang racket

(require 2htdp/image)

(require rackunit)
(require rackunit/text-ui)
(require "extras.rkt")

(define curr-dir "n")
(define curr-x 30)
(define curr-y 40)

;; Structure that I thought about
(define-struct robot (x y direction))
(define irobot (make-robot curr-x curr-y curr-dir))

(define MAX_HEIGHT 200)
(define MAX_WIDTH  400)

(define (render-robot)
(place-image
(crop 14 0 10 20 (circle 10 "solid" "blue"))
19 10
(circle 10 "solid" "red"))
)

(define (spawn-robot x y direction)
(place-image
(cond 
    [(string=? "n" direction) (rotate 90 (render-robot))]
    [(string=? "e" direction) (render-robot)]
    [(string=? "w" direction) (rotate 180 (render-robot))]
    [(string=? "s" direction) (rotate 270 (render-robot))]
    )
x y
(empty-scene MAX_WIDTH MAX_HEIGHT)
)
)

(define (initial-robot x y)
(if (and (<= x (- MAX_HEIGHT 10)) (<= y (- MAX_WIDTH 10)))
    (spawn-robot x y curr-dir)
    (error "The placement of the robot is wrong!")
    )
)

(define robot1 (initial-robot curr-x curr-y))

;;-----------------------------------------------------;;

;; Doubt Here (Make the robot turn left)
(define (robot-left robot-obj)
(set! curr-dir "w") ;; Hard coded for north direction
(initial-robot curr-x curr-y)
)

;; Doubt Here (Function checks whether robot is facing north or not.)
(define (robot-north? robot-obj)
(if (string=? "n" curr-dir) (true) (false))
)

在翻译中我尝试了这个:

Interpreter Snap

我当时认为代码可能正常,但我脑子里还是出现了一些疑问:

  1. 在根据我的代码中使用Structure(make-struct)应该 一直很好,但根据我认为的问题的解释 机器人的实例是函数initial-robot的结果。 使用结构是否可行?

  2. 在函数robot-leftrobot-north?中我应该如何使用 robot1作为论点?设置存储的全局变量 对象的当前方向可以用于函数 提及。我该怎么办?

  3. 欢迎任何建议。 谢谢!

1 个答案:

答案 0 :(得分:2)

你认为结构是更好的选择是正确的:

1)您不会局限于代码中的单个机器人,而且

2)你将以功能的方式进行编程,这就是作业所需要的。

所以,使用你的机器人结构:

(define-struct robot (x y direction))

确保为结构提供正确的数据定义。

;; A Robot is a (make-robot x y direction), where:
;; - x is an integer
;; - y is an integer
;; - direction is a string

虽然,我建议使用符号代替direction的字符串。


(robot-left)

;; Turns a robot to the left.
;; Robot -> Robot
(define (robot-left robot-obj)
  (make-robot (robot-x robot-obj)
              (robot-y robot-obj)
              "w"))

(robot-north?)

;; Does robot-obj face north?
;; Robot -> Boolean
(define (robot-north? robot-obj)
  (string=? (robot-direction robot-obj) "n"))

现在,要将这些功能合并到您的代码中,您需要确保将数据和输出图像的概念分开,而这些概念当前不是。

(initial-robot)根本不应该渲染。它应该只返回一个Robot实例,如我们的数据定义中所定义。

请注意,此作业分配中给出的规范要求您完全渲染。这将是一项单独的任务。他们要求您定义的所有函数都严格处理数据。之后,您可以考虑渲染以直观地测试您的功能,作为您应该为每个功能创建的单元测试的额外功能。

我提供给您的代码应该是一个很好的起点,可以确定如何设计其余的功能。不要担心渲染到最后!不要忘记在提及Robot的作业分配中给出的每个签名都引用了我们为我们的机器人结构创建的数据定义。