vanquish the spooky

main
Matthew Butterick 7 years ago
parent af4fe8157d
commit 27c9de274e

@ -77,11 +77,8 @@ https://github.com/mbutterick/pdfkit/blob/master/lib/font/embedded.coffee
(when isCFF (when isCFF
(hash-set! (· fontFile payload) 'Subtype "CIDFontType0C")) (hash-set! (· fontFile payload) 'Subtype "CIDFontType0C"))
;; todo: address spooky behavior (send fontFile end (get-output-bytes (· this subset encode-to-port)))
;; `(send p dump)` throws an exn:fail:object, but it gets swallowed by an intervening · operator
(define p (send (· this subset) encode-to-port))
(send fontFile end (get-output-bytes p))
(define familyClass (let ([val (if (send (· this font) has-table? 'OS/2) (define familyClass (let ([val (if (send (· this font) has-table? 'OS/2)
(· this font OS/2 sFamilyClass) (· this font OS/2 sFamilyClass)

@ -40,25 +40,22 @@
(check-equal? (number -4) "-4")) (check-equal? (number -4) "-4"))
(define-syntax-rule (send-or-false X REF) (define ·-helper
(with-handlers ([exn:fail:object? (λ (exn) #f)]) (procedure-rename
(send X REF))) (λ (x . refs)
(for/fold ([x x])
(define-syntax-rule (get-or-false X REF) ([ref (in-list refs)])
(with-handlers ([exn:fail:object? (λ (exn) #f)]) (cond
(get-field REF X))) ;; dict first, to catch objects that implement gen:dict
[(dict? x) (dict-ref x ref #f)]
(require sugar/debug) ;; give `send` precedence (presence of method => wants runtime resolution of value)
(define-macro-cases · [(object? x) (cond
[(_ X REF) [(memq ref (interface->method-names (object-interface x))) (dynamic-send x ref)]
(syntax/loc caller-stx (let loop ([x X]) [(memq ref (field-names x)) (dynamic-get-field ref x)]
(cond [else #f])]
;; dict first, to catch objects that implement gen:dict [else (raise-argument-error '· "object or dict" x)]))) '·))
[(dict? x) (dict-ref x 'REF #f)]
;; give `send` precedence (presence of method => wants runtime resolution of value) (define-macro (· X REF ...) #'(·-helper X 'REF ...))
[(object? x) (or (send-or-false x REF) (get-or-false x REF))]
[else (raise-argument-error '· (format "~a must be object or dict" 'X) x)])))]
[(_ X REF0 . REFS) #'(· (· X REF0) . REFS)])
#;(module+ test #;(module+ test
(define c (class object% (define c (class object%

Loading…
Cancel
Save