> On May 14, 2018, at 12:42 AM, Colin Fleming <[email protected]> > wrote: > > Hi all, > > I work on Cursive <https://cursive-ide.com/>, which is an IDE for Clojure > code based on IntelliJ. I've spoken to several of you at various conferences > over the years. > > I'm interested in understanding better how the macroexpansion to support > editor functionality in DrRacket works. By contrast, Cursive doesn't expand > macros during editing and relies on an extension API to teach it about macro > semantics. It's not ideal, but it does have some advantages - it's safe and > it's fast, and you can add support for some really crazy things that macros > do. However currently it requires me to add support for popular macros, > although I do have plans to open source that part so that users will be able > to add support for either third-party macros that they use, or macros that > they've developed themselves. > > My understanding is that using macroexpansion in the way that DrRacket does > requires a fairly deep integration between the macroexpander, the macros > themselves and the IDE - is that a fair statement? > > I guess that things like source location for forms which are carried from the > unexpanded source to the macroexpansion are more or less automatic. How does > this work for synthesised forms which are either composed from forms in the > original source, or don't exist in the original source at all? For example, > playing around with DrRacket I can see that after (struct node ([left : Tree] > [right : Tree])), hovering over node-left or node-right will indicate that > the node part comes from the struct definition, and the left/right part will > come from the fields. Are there annotations specifying partial ranges within > symbols to allow this?
Since `struct` creates a new name that wasn't in the source, but built from parts of the source, it uses the syntax property `'sub-range-binders` to communicate this to DrRacket [1]. However, if a macro doesn't "make up" names like struct does, it doesn't need to worry about this. > I know there are features for tagging forms with information that will appear > in tooltips and the like, e.g. Typed Racket showing type information in the > editor. Are there other facilities for communicating with the user? These tooltips are controlled by the syntax property `'mouse-over-tooltips` [1]. > How well does all this work for macros which aren't written with DrRacket in > mind? It depends on whether they make up or introduce names that weren't originally there in the source. If a macro only produces definitions or expressions using identifiers it was given as an input, the macro generally doesn't need to be written with DrRacket in mind. > And finally, of course - is there some documentation about all this I could > look at? Is this all implemented with syntax object properties > <https://docs.racket-lang.org/reference/stxprops.html>? Yes, the advanced features that work for macros that make up names or display tooltips are communicated to DrRacket through syntax properties like `'sub-range-binders` and `'mouse-over-tooltips`. These properties are documented here: [1]: https://docs.racket-lang.org/tools/Check_Syntax.html#(part._.Syntax_.Properties_that_.Check_.Syntax_.Looks_.For) > Thanks for any and all help! > > Cheers, > Colin -- You received this message because you are subscribed to the Google Groups "Racket Developers" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To post to this group, send email to [email protected]. To view this discussion on the web visit https://groups.google.com/d/msgid/racket-dev/87D736B0-C013-48CD-9222-0AA2B41C1420%40knauth.org. For more options, visit https://groups.google.com/d/optout.
