inconsistency functions angle-between-vectors and angle-between-vectors-d
Created by: reiniervandijk
1581: there is inconsistency between functions geom-base:angle-between-vectors and geom-base:angle-between-vectors-d. They should have the same arglist, however they don't. Names differ, use of optional / key differs, but most importantly: geom-base:angle-between-vectors-d does not have an epsilon input. I guess you won't expect the user to go for let-binding zero-epsilon approach, right? :)
Imported comments:
By genworks on 2015-01-29 23:16:15 UTC
Open for submissions: $100.
Any changes here have to be done in such a way to support legacy code without rewriting it.
By reiniervandijk on 2015-01-30 12:36:40 UTC
Code below makes angle-between-vectors-d
compatible with angle-between-vectors
. The function still supports legacy code that invokes (vector-1 vector-2 &optional reference-vector negative?)
, and prints an optional warning message. Different note, angle-between-vectors
contained a bug on its own, will open (and close) in new thread.
(in-package :geom-base)
(defparameter *print-deprecated-warnings?* nil)
(defun angle-between-vectors-d (vector-1 vector-2 &optional reference-vector &rest more)
"Number. This function is identical to angle-between-vectors, but returns the angle in degrees.
Refer to angle-between-vectors for more information.
Technical note: the <b>more</b> argument has been introduced to support both
angle-between-vectors call conventions and the legacy signature:
(vector-1 vector-2 &optional reference-vector negative?)
Optionally, a deprecation warning is printed when code invokes this legacy pattern.."
;; resolve &rest arguments.
(let ((arglist
(let ((L (length more)))
(cond ((= L 1)
;; legacy signature:
;; (vector-1 vector-2 &optional reference-vector negative?)
(when *print-deprecated-warnings?*
(warn "negative? argument for angle-between-vectors-d is deprecated. Use :-ve instead."))
(list vector-1 vector-2 reference-vector :-ve (first more)))
((evenp L)
;; angle-between-vectors signature:
;; (vector-1 vector-2 &optional reference-vector &key (epsilon *zero-epsilon*) -ve)
(nconc (list vector-1 vector-2 reference-vector) more))
(t
;; not allowed.
(error (format nil "angle-between-vectors-d received invalid arguments: ~a"
(nconc (list vector-1 vector-2 reference-vector) more))))))))
(radians-to-degrees
(apply #'angle-between-vectors arglist))
))
By reiniervandijk on 2015-01-30 15:40:58 UTC
Small remark: use of nconc
is safe here. If you don't want it, use append
instead.
By genworks on 2015-03-11 19:59:17 UTC
Merged slightly modified version of this fix into devo branch.