Simplifying xexpr/callbacks? with corrext-xexpr?
svn: r375
This commit is contained in:
parent
596c62d299
commit
78bad3ef90
|
@ -2,88 +2,13 @@
|
||||||
|
|
||||||
;; Used for send/suspend/callback.
|
;; Used for send/suspend/callback.
|
||||||
|
|
||||||
;; A xexpr/callback is one of:
|
|
||||||
;; - string
|
|
||||||
;; - symbol
|
|
||||||
;; - number
|
|
||||||
;; - comment
|
|
||||||
;; - processing instruction
|
|
||||||
;; - procedure
|
|
||||||
;; - (symbol xexpr/callback ...)
|
|
||||||
;; - (symbol ((symbol attrib-value) ...) xexpr/callback ...)
|
|
||||||
|
|
||||||
;; An attrib-value is one of:
|
|
||||||
;; - string
|
|
||||||
;; - procedure
|
|
||||||
|
|
||||||
(module xexpr-callback mzscheme
|
(module xexpr-callback mzscheme
|
||||||
(require (lib "xml.ss" "xml"))
|
(require (lib "xml.ss" "xml"))
|
||||||
(provide xexpr/callback?)
|
(provide xexpr/callback?)
|
||||||
|
|
||||||
;; Is it a Xexpr, or an Xexpr with procedures?
|
;; Is it a Xexpr, or an Xexpr with procedures?
|
||||||
(define (xexpr/callback? x)
|
(define (xexpr/callback? x)
|
||||||
(correct-xexpr-callback? x #t #f))
|
(correct-xexpr? x
|
||||||
|
(lambda () #t)
|
||||||
;;; Copied and pasted from xml/private/xexpr.ss, then modified to include
|
(lambda (exn)
|
||||||
;;; procedures.
|
(procedure? (exn:invalid-xexpr-code exn))))))
|
||||||
|
|
||||||
;; correct-xexpr? : any any any -> any
|
|
||||||
(define (correct-xexpr-callback? x true false)
|
|
||||||
(cond
|
|
||||||
((string? x) true)
|
|
||||||
((symbol? x) true)
|
|
||||||
((number? x) true)
|
|
||||||
((comment? x) true)
|
|
||||||
((pi? x) true)
|
|
||||||
;; Modified here
|
|
||||||
((procedure? x) true)
|
|
||||||
;;
|
|
||||||
((list? x)
|
|
||||||
(or (null? x)
|
|
||||||
(if (symbol? (car x))
|
|
||||||
(if (has-attribute? x)
|
|
||||||
(and (attribute-pairs? (cadr x) true false)
|
|
||||||
(andmap (lambda (part)
|
|
||||||
(correct-xexpr-callback? part true false))
|
|
||||||
(cddr x))
|
|
||||||
true)
|
|
||||||
(andmap (lambda (part)
|
|
||||||
(correct-xexpr-callback? part true false))
|
|
||||||
(cdr x)))
|
|
||||||
false)))
|
|
||||||
(else false)))
|
|
||||||
|
|
||||||
;; has-attribute? : List -> Boolean
|
|
||||||
;; True if the Xexpr provided has an attribute list.
|
|
||||||
(define (has-attribute? x)
|
|
||||||
(and (> (length x) 1)
|
|
||||||
(list? (cadr x))
|
|
||||||
(andmap (lambda (attr)
|
|
||||||
(pair? attr))
|
|
||||||
(cadr x))))
|
|
||||||
|
|
||||||
;; attribute-pairs? : List any any -> any
|
|
||||||
;; True if the list is a list of pairs.
|
|
||||||
(define (attribute-pairs? attrs true false)
|
|
||||||
(or (and (null? attrs) true)
|
|
||||||
(let ((attr (car attrs)))
|
|
||||||
(if (pair? attr)
|
|
||||||
(and (attribute-symbol-string? attr true false)
|
|
||||||
(attribute-pairs? (cdr attrs) true false)
|
|
||||||
true)
|
|
||||||
false))))
|
|
||||||
|
|
||||||
;; attribute-symbol-string? : List any any
|
|
||||||
;; -> any
|
|
||||||
;; True if the list is a list of String,Symbol pairs.
|
|
||||||
(define (attribute-symbol-string? attr true false)
|
|
||||||
(if (symbol? (car attr))
|
|
||||||
(or (and (or (string? (cadr attr))
|
|
||||||
;; Modified here
|
|
||||||
(procedure? (cadr attr)))
|
|
||||||
;;
|
|
||||||
true)
|
|
||||||
false)
|
|
||||||
false))
|
|
||||||
|
|
||||||
)
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user