racket/collects/mzlib/private/plt-match/test-structure.scm
2005-05-27 18:56:37 +00:00

111 lines
4.8 KiB
Scheme

;; This library is used by match.ss
;; This is the major data structure of the compiler. It holds a
;; great deal of information. This structure represents a
;; partially compiled match test. This test is the basic unit of
;; compilation. The order of these tests greatly affects the size
;; of the final compiled match expression. it also affects the
;; amount of time it takes to compile a match expression.
;; the fields:
;; tst - an S-exp of the test such as (equal exp 5). It can also
;; be a name of a test that isn't meant to be compared to other
;; tests such as 'list-ddk-pat.
;; comp - a function that takes a success-function, a fail-function and
;; a list of let bindings
;; shape - a boolean that is true if the test tests the shape or type
;; of the data rather than the value of the data
;; times-used - the number of clauses that use this test. In reality
;; the number of clauses in which this test will eliminate
;; tests
;; used-set - a list of numbers which designate the test-lists that
;; in which this test will eliminate tests
;; bind-exp-stx - the syntax of the actual expression that is being tested
;; by this test ex. (syntax (car (cdr x)))
;; bind-exp - the s-exp that is being tested by this test,
;; easily obtained by taking the syntax-object->datum
;; of bind-exp-stx
;; bind-count - is the number of times in the bind-exp is found in the
;; test list in which this test is a member
(define-struct test (tst
comp
shape
times-used
used-set
bind-exp-stx
bind-exp
bind-count
times-used-neg
used-set-neg
closest-shape-tst
equal-set)
(make-inspector))
;;!(function make-shape-test
;; (form (make-shape-test test exp comp) -> test-struct)
;; (contract (s-exp syntax (((list list -> syntax)
;; (list list -> syntax) list)
;; ->
;; (list list -> syntax)))
;; -> test))
;; This function is essentially a constructor for a test struct.
;; This constructor makes a "shape" test - test that tests for type
;; rather than value.
;; Arguments:
;; test - s-exp of the test
;; exp - the syntax of the expression being tested
;; comp - the compilation function which will finish the compilation
;; after tests have been reordered
(define (make-shape-test test exp comp)
(make-test test comp #t 0 '() exp (syntax-object->datum exp) 1 0 '() #f '()))
;;!(function make-reg-test
;; (form (make-shape-test test exp comp) -> test-struct)
;; (contract (s-exp syntax (((list list -> syntax)
;; (list list -> syntax) list)
;; -> (list list -> syntax)))
;; -> test))
;; This function is essentially a constructor for a test struct.
;; This constructor makes a "regular" test
;; Arguments:
;; test - s-exp of the test
;; exp - the syntax of the expression being tested
;; comp - the compilation function which will finish the compilation
;; after tests have been reordered
(define (make-reg-test test exp comp)
(make-test test comp #f 0 '() exp (syntax-object->datum exp) 1 0 '() #f '()))
;;!(function make-act-test
;; (form (make-shape-test test exp comp) -> test-struct)
;; (contract (s-exp syntax (((list list -> syntax)
;; (list list -> syntax) list) -> (list list -> syntax)))
;; -> test))
;; This function is essentially a constructor for a test struct.
;; This constructor makes an "action" test - an action test is not
;; neccessarily a test so to speak but rather an action that needs to be
;; taken in order to verify that a certain expression matches a pattern.
;; A good example of this is the binding of a pattern variable.
;; Arguments:
;; act-name -
;; exp - the syntax of the expression being tested
;; comp - the compilation function which will finish the compilation
;; after tests have been reordered
(define (make-act act-name exp comp)
(make-test act-name comp #f -1 '() exp (syntax-object->datum exp) 1 -1 '() #f '()))
;;!(function action-test?
;; (form (action-test? test) -> bool)
;; (contract test -> bool))
;; a predicate that returns true if a test is an action test
(define (action-test? test)
(= -1 (test-times-used test)))
;;!(function shape-test?
;; (form (shape-test? test) -> bool)
;; (contract test -> bool))
;; a predicate that returns true if a test is an shape test
(define (shape-test? test)
(test-shape test))
(define (negate-test? test)
(test-closest-shape-tst test))