Skip to content

Proposal: DrRacket Surrogates for meta-languages #243

@LeifAndersen

Description

@LeifAndersen

BACKGROUND:

DrRacket uses a language's get-info function to set parameters such as
syntax coloring, indentation, and toolbar buttons. One parameter is
definitions-text-surrogate1, which lets #langs set a surrogate
for DrRacket. The docs mention that this is a powerful, yet easy to do
wrong, IDE extension mechanism.

Unfortunately, as is, the definitions-text-surrogate form does not
mix well with meta-languages e.g. s-exp, reader, at-exp. When given
the definitions-text-surrogate key, get-info returns a single module
path for DrRacket to dynamic-require. There is no way for a
meta-language to mix in its surrogate with the surrogate of the
language its extending. (At least not without either creating a
temporary file on the fly, or trying to scrape the current state of
DrRacket. Both of which are terrible ideas.)

PROPOSAL:

We extend the valid values for the definitions-text-surrogate key to
be a list of symbols as well as a single symbol. In the case of a
single symbol, nothing changes.

In the case of a list, each element must also be a module path. The
last element must refer to a module that provides a surrogate% class
as before. Every other element, however, refers to a module that
provides a surrogate% mixin. The IDE constructs the expected
surrogate by traversing the list, each time dynamic-requireing the
module, and mixing in the result. Meta-languages can augment existing
surrogates, rather than having to throw them away entirely. The
get-info code for a meta-language might look something like this:

(make-meta-reader
  ...
  (lambda (base-get-info)
    (lambda (key default)
      (case key
        [(definitions-text-surrogate) (flatten (list
"meta-surrogate.rkt" (base-get-info key default)))])))

ENGINEERING EFFORT:
It looks like all of the changes would be confined to the following files:
drracket/drracket/drracket/private/in-irl-namespace.rkt
drracket/drracket/drracket/private/insulated-read-language.rkt
drracket/drracket/drracket/private/module-language-tools.rkt

(Obviously also documentation+tests)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions