This is the mail archive of the kawa@sourceware.org mailing list for the Kawa project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

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.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]