SICP Exercise 1.3 request for comments

后端 未结 17 1688
耶瑟儿~
耶瑟儿~ 2020-12-08 21:06

I\'m trying to learn scheme via SICP. Exercise 1.3 reads as follow: Define a procedure that takes three numbers as arguments and returns the sum of the squares of the two la

17条回答
  •  情书的邮戳
    2020-12-08 21:28

    Here's yet another way to do it:

    #!/usr/bin/env mzscheme
    #lang scheme/load
    
    (module ex-1.3 scheme/base
      (define (ex-1.3 a b c)
        (let* ((square (lambda (x) (* x x)))
               (p (lambda (a b c) (+ (square a) (square (if (> b c) b c))))))
          (if (> a b) (p a b c) (p b a c))))
    
      (require scheme/contract)
      (provide/contract [ex-1.3 (-> number? number? number? number?)]))
    
    ;; tests
    (module ex-1.3/test scheme/base
      (require (planet "test.ss" ("schematics" "schemeunit.plt" 2))
               (planet "text-ui.ss" ("schematics" "schemeunit.plt" 2)))
      (require 'ex-1.3)
    
      (test/text-ui
       (test-suite
        "ex-1.3"
        (test-equal? "1 2 3" (ex-1.3 1 2 3) 13)
        (test-equal? "2 1 3" (ex-1.3 2 1 3) 13)
        (test-equal? "2 1. 3.5" (ex-1.3 2 1. 3.5) 16.25)
        (test-equal? "-2 -10. 3.5" (ex-1.3 -2 -10. 3.5) 16.25)
        (test-exn "2+1i 0 0" exn:fail:contract? (lambda () (ex-1.3 2+1i 0 0)))
        (test-equal? "all equal" (ex-1.3 3 3 3) 18))))
    
    (require 'ex-1.3/test)
    

    Example:

    $ mzscheme ex-1.3.ss
    6 success(es) 0 failure(s) 0 error(s) 6 test(s) run
    0
    

提交回复
热议问题