X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=scm%2Flily-library.scm;h=05875b2da2ec5915d7d4c99ae5c89489e9a13986;hb=HEAD;hp=0bfce9eb0c8a748099b3af053cf29d822de8a4b6;hpb=e860e146ccecf07d42aa53de885916931950245e;p=lilypond.git diff --git a/scm/lily-library.scm b/scm/lily-library.scm index 0bfce9eb0c..05875b2da2 100644 --- a/scm/lily-library.scm +++ b/scm/lily-library.scm @@ -707,13 +707,16 @@ right (@var{dir}=+1)." (define-public (coord-scale coordinate amount) (coord-operation * amount coordinate)) -(define-public (coord-rotate coordinate angle) - (let ((c (cos angle)) - (s (sin angle)) - (x (coord-x coordinate)) - (y (coord-y coordinate))) - (cons (- (* c x) (* s y)) - (+ (* s x) (* c y))))) +(define-public (coord-rotate coordinate angle-in-radians) + (coord-rotated coordinate (/ angle-in-radians PI-OVER-180))) + +(define-public (coord-rotated coordinate direction) + ;; Same, in degrees or with a given direction + (let ((dir (ly:directed direction))) + (cons (- (* (car dir) (car coordinate)) + (* (cdr dir) (cdr coordinate))) + (+ (* (car dir) (cdr coordinate)) + (* (cdr dir) (car coordinate)))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; trig @@ -728,11 +731,11 @@ right (@var{dir}=+1)." (define-public (cyclic-base-value value cycle) "Take @var{value} and modulo-maps it between 0 and base @var{cycle}." - (if (< value 0) - (cyclic-base-value (+ value cycle) cycle) - (if (>= value cycle) - (cyclic-base-value (- value cycle) cycle) - value))) + (cond ((< value 0) + (cyclic-base-value (+ value cycle) cycle)) + ((>= value cycle) + (cyclic-base-value (- value cycle) cycle)) + (else value))) (define-public (angle-0-2pi angle) "Take @var{angle} (in radians) and maps it between 0 and 2pi." @@ -759,14 +762,8 @@ right (@var{dir}=+1)." (define-public (polar->rectangular radius angle-in-degrees) "Return polar coordinates (@var{radius}, @var{angle-in-degrees}) -as rectangular coordinates @ode{(x-length . y-length)}." - - (let ((complex (make-polar - radius - (degrees->radians angle-in-degrees)))) - (cons - (real-part complex) - (imag-part complex)))) +as rectangular coordinates @code{(x-length . y-length)}." + (ly:directed angle-in-degrees radius)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; string @@ -781,9 +778,9 @@ as rectangular coordinates @ode{(x-length . y-length)}." (define-public (remove-whitespace strg) "Remove characters satisfying @code{char-whitespace?} from string @var{strg}" - (string-delete - strg - char-whitespace?)) + (if (guile-v2) + (string-delete char-whitespace? strg) + (string-delete strg char-whitespace?))) (define-public (string-encode-integer i) (cond @@ -891,6 +888,29 @@ and will be applied to NUM." (fancy-format #f (car custom-format) num)) (else (fancy-format #f "~(~@r~)" num)))) +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; lilypond version + +(define (lexicographic-list-compare? op a b) + "Lexicographically compare two lists @var{a} and @var{b} using + the operator @var{op}. The types of the list elements have to + be comparable with @var{op}. If the lists are of different length + the trailing elements of the longer list are ignored." + (let* ((ca (car a)) + (iseql (op ca ca))) + (let loop ((ca ca) (cb (car b)) (a (cdr a)) (b (cdr b))) + (let ((axb (op ca cb))) + (if (and (pair? a) (pair? b) + (eq? axb iseql (op cb ca))) + (loop (car a) (car b) (cdr a) (cdr b)) + axb))))) + +(define (ly:version? op ver) + "Using the operator @var{op} compare the currently executed LilyPond + version with a given version @var{ver} which is passed as a list of + numbers." + (lexicographic-list-compare? op (ly:version) ver)) + ;;;;;;;;;;;;;;;; ;; other