lilypond-user
[Top][All Lists]
 @Urs I've thought about this some more. I don't know if you were interested in wrapping the functions that use opts and props in a macro, but I noticed a lot of redundancy so I gave it a try. ```\version "2.19.80" \include "oll-core/package.ily" #(define-macro (define-void-function-with-options vars preds rulings . body) `(define-void-function ,(append '(opts) vars) ,(append '(ly:context-mod?) preds) (define rules ,rulings) (let ((props (context-mod->props rules #t opts))) . ,body))) testRules = #(define-void-function-with-options () () `((ind ,number? 5) (target ,symbol?) (payload) (accepted-arg ,fraction? opt) (accepted-without-type opt) (msg ,string? "No message given")) (pretty-print props)) \testRules \with { msg = "Something" unk = "Unknown option" target = something % accepted-arg = 7/4 % accepted-without-type = #(ly:make-moment 3/16) }``` Again, tell me if you find it convenient. Hm. The definition of testRules looks pretty good. What I'm not so sure about is that this would actually imply creating -with-options variants of *all* define- macros, and I'm not sure if that would add unnecessary complexity compared to "simply" calling context-mod->props within a function definition. Actually, I start thinking if this doesn't call for a "proper" solution to be added to LilyPond itself. Of course I'm hijacking ly:context-mod? which is semantically there for a different purpose. What I would like to see is a different predicate, say, ly:properties? that internally is a simple key-value alist but that can be entered with the same \with {} syntax. Urs