summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorElizabeth Hunt <elizabeth.hunt@simponic.xyz>2023-09-07 12:19:32 -0600
committerElizabeth Hunt <elizabeth.hunt@simponic.xyz>2023-09-07 12:19:32 -0600
commit9fcd733232b6f209519d2eadc83ed4cbd3376e0d (patch)
tree0b4dfead39515c11c5aa4a998ffc3683546eef65
parentdadf03afa37c785d5bb68396381eb3105178847f (diff)
downloadcmath-9fcd733232b6f209519d2eadc83ed4cbd3376e0d.tar.gz
cmath-9fcd733232b6f209519d2eadc83ed4cbd3376e0d.zip
common lisp!
-rw-r--r--cl/lizfcm.asd29
-rw-r--r--cl/src/approx/derivative.lisp8
-rw-r--r--cl/src/approx/package.lisp4
-rw-r--r--cl/src/utils/package.lisp4
-rw-r--r--cl/src/utils/within-range.lisp5
-rw-r--r--cl/tests/approx.lisp23
-rw-r--r--cl/tests/suite.lisp10
7 files changed, 83 insertions, 0 deletions
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")