方案让形式

Scheme let-form

我有以下作业。

In this implementation, you must use let-form to define local name and local procedures for PI, areac, and volumec. The procedures TotalVolume and main remain to be global.

我这里有问题 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)
)

谁能指导我解决这个问题的正确方向?

这里的重点是有些定义依赖于之前的定义(例如:volumec需要areacPI),所以我们需要嵌套绑定和使用 lambdas 定义函数。方法如下:

(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))))