samth/disassemble

Typed Racket support

logc opened this issue · 2 comments

logc commented

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!

samth commented

Unfortunately, disassemble doesn't work on contracted functions. If you use unsafe-require/typed your first example will work.

logc commented

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 ...