我有以下任务。
在此实现中,您必须使用let-form来定义本地名称和 PI,areac和volumec的本地过程。程序 TotalVolume和main仍然是全球性的。
我有问题3中创建的程序:
(define PI 3.14159265)
(define (areac d)
(* (* PI (/ d 2)) (/ d 2)))
(define (volumec d h)
(let ((a (areac d)))
(/ (* a h) 3)))
(define (TotalVolume)
(let ((v1 (volumec 1 1))
(v2 (volumec 2 2))
(v3 (volumec 3 3))
(v4 (volumec 4 4))
(v5 (volumec 5 5)))
(display (+ v1 v2 v3 v4 v5))))
(define main
(TotalVolume))
但现在我对如何使用let-form更改代码感到困惑。我理解let-form是如何工作的,我理解对于PI我可以使用:
(let
(
(PI 3.14159265)
)
(body)
)
任何人都可以指导我解决这个问题的正确方向吗?
答案 0 :(得分:0)
这里的关键点是某些定义取决于之前的定义(例如:volumec
需要areac
和PI
),因此我们需要嵌套绑定并定义函数使用lambda
s。方法如下:
(define (TotalVolume)
(let ((PI 3.14159265))
(let ((areac (lambda (d) (* (* PI (/ d 2)) (/ d 2)))))
(let ((volumec (lambda (d h) (/ (* (areac d) h) 3))))
(let ((v1 (volumec 1 1))
(v2 (volumec 2 2))
(v3 (volumec 3 3))
(v4 (volumec 4 4))
(v5 (volumec 5 5)))
(display (+ v1 v2 v3 v4 v5)))))))
更简单的方法是使用let*
,它允许我们定义依赖于先前定义的变量的绑定:
(define (TotalVolume)
(let* ((PI 3.14159265)
(areac (lambda (d) (* (* PI (/ d 2)) (/ d 2))))
(volumec (lambda (d h) (/ (* (areac d) h) 3)))
(v1 (volumec 1 1))
(v2 (volumec 2 2))
(v3 (volumec 3 3))
(v4 (volumec 4 4))
(v5 (volumec 5 5)))
(display (+ v1 v2 v3 v4 v5))))