I wonder whether an approximate tool would be just fine for now, especially if it listed things that it didn't understand.
On May 23, 2012, at 4:04 PM, Ryan Culpepper wrote: > On 05/23/2012 12:31 PM, Neil Van Dyke wrote: >> Thanks, Ryan, that info is helpful, although it's missing most of the >> reasons I've had to partition one library into several modules (macro >> transformers). >> >> As people have mentioned before, there seems to be a theoretical brick >> wall preventing these tools from seeing references that likely will be >> used in the results of macro transformations. I don't understand that in >> all cases. For one example, the transformers often have templates that >> should know many of the symbols and exactly where they're coming from. >> (Is this information from templates lost too soon? Is the information >> from templates not as precise as I assumed?) > > IIRC, 'check-requires' does in fact inspect syntax templates. The problem is > that it's not possible to predict in what phase(s) the identifiers in a > syntax template will be interpreted. > > For example, consider this module: > > (module AMB racket > (require (for-template (rename-in racket/base [- shifty])) > (only-in racket/base [+ shifty])) > (define shifty-stx #'(shifty 1 2)) > (provide shifty-stx)) > > Does the occurrence of 'shifty' in the syntax template refer to '+' or '-'? > It might be both. > > If it's used in a macro, 'shifty' means '-': > > (require (for-syntax 'AMB)) > (define-syntax m (lambda _ shifty-stx)) > (m) > ;; => -1 > > but if it's evaluated with 'eval', 'shifty' means '+': > > (require 'AMB) > (eval shifty-stx (make-base-namespace)) > > (Exercise: add (require (for-meta 2 (rename-in racket/base [+ shifty]))) to > AMB. See if you can construct a program that interprets 'shifty' as '*'.) > > -- > > But I'd estimate that 90% of the time, an identifier in a syntax template is > interpreted at the phase one less than the phase the syntax template occurs > in. And 90% of the remaining cases it's interpreted in the same phase as the > syntax template. So that's what 'check-requires' assumes (see > 'analyze/quote-syntax' in macro-debugger/analysis/private/get-references). > > If 'check-requires' isn't seeing dependencies from syntax templates, can you > send me an example? > > > For another example (or >> possibly the same thing), these tools seem to be missing references in >> the code of "syntax-parse" productions that is outside templates and >> that I'd think is unambiguous. > > I don't understand what you mean. Can you give an example? > > Ryan > > >> BTW, a student who is bored over the summer could do worse than to >> enhance the Module Browser in some other ways. First low-hanging fruit >> step might be to put the information from "check-requires" into tooltips >> on the arrows. Then there's a lot one could do with graph drawing. And, >> as a small graphics tweak, you can make it skip redundant repaints >> queued up when dragging. (Summer is good for this. More than a little >> sun exposure will just age your skin prematurely and give you melanoma, >> anyway.) >> >> Neil V. >> >> Ryan Culpepper wrote at 05/23/2012 02:28 PM: >>> On 05/23/2012 11:13 AM, Neil Van Dyke wrote: >>>> In the Module Browser, has anyone tried annotating the graph edges with >>>> imported symbols that are actually referenced by the importing module? >>>> Maybe further annotate those symbols with phases? >>> >>> You can get this information (in text form) from the check-requires >>> utility. You may find the code in >>> macro-debugger/analysis/check-requires (and its dependencies) useful >>> if you want to add this information to the module browser. Getting the >>> set of references is actually somewhat tricky, and I think my code >>> does as good a job as possible. >>> >>> Ryan >>> > > ____________________ > Racket Users list: > http://lists.racket-lang.org/users ____________________ Racket Users list: http://lists.racket-lang.org/users