111 lines
4.8 KiB
Scheme
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))
|