From 4f1892737bebf0d52f9d3e41a8b35ac65341b5eb Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Sun, 18 Mar 2001 02:22:00 +0000 Subject: [PATCH] . original commit: 36e0e69e89bf7c678f9145c2b8ae7c4361ab8ef0 --- collects/mzlib/private/sigutil.ss | 67 ++++++++++++------------------- 1 file changed, 26 insertions(+), 41 deletions(-) diff --git a/collects/mzlib/private/sigutil.ss b/collects/mzlib/private/sigutil.ss index 510b7e1..bf1f1f7 100644 --- a/collects/mzlib/private/sigutil.ss +++ b/collects/mzlib/private/sigutil.ss @@ -7,13 +7,16 @@ (require "sigmatch.ss") (require "../exstruct.ss") (require "../unit.ss") + (require "../list.ss") (define-struct signature (name ; sym src ; sym elems)) ; list of syms and signatures (define-struct parse-unit (imports renames vars body)) - (define-struct/export sig (content)) + (define-struct sigdef (content interned)) + (define (make-sig x) (make-sigdef x #f)) + (provide make-sig) (define inline-sig-name ') @@ -78,11 +81,13 @@ (let ([v (syntax-local-value sigid (lambda () #f))]) (unless v (undef-sig-error who expr sigid)) - (unless (sig? v) + (unless (sigdef? v) (not-a-sig-error who expr sigid)) - (let ([s (intern-signature (syntax-e sigid) (sig-content v) - (lambda () - (not-a-sig-error who expr sigid)))]) + (unless (sigdef-interned v) + (set-sigdef-interned! v (intern-signature (syntax-e sigid) (sigdef-content v) + (lambda () + (not-a-sig-error who expr sigid))))) + (let ([s (sigdef-interned v)]) (if name (rename-signature s (stx->sym name)) s)))))) @@ -248,7 +253,7 @@ (define explode-sig (lambda (sig) (list->vector - (map + (map (lambda (v) (if (symbol? v) v @@ -272,41 +277,21 @@ (define sort-signature-elems (lambda (elems) - (letrec ([split - (lambda (l f s) - (cond - [(null? l) (values f s)] - [(null? (cdr l)) (values (cons (car l) f) s)] - [else (split (cddr l) (cons (car l) f) (cons (cadr l) s))]))] - [merge - (lambda (f s) - (cond - [(null? f) s] - [(null? s) f] - [(less-than? (car s) (car f)) - (cons (car s) (merge f (cdr s)))] - [else - (cons (car f) (merge (cdr f) s))]))] - [less-than? - (lambda (a b) - (if (symbol? (car a)) - (if (symbol? (car b)) - (stringstring (if (symbol? i) i (signature-name i)))))]) - (map car - (let loop ([elems (map pair elems)]) - (cond - [(null? elems) null] - [(null? (cdr elems)) elems] - [else (let-values ([(f s) (split elems null null)]) - (merge (loop f) (loop s)))])))))) - + (map car + (quicksort (map + (lambda (i) + (cons i (symbol->string (if (symbol? i) i (signature-name i))))) + elems) + ;; Less-than; put subs at front + (lambda (a b) + (if (symbol? (car a)) + (if (symbol? (car b)) + (string