2015-04-13 2 views
0

У меня есть следующее назначение.Схема let-form

В этой реализации, вы должны использовать LET-форму, чтобы определить локальное имя и местные процедуры 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-формы, чтобы изменить код. Я понимаю, как пусть-форма работы, и я понимаю, что для PI я могу просто использовать:

(let 
    (
    (PI 3.14159265) 
) 
(body) 
) 

Может кто-нибудь вести меня в правильном направлении для этой проблемы?

+5

Ваш одноклассник был точно такой же вопрос: HTTP: // stackoverflow.com/questions/29576357/convert-from-procedure-form-to-let-form –

+0

Извините, я не видел дубликат раньше: / –

ответ

0

Ключевым моментом здесь является то, что некоторые из определений зависят от предыдущих определений (например: volumec нуждается areac и PI), так что мы должны гнездиться привязок и определить функции, используя lambda с. Вот как:

(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)))) 
Смежные вопросы