Re: Fw: Macro Question
Joseph Donaldson <[email protected]>
| Newsgroups | gmane.lisp.scheme.bigloo |
|---|---|
| Message-ID | <[email protected]> |
Hello, Bent,
My concern is with the situation where the symbol used for the field name clashes with a binding in a macro. The intention of the first symbol in the pairs passed to the family of instantiate macros is intended to be the name of the field not a binding, and hence, in my mind, should not be replaced by macro expansion. That is why I suggested it may make more sense to use keywords; they would not be eligible for replacement during macro expansion.
Does that make sense?
Thank You,Joe
From: Bent Phillipsen <[email protected]>
To: Joseph Donaldson <[email protected]>
Sent: Monday, January 23, 2017 12:06 PM
Subject: Re: [bigloo] Fw: Macro Question
Hi Joe, As I am ondistribution list, here is my point of view:I don't think youshould fear colliding bindings in the macros using the instantiatemacro. This is just what the hygienic macro system is about: identify bindings in the macro definition and replace those nameswith generated names as well as looking up free variables in thescope of the macro definition.I am not exactlysure if you refer to the auxiliary macro “identity” in theexample I gave, when you write “and they can be rewritten by othermacros”. I am also not sure what you were trying to do with theexample you gave – I think it was some sort of information hiding.If you don't like the auxiliary macro you could make your objectcreating macro along the lines of the following:
(module insta-macro
(static (class foo a::long b::long))
(main start))
(define-syntax darn
(syntax-rules (a b)
((_ ) (darn a 1 b 1))
((_ va vb) (darn a va b vb))
((_ a va b vb) (let ((va-evaluated va)
(vb-evaluated vb))
(instantiate::foo (a va-evaluated) (b vb-evaluated))))))
(define (start argv)
(define obj1 (darn)) ; create an object with default values
(define obj2 (darn (* 2 1) (* 2 4))) ; create an object initialized with evaluated expressions
(define obj3 (darn 11 22))
(define obj4 (darn a 3 b 4)) ; create an object giving the field names
;(define obj5 (darn a 4 c 9)) ; OK, this will not compile, no field c
;(define obj6 (darn b 5 a 5)) ; OK this will not compile, a and b must be given in right order
(with-access::foo obj1 (a b)
(print "obj1 a=" a " b=" b))
(with-access::foo obj2 (a b)
(print "obj2 a=" a " b=" b))
(with-access::foo obj3 (a b)
(print "obj3 a=" a " b=" b))
(with-access::foo obj4 (a b)
(print "obj4 a=" a " b=" b)))
Using literal (or "macro keywords") a b appears to be a good idea here, as it prevents (darn b 9 a 1). Without literals this would compile and assign 9 to a and 1 to b. Probably not what was intended.
Something along this line should in myopinion be safe and never give collisions – or am I overlookingsomething?Best regardsBent
2017-01-22 20:11 GMT+01:00 Joseph Donaldson <[email protected]>:
Hello,
I can see why the behavior is occurring, but it seems that, since we are using symbols for the field specifiers in the instantiate macro and they can be rewritten by other macros introducing possibly colliding bindings, it makes uses of the instantiate macros in other macros very fragile. Am I a missing something? Would it make since to use keywords for the field names instead?
Thank You,Joe
From: "[email protected]" <[email protected]>
To: Bent Phillipsen <[email protected]>
Cc: [email protected]; [email protected]
Sent: Monday, January 16, 2017 5:19 AM
Subject: Re: [bigloo] Fw: Macro Question
Hi Bent,
> IMO this is expected behavior - but doesn't work, as the variable in let
> will be generated:
I have missed the point you are raising in my previous answer. I think you
are right.
--
Manuel