Typed Racket support
logc opened this issue · 2 comments
Hi! Thank you very much for this library, it is extremely interesting.
One thing I tried out is checking how the emitted assembly changes under gradual typing. But I could not find in the documentation how to work with Typed Racket; I also tried racket/contract
.
My attempt with Typed Racket on the REPL:
$ racket -I typed/racket
Welcome to Racket v7.1.
> (: my-square (-> Number Number))
> (define (my-square x) (* x x))
> (require disassemble)
> (disassemble my-square)
; readline-input:7:0: Type Checker: missing type for identifier;
; consider using `require/typed' to import it
; identifier: disassemble
; from module: disassemble
; in: (disassemble my-square)
; [,bt for context]
> (require/typed disassemble [disassemble (-> Any Any)])
> (disassemble my-square)
; disassemble: contract violation
; expected: non-primitive procedure
; given: #<procedure:my-square>
; [,bt for context]
> ^D
And here is my attempt to use disassemble
on an untyped Racket procedure that has a contract:
$ racket
Welcome to Racket v7.1.
> (require disassemble)
> (define (my-square x)
(* x x))
> (disassemble my-square)
;; ... elided: it works ...
> (define/contract (real-square x)
(-> real? real?)
(* x x))
> (disassemble real-square)
; disassemble: contract violation
; expected: non-primitive procedure
; given: #<procedure:real-square>
; [,bt for context]
> ^D
Is this possible, but undocumented? Or is it just not doable?
Thanks again!
Unfortunately, disassemble
doesn't work on contracted functions. If you use unsafe-require/typed
your first example will work.
I can confirm that it works with your proposed solution. Thanks!
Just for reference, here is an example session where the disassemble
is required with a type that allows for the #:program
keyword argument. Maybe you can add it to documentation.
$ racket -I typed/racket
Welcome to Racket v7.1.
> (require typed/racket/unsafe)
> (unsafe-require/typed disassemble [disassemble (->* (Any) (#:program Symbol) Void)])
> (: my-square (-> Number Number))
> (define (my-square x) (* x x))
> (disassemble my-square #:program 'nasm)
;; ... elided, it works ...