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#| 37Algorithm for refining bypass modules 38 39loop: 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 47DEFINED* : really, defined in this module OR imported from a "private" module. 48|# 49 50 51;; ==================== 52 53#| 54Another algorithm 55 56Put all requires in priority queue, with max-depth-to-kernel 57priority... 58 59|# 60