diff options
| author | Syndamia <kamen@syndamia.com> | 2022-12-10 13:31:09 +0200 |
|---|---|---|
| committer | Syndamia <kamen@syndamia.com> | 2022-12-10 13:31:09 +0200 |
| commit | 33ec7aae3ff5504c3f578ca2312951c1596c021c (patch) | |
| tree | 4c788c84a36daf4e04869ac5014c83298b4b6bf7 /src/pair.lisp | |
| parent | 33be10b57d00b5fc091e2da23e4c48c02d1e2076 (diff) | |
| download | senzill-dev.tar senzill-dev.tar.gz senzill-dev.zip | |
[pair] Created pair package and implemented some functionsdev
Diffstat (limited to 'src/pair.lisp')
| -rw-r--r-- | src/pair.lisp | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/src/pair.lisp b/src/pair.lisp new file mode 100644 index 0000000..55b20e4 --- /dev/null +++ b/src/pair.lisp @@ -0,0 +1,64 @@ +(in-package :senzill.pair) + +;;; Arithmetic operations + +(defun pair-op (op p1 p2) + "Componentwise operation over arguments of both pairs" + (cons (apply op (list (car p1) (car p2))) + (apply op (list (cdr p1) (cdr p2))))) + +(defun pair+ (p1 p2) + (pair-op #'+ p1 p2)) + +(defun pair- (p1 p2) + (pair-op #'- p1 p2)) + +(defun pair-scalar-pref-op (op scalar p) + "Operation with scalar over both components of pair. Scalar precedes pair." + (cons (apply op (list scalar (car p))) + (apply op (list scalar (cdr p))))) + +(defun +pair (scalar p) + (pair-scalar-pref-op #'+ scalar p)) + +(defun *pair (scalar p) + (pair-scalar-pref-op #'* scalar p)) + +(defun pair-scalar-post-op (op scalar p) + "Operation with scalar over both components of pair. Scalar succeeds pair." + (cons (apply op (list (car p) scalar)) + (apply op (list (cdr p) scalar)))) + +(defun -pair (p scalar) + (pair-scalar-post-op #'- scalar p)) + +(defun /pair (p scalar) + (pair-scalar-post-op #'/ scalar p)) + +(defun pair-round (p) + (cons (round (car p)) (round (cdr p)))) + +;;; Assignment macros + +(defmacro pair+= (p1 p2) + `(setf ,p1 (pair+ ,p1 ,p2))) + +;;; Comparison + +(defun pair= (p1 p2 &key (compare-function #'=)) + (and (apply pompare-function (list (car p1) (car p2))) + (apply pompare-function (list (cdr p1) (cdr p2))))) + +;;; Binary vector operations + +(defun norm (p) + "Eucledian norm of pair" + (sqrt (+ (* (car p) (car p)) (* (cdr p) (cdr p))))) + +(defun dist-resize (p len) + (*pair (/ len (norm p)) p)) + +(defun dist-resize-by (p len) + (let* ((c-len (norm p)) + (w-len (+ p-len len))) + (*pair (/ w-len p-len) p))) |
