Add function to interest-compounder
This commit is contained in:
		
							parent
							
								
									5f10396af8
								
							
						
					
					
						commit
						e9fead08c2
					
				@ -7,74 +7,97 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
      (defun principal-initialized ()
 | 
					      (defun principal-initialized ()
 | 
				
			||||||
        (setf compounder (interest-compounder 1000 0))
 | 
					        (setf compounder (interest-compounder 1000 0))
 | 
				
			||||||
        (assert= 1000 (funcall compounder :get-principal)))
 | 
					        (assert= 1000 (call compounder :get-principal)))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      (defun interest-rate-initialized ()
 | 
					      (defun interest-rate-initialized ()
 | 
				
			||||||
        (setf compounder (interest-compounder 0 10))
 | 
					        (setf compounder (interest-compounder 0 10))
 | 
				
			||||||
        (assert= 10 (funcall compounder :get-interest-rate)))
 | 
					        (assert= 10 (call compounder :get-interest-rate)))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      (defun many-years-with-no-interest-rate ()
 | 
					      (defun many-years-with-no-interest-rate ()
 | 
				
			||||||
        (setf compounder (interest-compounder 1000 0))
 | 
					        (setf compounder (interest-compounder 1000 0))
 | 
				
			||||||
        (funcall compounder :move-forward-years 83)
 | 
					        (call compounder :move-forward-years 83)
 | 
				
			||||||
        (assert= 1000 (funcall compounder :get-principal)))
 | 
					        (assert= 1000 (call compounder :get-principal)))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      (defun no-years-with-positive-interest-rate ()
 | 
					      (defun no-years-with-positive-interest-rate ()
 | 
				
			||||||
        (setf compounder (interest-compounder 1000 10))
 | 
					        (setf compounder (interest-compounder 1000 10))
 | 
				
			||||||
        (assert= 1000 (funcall compounder :get-principal)))
 | 
					        (assert= 1000 (call compounder :get-principal)))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      (defun one-year-with-positive-interest-rate ()
 | 
					      (defun one-year-with-positive-interest-rate ()
 | 
				
			||||||
        (setf compounder (interest-compounder 100000 5))
 | 
					        (setf compounder (interest-compounder 100000 5))
 | 
				
			||||||
        (funcall compounder :move-forward-one-year)
 | 
					        (call compounder :move-forward-years 1)
 | 
				
			||||||
        (assert= 105000 (funcall compounder :get-principal)))
 | 
					        (assert= 105000 (call compounder :get-principal)))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      (defun two-years-with-positive-interest-rate ()
 | 
					      (defun two-years-with-positive-interest-rate ()
 | 
				
			||||||
        (setf compounder (interest-compounder 100000 5))
 | 
					        (setf compounder (interest-compounder 100000 5))
 | 
				
			||||||
        (funcall compounder :move-forward-one-year)
 | 
					        (call compounder :move-forward-years 2)
 | 
				
			||||||
        (funcall compounder :move-forward-one-year)
 | 
					        (assert= 110250 (call compounder :get-principal)))
 | 
				
			||||||
        (assert= 110250 (funcall compounder :get-principal)))
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
      (defun three-years-with-positive-interest-rate ()
 | 
					      (defun three-years-with-positive-interest-rate ()
 | 
				
			||||||
        (setf compounder (interest-compounder 100000 5))
 | 
					        (setf compounder (interest-compounder 100000 5))
 | 
				
			||||||
        (funcall compounder :move-forward-years 3)
 | 
					        (call compounder :move-forward-years 3)
 | 
				
			||||||
        (assert= 115763 (funcall compounder :get-principal)))
 | 
					        (assert= 115763 (call compounder :get-principal)))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      (defun four-years-with-positive-interest-rate ()
 | 
					      (defun four-years-with-positive-interest-rate ()
 | 
				
			||||||
        (setf compounder (interest-compounder 100000 5))
 | 
					        (setf compounder (interest-compounder 100000 5))
 | 
				
			||||||
        (funcall compounder :move-forward-years 4)
 | 
					        (call compounder :move-forward-years 4)
 | 
				
			||||||
        (assert= 121551 (funcall compounder :get-principal)))
 | 
					        (assert= 121551 (call compounder :get-principal)))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      (defun one-year-with-negative-interest-rate ()
 | 
					      (defun one-year-with-negative-interest-rate ()
 | 
				
			||||||
        (setf compounder (interest-compounder 100000 -5))
 | 
					        (setf compounder (interest-compounder 100000 -5))
 | 
				
			||||||
        (funcall compounder :move-forward-years 1)
 | 
					        (call compounder :move-forward-years 1)
 | 
				
			||||||
        (assert= 95000 (funcall compounder :get-principal)))
 | 
					        (assert= 95000 (call compounder :get-principal)))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      (defun two-years-with-negative-interest-rate ()
 | 
					      (defun two-years-with-negative-interest-rate ()
 | 
				
			||||||
        (setf compounder (interest-compounder 100000 -5))
 | 
					        (setf compounder (interest-compounder 100000 -5))
 | 
				
			||||||
        (funcall compounder :move-forward-years 2)
 | 
					        (call compounder :move-forward-years 2)
 | 
				
			||||||
        (assert= 90250 (funcall compounder :get-principal)))
 | 
					        (assert= 90250 (call compounder :get-principal)))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      (defun three-years-with-negative-interest-rate ()
 | 
					      (defun three-years-with-negative-interest-rate ()
 | 
				
			||||||
        (setf compounder (interest-compounder 100000 -5))
 | 
					        (setf compounder (interest-compounder 100000 -5))
 | 
				
			||||||
        (funcall compounder :move-forward-years 3)
 | 
					        (call compounder :move-forward-years 3)
 | 
				
			||||||
        (assert= 85737 (funcall compounder :get-principal)))
 | 
					        (assert= 85737 (call compounder :get-principal)))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      (defun four-years-with-negative-interest-rate ()
 | 
					      (defun four-years-with-negative-interest-rate ()
 | 
				
			||||||
        (setf compounder (interest-compounder 100000 -5))
 | 
					        (setf compounder (interest-compounder 100000 -5))
 | 
				
			||||||
        (funcall compounder :move-forward-years 4)
 | 
					        (call compounder :move-forward-years 4)
 | 
				
			||||||
        (assert= 81450 (funcall compounder :get-principal)))
 | 
					        (assert= 81450 (call compounder :get-principal)))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      (defun negative-number-of-years-does-nothing ()
 | 
					      (defun negative-number-of-years-does-nothing ()
 | 
				
			||||||
        (setf compounder (interest-compounder 100000 5))
 | 
					        (setf compounder (interest-compounder 100000 5))
 | 
				
			||||||
        (funcall compounder :move-forward-years -4)
 | 
					        (call compounder :move-forward-years -4)
 | 
				
			||||||
        (assert= 100000 (funcall compounder :get-principal))
 | 
					        (assert= 100000 (call compounder :get-principal))
 | 
				
			||||||
        (funcall compounder :move-forward-years 1)
 | 
					        (call compounder :move-forward-years 1)
 | 
				
			||||||
        (funcall compounder :move-forward-years -4)
 | 
					        (call compounder :move-forward-years -4)
 | 
				
			||||||
        (assert= 105000 (funcall compounder :get-principal)))
 | 
					        (assert= 105000 (call compounder :get-principal)))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      (defun zero-number-of-years-does-nothing ()
 | 
					      (defun zero-number-of-years-does-nothing ()
 | 
				
			||||||
        (setf compounder (interest-compounder 100000 5))
 | 
					        (setf compounder (interest-compounder 100000 5))
 | 
				
			||||||
        (funcall compounder :move-forward-years 0)
 | 
					        (call compounder :move-forward-years 0)
 | 
				
			||||||
        (assert= 100000 (funcall compounder :get-principal))
 | 
					        (assert= 100000 (call compounder :get-principal))
 | 
				
			||||||
        (funcall compounder :move-forward-years 1)
 | 
					        (call compounder :move-forward-years 1)
 | 
				
			||||||
        (funcall compounder :move-forward-years 0)
 | 
					        (call compounder :move-forward-years 0)
 | 
				
			||||||
        (assert= 105000 (funcall compounder :get-principal))))))
 | 
					        (assert= 105000 (call compounder :get-principal)))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      (defun variable-interest-rate ()
 | 
				
			||||||
 | 
					        (setf compounder (interest-compounder 100000 5))
 | 
				
			||||||
 | 
					        (call compounder :move-forward-years 2)
 | 
				
			||||||
 | 
					        (call compounder :set-interest-rate 10)
 | 
				
			||||||
 | 
					        (call compounder :move-forward-years 2)
 | 
				
			||||||
 | 
					        (assert= 133403 (call compounder :get-principal)))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      (defun years-are-updated ()
 | 
				
			||||||
 | 
					        (setf compounder (interest-compounder 100000 5))
 | 
				
			||||||
 | 
					        (call compounder :move-forward-years 27)
 | 
				
			||||||
 | 
					        (assert= 27 (call compounder :get-years-passed)))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      (defun negative-number-of-years-does-not-update-years ()
 | 
				
			||||||
 | 
					        (setf compounder (interest-compounder 100000 5))
 | 
				
			||||||
 | 
					        (call compounder :move-forward-years 27)
 | 
				
			||||||
 | 
					        (call compounder :move-forward-years -2)
 | 
				
			||||||
 | 
					        (assert= 27 (call compounder :get-years-passed)))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      (defun zero-number-of-years-does-not-update-years ()
 | 
				
			||||||
 | 
					        (setf compounder (interest-compounder 100000 5))
 | 
				
			||||||
 | 
					        (call compounder :move-forward-years 27)
 | 
				
			||||||
 | 
					        (call compounder :move-forward-years 0)
 | 
				
			||||||
 | 
					        (assert= 27 (call compounder :get-years-passed))))))
 | 
				
			||||||
 | 
				
			|||||||
