1

我目前正在完成htdp 书的第 7 章,并正在尝试创建蜘蛛结构的实例:

#lang racket
;; spider-structure: structure -> ???
;; defines a spider structure with two parameters: legs and volume
(define-struct spider (legs volume))
;; spidercheck: lambda -> num
;; creates a spider check function and determines volume based on legs
(define spidercheck
 (lambda (legs)
  (cond
   ((<= legs 4) 800)
   ((> legs 4) 1000))))
(define a-spider
 (make-spider 4
              (spidercheck ...

我的问题是我想将数字从函数中传递(make-spider 4)给函数。我试过了,但当然它说它是在定义之前使用的。任何帮助表示赞赏。spiderchecka-spider(spider-legs a-spider)

谢谢!

4

2 回答 2

2

一个简单的解决方案是使用相同的参数调用make-spiderspidercheck,比如说数字2

(define spiderman (make-spider 2 (spidercheck 2)))

一个更有趣的替代方案是定义一个新函数,该函数强制执行相同的限制,即n腿的数量,作为参数传递给make-spiderspider check

(define a-spider
  (lambda (n)
    (make-spider n (spidercheck n))))

现在,无论何时你想创建一个蜘蛛,你都可以只指定腿的数量作为参数,然后spidercheck计算体积。另请注意,您可以使用隐含的define语法进一步简化上述代码段:lambda

(define (a-spider n)
  (make-spider n (spidercheck n)))

无论哪种方式,要创建一个新的蜘蛛(例如,有8腿),请执行以下操作:

(define charlotte (a-spider 8))
于 2014-02-15T20:31:46.350 回答
0

尝试以这种方式使用let和重用该号码4。我不太确定这本书是如何处理蜘蛛的,但你可能需要这种模式:

(define a-spider
  (let ([a-legs 4])
    (make-spider a-legs (spidercheck a-legs))))

这个答案不如奥斯卡的答案,因为它硬编码了蜘蛛的腿数。但它确实显示了一种多次引用值的方法。

于 2014-02-15T20:21:40.803 回答