From 9fcd733232b6f209519d2eadc83ed4cbd3376e0d Mon Sep 17 00:00:00 2001 From: Elizabeth Hunt Date: Thu, 7 Sep 2023 12:19:32 -0600 Subject: [PATCH] common lisp! --- cl/lizfcm.asd | 29 +++++++++++++++++++++++++++++ cl/src/approx/derivative.lisp | 8 ++++++++ cl/src/approx/package.lisp | 4 ++++ cl/src/utils/package.lisp | 4 ++++ cl/src/utils/within-range.lisp | 5 +++++ cl/tests/approx.lisp | 23 +++++++++++++++++++++++ cl/tests/suite.lisp | 10 ++++++++++ 7 files changed, 83 insertions(+) create mode 100644 cl/lizfcm.asd create mode 100644 cl/src/approx/derivative.lisp create mode 100644 cl/src/approx/package.lisp create mode 100644 cl/src/utils/package.lisp create mode 100644 cl/src/utils/within-range.lisp create mode 100644 cl/tests/approx.lisp create mode 100644 cl/tests/suite.lisp diff --git a/cl/lizfcm.asd b/cl/lizfcm.asd new file mode 100644 index 0000000..9e91eb0 --- /dev/null +++ b/cl/lizfcm.asd @@ -0,0 +1,29 @@ +(asdf:defsystem "lizfcm" + :version "0.1.0" + :author "Elizabeth Hunt" + :license "MIT" + :components ((:module "src" + :components + ((:module "utils" + :components + ((:file "within-range" :depends-on ("package")) + (:file "package"))) + (:module "approx" + :components + ((:file "derivative" :depends-on ("package")) + (:file "package"))))))) + + +(asdf:defsystem "lizfcm/tests" + :author "Elizabeth Hunt" + :license "MIT" + :depends-on (:fiveam + :lizfcm) + :components ((:module "tests" + :components + ((:file "approx" :depends-on ("suite")) + (:file "suite")))) + :perform (asdf:test-op (o c) (uiop:symbol-call + :fiveam :run! + (uiop:find-symbol* :lizfcm-test-suite :lizfcm/tests)))) + diff --git a/cl/src/approx/derivative.lisp b/cl/src/approx/derivative.lisp new file mode 100644 index 0000000..280463f --- /dev/null +++ b/cl/src/approx/derivative.lisp @@ -0,0 +1,8 @@ +(in-package :lizfcm.approx) + +(defun derivative-at (f x &optional (delta 0.01)) + (let* ((x2 (+ x delta)) + (x1 (- x delta)) + (y2 (apply f (list x2))) + (y1 (apply f (list x1)))) + (/ (- y2 y1) (- x2 x1)))) diff --git a/cl/src/approx/package.lisp b/cl/src/approx/package.lisp new file mode 100644 index 0000000..60dd0bb --- /dev/null +++ b/cl/src/approx/package.lisp @@ -0,0 +1,4 @@ +(in-package :cl-user) +(defpackage lizfcm.approx + (:use :cl) + (:export :derivative-at)) diff --git a/cl/src/utils/package.lisp b/cl/src/utils/package.lisp new file mode 100644 index 0000000..0436a94 --- /dev/null +++ b/cl/src/utils/package.lisp @@ -0,0 +1,4 @@ +(in-package :cl-user) +(defpackage lizfcm.utils + (:use :cl) + (:export :within-range-p)) diff --git a/cl/src/utils/within-range.lisp b/cl/src/utils/within-range.lisp new file mode 100644 index 0000000..9a0b762 --- /dev/null +++ b/cl/src/utils/within-range.lisp @@ -0,0 +1,5 @@ +(in-package :lizfcm.utils) + +(defun within-range-p (x true-value delta) + (and (< x (+ true-value delta)) + (> x (- true-value delta)))) diff --git a/cl/tests/approx.lisp b/cl/tests/approx.lisp new file mode 100644 index 0000000..a458e66 --- /dev/null +++ b/cl/tests/approx.lisp @@ -0,0 +1,23 @@ +(defpackage lizfcm/tests.approx + (:use :cl + :fiveam + :lizfcm.approx + :lizfcm.utils + :lizfcm/tests) + (:export :approx-suite)) +(in-package :lizfcm/tests.approx) + +(def-suite approx-suite + :in lizfcm-test-suite) +(in-suite approx-suite) + +(test derivative-at + :description "derivative at is within bounds" + (let ((f (lambda (x) (* x x))) + (x 2) + (f-prime-at-x 4) + (delta 0.01)) + (is (within-range-p + (derivative-at f x delta) + f-prime-at-x + 0.1)))) diff --git a/cl/tests/suite.lisp b/cl/tests/suite.lisp new file mode 100644 index 0000000..e23cfaf --- /dev/null +++ b/cl/tests/suite.lisp @@ -0,0 +1,10 @@ +(in-package :cl-user) +(defpackage lizfcm/tests + (:use :cl + :fiveam) + (:export :run! + :lizfcm-test-suite)) +(in-package :lizfcm/tests) + +(def-suite lizfcm-test-suite + :description "The ultimate parent test suite")