[gambit-list] macros, exceptions, line numbers
Marc Feeley
feeley at iro.umontreal.ca
Thu Oct 15 22:02:13 EDT 2009
Location information is not preserved by "define-macro" type macros
because the macro transformer is given, and gives back, a plain s-
expression which has been stripped of the location information. To
preserve the location information, either use a syntax-case macro
transformer or use the (undocumented) ##define-syntax form (there are
a couple of examples of this in the Gambit library source code...
basically the macro transformer receives an s-expression which is
decorated with location information).
Here's a simple example of ##define-syntax:
% gsi
Gambit v4.5.2
> (##define-syntax flip
(lambda (sexpr)
`(list ,(caddr (##source-code sexpr))
,(cadr (##source-code sexpr)))))
> (flip (+ 1 2) (+ 3 4))
(7 3)
> (flip (begin
1
2
3
4
(/ 1 0)
5)
"hello")
*** ERROR IN (console)@11.1 -- Divide by zero
(/ 1 0)
1>
Marc
On 2009-10-15, at 9:42 PM, lowly coder wrote:
> take a look at:
>
> cat test.scm; gsi test.scm
> (define-macro (for var start end . body)
> `(do ((,var ,start (+ ,var 1)))
> ((= ,var ,end))
> , at body))
>
>
> (for i 0 2
> (display i)
> (newline))
>
>
> (for i 0 2
> 'this-line-does-nothing
> 'this-line-does-nothing
> 'this-line-does-nothing
> 'this-line-does-nothing
> 'this-line-does-nothing
> 'this-line-does-nothing
> 'this-line-does-nothing
> 'this-line-does-nothing
> 'this-line-does-nothing
> (/ i a)
> 'this-line-does-nothing
> 'this-line-does-nothing
> 'this-line-does-nothing
> 'this-line-does-nothing
> 'this-line-does-nothing
> 'this-line-does-nothing
> 'this-line-does-nothing
> 'this-line-does-nothing
> 'this-line-does-nothing
> 'this-line-does-nothing
> 'this-line-does-nothing
> 'this-line-does-nothing
> 'this-line-does-nothing
> 'this-line-does-nothing
> 'this-line-does-nothing
> )
>
>
> 0
> 1
> *** ERROR IN #<procedure #2>, "test.scm"@12.1 -- Unbound variable: a
>
>
>
> ignore the fact taht ,end is evaluated twice:
>
> note that the error is on line "12", which is the (for i 0 2 line ...
> not the (/ i a) line; i can understand that since the macro expansion
> happens before the code is run, the entire 'chunk' gets grouped to the
> line where the macro is expanded at
>
> however, is there anyway I can have the "LINE_NUMBER" information
> passed along with define-macro?
>
> thanks!
> _______________________________________________
> Gambit-list mailing list
> Gambit-list at iro.umontreal.ca
> https://webmail.iro.umontreal.ca/mailman/listinfo/gambit-list
More information about the Gambit-list
mailing list