yes i'm using GNU Guile 3.0.7, https://www.gnu.org/software/guile/docs/master/guile.html/Syntax-Transformer-Helpers.html i have tested a lot , even define-once again and i choose to use to assignment operators and portable code because the non-portable function do not bring more, finally it was not a bad idea to ask for a new function because we can do it with the actual toolbox... Damien On Thu, Sep 23, 2021 at 10:48 PM Taylan Kammer wrote: > Responding to myself: > > On 23.09.2021 22:27, Taylan Kammer wrote: > > > I can't seem to find syntax-local-binding in Guile 2.2 or 3.0. Did you > > have to import some special module, or are you using another version? > > Worked when I imported (system syntax internal). > > > Either way, I suspect that the following will not work with your macro: > > > > (let () > > (let () > > (<$ x 1)) > > (display x) > > (newline)) > > Indeed it doesn't work, though for a different reason: > > While compiling expression: > Syntax error: > unknown file:43:8: body should end with an expression in form (let () > (<$ x 1)) > > That's because indeed the inner let expands into: > > (let () > (define x 1)) > > And there has to be at least one expression after the define. So I tried: > > (let () > (let () > (<$ x 1) > (newline)) > (display x) > (newline)) > > And as I expected, it says 'x' is unbound: > > ;;; :44:45: warning: possibly unbound variable `x' > <$ : global scope : x > > ice-9/boot-9.scm:1685:16: In procedure raise-exception: > Unbound variable: x > > The only way it will work is if you never use nested scopes, but that will > lead to very strange Scheme code, and there will probably be many cases > where you accidentally use a nested scope without immediately noticing it. > > Note also that definitions aren't allowed everywhere. Consider this: > > (let () > (if 'whatever > (<$ x 1) > (<$ x 2)) > (display x) > (newline)) > > It leads to: > > While compiling expression: > Syntax error: > unknown file:49:17: definition in expression context, where definitions > are not allowed, in form (define x 1) > > Because the arms of 'if' aren't allowed to be definitions. > > -- > Taylan >