sweet-js/sweet-core

add equivalent of racket's begin-for-syntax

Opened this issue · 7 comments

Context:

I want to be able to write private helpers for my macros. Currently, the only way to do this is to have another module which you import. This seems less-than-ideal to me and involves some weirdness like import ... for syntax. I suggest having a syntax block which puts all of the statements into the correct phase to be used in macros.

Example:

syntax {
  let next = ctx => ctx.next().value
  syntax inc = ctx => #`${next(ctx)} + 1`
}

inc 10

would compile to

10 + 1

Considerations:

  • @jlongster mentioned a forSyntax accepting an IIFE to achieve this instead. This seems less intuitive to me.
  • The import ... for syntax could be implied within a syntax block
  • syntax identifier seems kind of awkward to me inside of a syntax block but not sure if there's any better ways to approach it

Yeah, racket calls this begin-for-syntax and we've discussed it before in the context of the initial module implementation.

I definitely want this but haven't found a syntax I'm happy with yet. Nesting like racket or your suggestion goes against normal binding forms (except for vars hoisting kinda).

Maybe a prefix on the binding?

let x for syntax = // ...
for syntax let x = // ...
syntax let x = // ...
// maybe a special labeled statement?
syntax: let x = //..

Well, personally, if it isn't a block, it's going to be a lot of repeated stuff::

import m1 from ... for syntax
import m2 from ... for syntax
for syntax let h1 ...
for syntax let h2 ...

vs

for syntax {
  import m1 from ...
  import m2 from ...
  let h1 ...
  let h2 ...
}

Agreed. Seems like our options are either violate DRY or violate lexical
nesting. I don't like either.
On Sat, Aug 20, 2016 at 2:41 PM Justin notifications@github.com wrote:

Well, personally, if it isn't a block, it's going to be a lot of repeated
stuff::

import m1 from ... for syntax
import m2 from ... for syntax
for syntax let h1 ...
for syntax let h2 ...

vs

for syntax {
import m1 from ...
import m2 from ...
let h1 ...
let h2 ...
}


You are receiving this because you commented.
Reply to this email directly, view it on GitHub
#581 (comment),
or mute the thread
https://github.com/notifications/unsubscribe-auth/AAAJOpZJNtsbP1QRNRnGYVZG6OQcyVBDks5qh3SGgaJpZM4JnukA
.

I propose commas to separate the let / imports.

@vendethiel you mean like this?

import m1 from ...,
import m2 from ... for syntax

for syntax let h1 ...,
           let h2 ...

@disnet var violates lexical nesting so there's precedent. I personally like the block solution. It could be implemented later as a reader macro though.

@WreckedAvent Now that I look at it again I like your solution if we could do:

for syntax const foo ...;
for syntax const bar ...,
                 baz ...;

This is no different than how binding forms currently work. As far as the imports go though ¯_(ツ)_/¯ In the common case you shouldn't have too many imports for syntax.