This is the mail archive of the
kawa@sourceware.org
mailing list for the Kawa project.
Re: reverse execution order in macro
My solution:
(define-syntax with-finalize
(lambda (stx)
(syntax-case stx ()
((_ ((var empty-value init-value finalizer) ... ) . body)
(with-syntax ((head (syntax ((var empty-value) ...))))
(with-syntax ((reverseFinalizers
(datum->syntax-object
(syntax head)
(reverse (syntax-object->datum (syntax
((finalizer var) ... )))))))
(syntax
(let head
(try-finally
(begin . ((set! var init-value) ... . body))
(begin . reverseFinalizers))))))))))
Test:
(with-finalize ((x 0 (+ y 5) println)
(y 2 (+ x 3) println))
(println x)
(println y)
(set! x 100)
(set! y 200))
Output:
7
10
200
100
It is true solution?
Collateral issue: when I not need `finalizer but need in its place
var:someMethod - I get error:
(define-syntax with-finalize2
(lambda (stx)
(syntax-case stx ()
((_ ((var empty-value init-value) ... ) . body)
(with-syntax ((head (syntax ((var empty-value) ...))))
(with-syntax ((reverseFinalizers
(datum->syntax-object
(syntax head)
(reverse (syntax-object->datum (syntax
((var:toString) ... )))))))
(syntax
(let head
(try-finally
(begin . ((set! var init-value) ... . body))
(begin . reverseFinalizers))))))))))
(with-finalize2 ((x 0 (+ y 5))
(y 2 (+ x 3)))
(println x)
(println y)
(set! x 100)
(set! y 200))
java.lang.ClassCastException: kawa.lang.SyntaxForm cannot be cast to
gnu.lists.Pair
at kawa.lang.Quote.expand_pair(Quote.java:106)
at kawa.lang.Quote.expand(Quote.java:316)
at kawa.lang.Quote.expand_pair(Quote.java:217)
at kawa.lang.Quote.expand(Quote.java:316)
at kawa.lang.Quote.expand_pair(Quote.java:217)
at kawa.lang.Quote.expand(Quote.java:316)
at kawa.lang.Quote.expand(Quote.java:42)
at kawa.lang.Quote.quote(Quote.java:56)
at kawa.lib.std_syntax.syntaxObject$To$Datum(std_syntax.scm:223)
at atInteractiveLevel$116.lambda1(stdin:1128)
at atInteractiveLevel$116.apply1(stdin:1124)
at gnu.expr.ModuleMethod.apply1(ModuleMethod.java:182)
at kawa.lang.Macro.expand(Macro.java:178)
at kawa.lang.Macro.scanForm(Macro.java:206)
at kawa.lang.Translator.scanForm(Translator.java:1027)
at gnu.kawa.lispexpr.LispLanguage.parse(LispLanguage.java:69)
at gnu.expr.Language.parse(Language.java:487)
at kawa.Shell.run(Shell.java:246)
at kawa.Shell.run(Shell.java:186)
at kawa.Shell.run(Shell.java:167)
at kawa.repl.main(repl.java:870)
/dev/stdin:1137:1: evaluating syntax transformer 'with-finalize2'
threw java.lang.ClassCastException
: kawa.lang.SyntaxForm cannot be cast to gnu.lists.Pair
I have to make an intermediate macro a-la
(define-syntax _callMyMethod (syntax-rules () ((_ x) (x:myMethod))))
This may avoid?
Thanks!
--
WBR, Yaroslav Kavenchuk.