;;; 4.11b2.scm ;;; 2016-04-02 (use gauche.sequence) ; for 'map-with-index' procedure (define (main args) ; initialize and input (define x '(-40 10 10 10 10 10 10 )) ; cash flow stream (define s '( 0 5.0 5.3 5.6 5.8 6.0 6.1)) ; spot rate (define f '()) ; forward rate (define d '()) ; discount factor (define (p k x d) ; recursive procedure (if (= k (- (length x) 1)) (ref x k) (+ (ref x k) (* (ref d (+ k 1)) (p (+ k 1) x d))) ) ) (define fmt "") (define (fix x n) (/ (round (* x (expt 10 n))) (expt 10 n))) ; calculate (set! s (map (lambda (x) (/ x 100)) s)) (set! f (map-with-index (lambda (i x) (cond ((= i 0) 0) (else (- (/ (expt (+ 1 (ref s i)) i) (expt (+ 1 (ref s (- i 1))) (- i 1)) ) 1) ) ) ) s ) ) (set! d (map (lambda (x) (/ (+ 1 x))) f)) ;output (print "4.11b2.scm") (print "input") (format #t "~10a ~10a ~10a ~10a ~10a\n" "k" "x[k]" "s[k]" "f[k-1,k]" "d[k-1,k]" ) (print "----------" "----------" "----------" "----------" "----------") (for-each (lambda (i j k l m) (format #t "~10a ~10a ~10a ~10a ~10a\n" i j (fix k 3) (fix l 3) (fix m 3))) (iota 7) x s f d) (print "----------" "----------" "----------" "----------" "----------") (print "output") (print "pv= " (fix (p 0 x d) 3) " (by running present value)") 0) ;;; end