Functional programming 使用结构中实例化的参数

Functional programming 使用结构中实例化的参数,functional-programming,scheme,racket,htdp,Functional Programming,Scheme,Racket,Htdp,我目前正在完成的第7章,并试图创造 spider结构的一个实例: #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

我目前正在完成的第7章,并试图创造 spider结构的一个实例:

#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 ...
#朗球拍
;; 星形结构:结构->???
;; 使用两个参数定义星形结构:支腿和体积
(定义结构三脚架(体积))
;; 蜘蛛检查:lambda->num
;; 创建一个spider check函数,并根据支腿确定音量
(定义蜘蛛网检查
(lambda(腿)
(续)
((腿4)1000)))
(定义a-spider)
(制作蜘蛛4
(蜘蛛网)。。。
我的问题是,我想将编号从
(make spider 4)
传递到
a-spider
函数中的
spidercheck
函数。我已经尝试过
(spider legs a-spider)
,但它当然说它是在定义之前使用的。非常感谢您的帮助


谢谢!

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

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

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

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

(define spiderman (make-spider 2 (spidercheck 2)))
一个更有趣的替代方法是定义一个新函数,该函数强制将相同的
n
(支腿数)作为
make spider
spider check
的参数传递:

(define a-spider
  (lambda (n)
    (make-spider n (spidercheck n))))
现在,无论何时您想要创建一个spider,您都可以将支腿的数量指定为参数,并让
spidercheck
负责计算体积。还请注意,您可以使用
define
语法进一步简化上述代码段,该语法使
lambda
隐式:

(define (a-spider n)
  (make-spider n (spidercheck n)))
无论哪种方式,要创建新的spider(例如,使用
8
legs),请执行以下操作:


你的答案更清晰了。+1是的,我刚刚注意到并修复了它。谢谢!非常感谢!这非常有效。这是一个如此简单但强大的解决方案。谢谢奥斯卡!虽然我不是昆虫学家,但你不想
(定义(蜘蛛?腿)(=腿8))
?;)@GregHendershott也有两条腿的蜘蛛。我想到了一个彼得·帕克:P
(define charlotte (a-spider 8))