akeep / nanopass-framework-racket

Racket port of the nanopass-framework
MIT License
34 stars 9 forks source link

Wrong error #9

Closed soegaard closed 9 years ago

soegaard commented 9 years ago

The following program gives an error not in the user program but in the framework.

lang nanopass

(define (constant? c) (number? c))

(define-language L (terminals (constant (c))) (Expr (e) c))

(define (parse v) (with-output-language (L Expr) (cond [(number? v) `,v] [else (error 'parse "got: ~a" v)])))

(define-pass add1 : L (e) -> L () (Expr : Expr (e) -> Expr () [c (guard (even? c)) (+ c 1)]))

(add1 (parse 42))

The mistake made above is that [c (guard (even? c)) (+ c 1)] should have been [,c (guard (even? c)) (+ c 1)].

The error message given is shown below. It indicates an internal error.

Dropbox/GitHub/nanopass-framework-racket/private/pass.rkt:319:33: nano-meta-fields: contract violation expected: nano-meta? given: '#s(nano-quote #<syntax (quote c)>) in: the 1st argument of (-> nano-meta? (listof (or/c nano-dots? nano-quote? nano-unquote? nano-cata? nano-meta? (listof any/c)))) contract from:

/nanopass-framework-racket/private/records.rkt blaming: /nanopass-framework-racket/private/pass.rkt (assuming the contract is correct) at: /nanopass-framework-racket/private/records.rkt:44.5
akeep commented 9 years ago

Yes, it should be [,c (guard (even? c)) (+ c 1)]… I’ll take a look at where we generate that error message this evening and see if I can fix it.

Thanks, I’ll update the issue when I’ve put a better message in there.

-andy:)

On Jul 1, 2015, at 5:47 PM, Jens Axel Søgaard notifications@github.com wrote:

The following program gives an error not in the user program but in the framework.

lang nanopass

(define (constant? c) (number? c))

(define-language L (terminals (constant (c))) (Expr (e) c))

(define (parse v) (with-output-language (L Expr) (cond [(number? v) `,v] [else (error 'parse "got: ~a" v)])))

(define-pass add1 : L (e) -> L () (Expr : Expr (e) -> Expr () [c (guard (even? c)) (+ c 1)]))

(add1 (parse 42))

The mistake made above is that [c (guard (even? c)) (+ c 1)] should have been [,c (guard (even? c)) (+ c 1)].

The error message given is shown below. It indicates an internal error.

Dropbox/GitHub/nanopass-framework-racket/private/pass.rkt:319:33: nano-meta-fields: contract violation expected: nano-meta? given: '#s(nano-quote #) in: the 1st argument of (-> nano-meta? (listof (or/c nano-dots? nano-quote? nano-unquote? nano-cata? nano-meta? (listof any/c)))) contract from: /nanopass-framework-racket/private/records.rkt blaming: /nanopass-framework-racket/private/pass.rkt (assuming the contract is correct) at: /nanopass-framework-racket/private/records.rkt:44.5

— Reply to this email directly or view it on GitHub https://github.com/akeep/nanopass-framework-racket/issues/9.

akeep commented 9 years ago

Thanks again for the bug report. I've committed a fix to the error message and made your example program into a unit test so that it will not re-occur.