www

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs

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 |#