Mark Polesky wrote:
> Incidentally, I found I could simplify these with "filter":

Here's a proposal:

Here are two generic functions that could be incorporated into IR
4 "Scheme functions" (though if C++ is required, someone else
would have to help).

________________________

(define (ly:sort-alist alist prop)
  #! Return a sorted list of pairs (entry . prop-value) of "alist"
  entries that have "prop" as a key. !#
  (let ((value (lambda (a) (ly:assoc-get prop (cdr a)))))
    (sort-list (map (lambda (a) (cons (car a) (value a)))
                    (filter value alist))
               (lambda (a b) (< (cdr a) (cdr b))))))
              
(define (ly:filter-alist alist prop . value)
  #! Return a list of "alist" entries that have "prop" as a key (if
  "value" is unspecified), or that have "prop" set to "value" (if
  specified), or that do *not* have "prop" as a key (if "value" is
  'unset). !#
  (map car
       (filter
         (lambda (entry)
           (let ((this-value (ly:assoc-get prop (cdr entry) 'unset)))
             (if (null? value)
                 (not (eq? this-value 'unset))   ; value is set.
                 (eq? (car value) this-value)))) ; value is a match.
         alist)))

________________________

compile to test:

{
#(begin
; uncomment a line to test it.
;(display (ly:sort-alist default-script-alist 'script-priority))
;(display (ly:sort-alist all-grob-descriptions 'outside-staff-priority))

;(display (ly:filter-alist default-script-alist 'avoid-slur))
;(display (ly:filter-alist default-script-alist 'avoid-slur #f))
;(display (ly:filter-alist all-grob-descriptions 'avoid-slur))
;(display (ly:filter-alist all-grob-descriptions 'non-musical))
;(display (ly:filter-alist all-grob-descriptions 'non-musical 'unset))
)
}
________________________

This could save future developers valuable time during the
learning process.

Thoughts?

- Mark


      


_______________________________________________
lilypond-devel mailing list
lilypond-devel@gnu.org
http://lists.gnu.org/mailman/listinfo/lilypond-devel

Reply via email to