- (or
- (pair? extent-callback)
- (pair? (assq extent-callback pure-Y-extents))
- (and
- (pair? (assq extent-callback Y-extent-conversions))
- (or
- (not (eq? extent-callback ly:grob::stencil-height))
- (pair? (assq (ly:grob-property-data grob 'stencil) pure-print-callbacks))
- (ly:stencil? (ly:grob-property-data grob 'stencil)))))))
-
-(define (pure-conversion pures conversions defsymbol defreturn rettype? grob start stop)
- (let* ((normal-callback (ly:grob-property-data grob defsymbol))
- (pure-callback (assq normal-callback conversions)))
- (if (rettype? normal-callback)
- normal-callback
- (if (pair? (assq normal-callback pures))
- (normal-callback grob)
- (if (pair? pure-callback)
- ((cdr pure-callback) grob start stop)
- defreturn)))))
-
-(define-public (pure-Y-extent grob start stop)
- (pure-conversion pure-Y-extents Y-extent-conversions
- 'Y-extent '(0 . 0) pair? grob start stop))
-
-(define-public (pure-Y-offset grob start stop)
- (pure-conversion pure-Y-offsets Y-offset-conversions
- 'Y-offset 0 number? grob start stop))
+ (not (eq? #f
+ (or
+ (pair? extent-callback)
+ (memq extent-callback pure-functions)
+ (and
+ (pair? (assq extent-callback pure-conversions-alist))
+ (begin
+ (or
+ (not (eq? extent-callback ly:grob::stencil-height))
+ (memq (ly:grob-property-data grob 'stencil) pure-print-callbacks)
+ (ly:stencil? (ly:grob-property-data grob 'stencil))))))))))
+
+(define-public (call-pure-function unpure args start end)
+ (if (ly:simple-closure? unpure)
+ (ly:eval-simple-closure (car args) unpure start end)
+ (if (not (procedure? unpure))
+ unpure
+ (if (memq unpure pure-functions)
+ (apply unpure args)
+ (let ((pure (assq unpure pure-conversions-alist)))
+ (if pure
+ (apply (cdr pure) (append (list (car args) start end) (cdr args)))))))))