refine-alg.rkt (1279B)
1 #lang racket/base 2 3 ;; intern Def, Use? 4 5 ;; A Def is (def sym resolved-module-path int) 6 (struct def (sym mod phase) #:prefab) 7 8 ;; A Use is (use Def int) 9 ;; the offset is (ref-phase - def-phase) 10 (struct use (def offset) #:prefab) 11 12 ;; A resolved is path or symbol. 13 14 ;; An import is (import resolved int) 15 (struct import (resolved offset)) 16 17 ;; ======== 18 19 ;; uses : hash[Use => #t] 20 ;; reqs : hash[import => mpi] 21 ;; keeps : hash[import => mpi] 22 23 #| 24 25 (define (refine uses reqs keeps) 26 (unless (= (hash-count uses) 0) 27 (direct-def-uses uses reqs keeps) 28 (recur-on-imports uses reqs keeps))) 29 30 |# 31 32 (define (hash-choose h) 33 (let ([i (hash-iterate-first h)]) 34 (and i (hash-iterate-value h i)))) 35 36 #| 37 Algorithm for refining bypass modules 38 39 loop: set of references (id, phase), set of requires (mod, phase) 40 for every reference DEFINED* in a require R 41 mark that require R NEEDED and remove from set 42 eliminate every reference provided by R 43 (including re-provides) 44 now every reference left is re-provided by some remaining require 45 recur on imports of requires 46 47 DEFINED* : really, defined in this module OR imported from a "private" module. 48 |# 49 50 51 ;; ==================== 52 53 #| 54 Another algorithm 55 56 Put all requires in priority queue, with max-depth-to-kernel 57 priority... 58 59 |#