How does a macro properly expand to a define-runtime-path?

156 views
Skip to first unread message

Alex Knauth

unread,
Nov 10, 2017, 9:34:27 PM11/10/17
to Racket Users
How does a macro properly expand to a define-runtime-path?

The documentation for define-runtime-path says this:

  • If the form has a source module according to syntax-source-module, then the source location is determined by preserving the original expression as a syntax object, extracting its source module path at run time (again using syntax-source-module), and then resolving the resulting module path index.

  • If the expression has no source module, the syntax-source location associated with the form is used, if is a string or path.

  • If no source module is available, and syntax-source produces no path, then current-load-relative-directory is used if it is not #f. Finally, current-directory is used if all else fails.


This tells me that if I want to specify the path it uses to anchor relative paths, I should give the define-runtime-path form a source location from the file I want it to use. 

(define-syntax-parser macro
  [(_ name path-expr)
   (quasisyntax/loc #'name
     (define-runtime-path name path-expr))])

However, this doesn't work. It finds paths relative to the macro's source file instead of the file that `name` came from.

What is the proper way to do this?

(Going through the steps from the documentation:
  * syntax-source-module returns #<module-path-index:()>, which I assume it doesn't use.
  * syntax-source returns #<path:/Users/Alex/Desktop/try-runtime-path/use.rkt>, which I assume it should use.
I want it to use the use.rkt path as the anchor, but instead define-runtime-path is using the macro path. Why? What am I doing wrong?)

Alex Knauth

Matthew Flatt

unread,
Jun 4, 2019, 5:34:57 PM6/4/19
to Alex Knauth, Racket Users
Old question that was never answered:

At Fri, 10 Nov 2017 21:34:24 -0500, Alex Knauth wrote:
> How does a macro properly expand to a define-runtime-path?
>
> The documentation for define-runtime-path says this:
>
> If the form has a source module according to syntax-source-module
> <file:///Applications/Racket/2017-10-29/Racket%20v6.11.0.2/doc/reference/stxops
> .html#%28def._%28%28quote._~23~25kernel%29._syntax-source-module%29%29>>
> This tells me that if I want to specify the path it uses to anchor relative
> paths, I should give the define-runtime-path form a source location from the
> file I want it to use.
>
> (define-syntax-parser macro
> [(_ name path-expr)
> (quasisyntax/loc #'name
> (define-runtime-path name path-expr))])

The confusing part is that `syntax-source-module` is based on a syntax
object's scopes, not its source location.

[Back when `define-runtime-path` was defined, it seemed like that might
be a good idea. It wasn't, and we later figured out that building on
`(#%variable-reference)` is a better idea.]

So, I think the macro you wanted was

(define-syntax (macro stx)
(syntax-parse stx
[(_ name path-expr)
(datum->syntax
stx
(syntax-e #'(define-runtime-path name path-expr))
stx)]))

I'll update the documentation for `syntax-source-module` and
`define-runtime-path` to clarify.

Reply all
Reply to author
Forward
0 new messages