@ -3,12 +3,17 @@
 | 
				
			|||||||
(defun interest-compounder (initial-principal initial-interest-rate)
 | 
					(defun interest-compounder (initial-principal initial-interest-rate)
 | 
				
			||||||
  (let ((private) (public)
 | 
					  (let ((private) (public)
 | 
				
			||||||
        (principal initial-principal)
 | 
					        (principal initial-principal)
 | 
				
			||||||
        (interest-rate initial-interest-rate))
 | 
					        (interest-rate initial-interest-rate)
 | 
				
			||||||
 | 
					        (years-passed 0))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    (setf private
 | 
					    (setf private
 | 
				
			||||||
      (eval
 | 
					      (eval
 | 
				
			||||||
        (dlambda
 | 
					        (dlambda
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          (:add-years (years)
 | 
				
			||||||
 | 
					            (if (> years 0)
 | 
				
			||||||
 | 
					              (setf years-passed (+ years-passed years))))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
          (:percent-of-number (n percentage)
 | 
					          (:percent-of-number (n percentage)
 | 
				
			||||||
            (if (> percentage 0)
 | 
					            (if (> percentage 0)
 | 
				
			||||||
              (/ (+ (* n percentage) 50) 100)
 | 
					              (/ (+ (* n percentage) 50) 100)
 | 
				
			||||||
@ -26,14 +31,19 @@
 | 
				
			|||||||
      (eval
 | 
					      (eval
 | 
				
			||||||
        (dlambda
 | 
					        (dlambda
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          (:get-years-passed ()
 | 
				
			||||||
 | 
					            years-passed)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
          (:get-principal ()
 | 
					          (:get-principal ()
 | 
				
			||||||
            principal)
 | 
					            principal)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
          (:get-interest-rate ()
 | 
					          (:get-interest-rate ()
 | 
				
			||||||
            interest-rate)
 | 
					            interest-rate)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
          (:move-forward-one-year ()
 | 
					          (:set-interest-rate (new-interest-rate)
 | 
				
			||||||
            (call private :compound-interest 1))
 | 
					            (setf interest-rate new-interest-rate))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
          (:move-forward-years (years)
 | 
					          (:move-forward-years (years)
 | 
				
			||||||
            (call private :compound-interest years)))))))
 | 
					            (progn
 | 
				
			||||||
 | 
					              (call private :add-years years)
 | 
				
			||||||
 | 
					              (call private :compound-interest years))))))))
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user