[gambit-list] Compiling "post-reader" forms?

Marc Feeley feeley at iro.umontreal.ca
Fri May 31 13:05:35 EDT 2013


On May 31, 2013, at 9:40 AM, Marc Feeley <feeley at IRO.UMontreal.CA> wrote:

> 
> On May 31, 2013, at 9:28 AM, Nathan Sorenson <takeoutweight at hotmail.com> wrote:
> 
>> When translating Clojure code to Scheme, I'm finding it quite easy to preserve source code information for the Gambit interpreter, so that when I get exceptions I am notified of the offending Clojure source lines. Is there an obvious way I could do this for compiled code as well?
> 
> There isn't a form for this, but that would be useful and I have thought about adding it.  Something like a "source-at" special form.
> 
> For example,
> 
>    (source-at "foo.scm" 10 2 ;; file line column
>               ((source-at "foo.scm" 10 8 cons)
>                (source-at "foo.scm" 10 8 x)
>                (source-at "foo.scm" 10 10 y)))
> 
> would be equivalent to
> 
>    (cons x y)
> 
> but with explicit source location information.
> 
> Actually this source-at form can be easily defined as a macro give me a few minutes.

Here's the implementation of source-at.

Marc

;;; File: source-at.scm

(##define-syntax source-at
  (lambda (form)

    (define (unwrap x)
      (if (##source? x) (##source-code x) x))

    (apply (lambda (_ path line col expr)
             (##make-source
              (unwrap expr)
              (##make-locat
               (##path->container (unwrap path))
               (##make-filepos (- (unwrap line) 1) (- (unwrap col) 1) 0))))
           (unwrap form))))

;; test it:

(define (f x y)
  (+ 1
     (source-at "foo.scm" 10 2 ;; file line column
                (/ x y))))

(pp (f 100 0))

;; Output:
;;
;; % gsi source-at.scm 
;; *** ERROR IN f, "foo.scm"@10.2 -- Divide by zero
;; (/ 100 0)




More information about the Gambit-list mailing list