From: Maxime Devos <maximedevos@telenet.be>
To: Philip McGrath <philip@philipmcgrath.com>,
Andrew Tropin <andrew@trop.in>, Andy Wingo <wingo@pobox.com>
Cc: "guile-devel@gnu.org" <guile-devel@gnu.org>
Subject: RE: [BUG] Eval sets incorrect runtime metainformation
Date: Sun, 30 Jun 2024 01:05:22 +0200 [thread overview]
Message-ID: <20240630010523.hb5N2C00D3x6CSs01b5P7x@xavier.telenet-ops.be> (raw)
In-Reply-To: <36db048b-2465-4088-b46c-b20e24cd0b66@philipmcgrath.com>
[-- Attachment #1: Type: text/plain, Size: 2541 bytes --]
>Instead of run-time reflection on values, I think an IDE implementing
jump to definition should use source location and binding information
from syntax objects. That's how DrRacket does it.
>The attached DrRacket screenshot (of [1]), in which I've tacked a bunch
of binding arrows, shows how local definitions and complex
macro-introduced binding structures are supported. It also works across
modules, even with renaming: in the program `#lang racket (define one
1)`, right-clicking on `define` and choosing "Jump to Binding
Occurrence" will highlight `racket`, because the initial import of the
racket language establishes the applicable binding of define, whereas
choosing "Open Defining File" will open the racket/private/kw module,
and then choosing "Jump to Definition (in Other File)" will jump to the
definition of `new-define` on line 1171 of kw.rkt, which is renamed
elsewhere to become the `define` of `#lang racket`.
>Since syntax objects from the expander encode all the details of scope,
this works mostly automatically. DrRacket makes this functionality
available as a library, so navigation features can also be used from
Emacs with racket-xp-mode [2] or other editors with the Language Server
Protocol [3].
I suppose this could work, but it seems the wrong layer of abstraction and a bit round-about to me, it also only works on languages that use Scheme-style syntax. Instead, I’d propose compiling the relevant code to Tree-IL (without optimisations, should work with most languages). (For Scheme, this is essentially macro expansion, but the resulting object won’t technically be a syntax object.)
In Tree-IL, all syntax has been expanded (in tree form), which eliminates a lot of complications. Yet, source location information remains available (albeit not documented ...)! And the original variable names remain available (together with an unshadow-ified version, so for local variables you can move upwards to find the corresponding definition and in particular its source location.
A large upside is that this should work for most languages (not only Scheme) and is relatively straightforward to implement, a small downside is that information on definitions like (let-syntax ((f [...])) ...) aren’t available – you only see the return of (f stuff), not ‘f’ itself.
(But this downside applies to the ‘syntax’ route as well, unless you are doing complicated (but possible!) DIY partial macro expansion shenanigans.)
Best regards,
Maxime Devos.
[-- Attachment #2: Type: text/html, Size: 4342 bytes --]
next prev parent reply other threads:[~2024-06-29 23:05 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-06-25 15:07 [BUG] Eval sets incorrect runtime metainformation Andrew Tropin
2024-06-26 9:24 ` Andy Wingo
2024-06-26 9:36 ` Maxime Devos
2024-06-26 11:41 ` Andrew Tropin
2024-06-26 22:06 ` Philip McGrath
2024-06-28 13:20 ` Andrew Tropin
2024-06-29 19:55 ` Philip McGrath
2024-06-29 23:05 ` Maxime Devos [this message]
2024-06-30 22:27 ` Philip McGrath
2024-07-01 9:06 ` Maxime Devos
2024-07-06 16:42 ` Rob Browning
2024-07-06 18:56 ` Matt Wette
2024-06-26 16:04 ` Andy Wingo
2024-06-28 13:27 ` Andrew Tropin
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: https://www.gnu.org/software/guile/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20240630010523.hb5N2C00D3x6CSs01b5P7x@xavier.telenet-ops.be \
--to=maximedevos@telenet.be \
--cc=andrew@trop.in \
--cc=guile-devel@gnu.org \
--cc=philip@philipmcgrath.com \
--cc=wingo@pobox.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).