<div dir="ltr"><div>1) You can't ordinarily use a macro from a typed module in untyped code. But with this technique, if you convert `fladd` to a macro, it will still work. <br></div><div><div><br></div><div>2) You can't ordinarily eliminate contract checks when using typed code in untyped code, because a contract is always erected at the boundary. But with this technique, if you remove the contract from "untyped.rkt", it will still work. Then, you have three choices for how to use the function: fully typed (in typed code), with contract (in untyped code), or no contract (in untyped code).</div></div><div><br></div><div>The point of all this is to take libraries I've already written for untyped Racket and optimize them for typed use, without sacrificing anything on the untyped side (and without creating a duplicate typed codebase).</div><div><br></div><div>I've done something similar in the past where I've written my main module functions without contracts, and then put the contracts inside a submodule called (module+ safe ... ). Then then module can be required from other modules either with or without contracts. It works correctly and it's useful.</div><div><br></div><div><br></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Sat, Mar 21, 2015 at 11:23 AM, Alexis King <span dir="ltr"><<a href="mailto:lexi.lambda@gmail.com" target="_blank">lexi.lambda@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Sorry for my misunderstanding, but what’s the point of this? Why not just require the typed code in untyped code directly (as you’re doing in 'violator)? As far as I can tell, it looks like you’re just manually rewriting the generated contracts, so I’m not really sure what this achieves.<br>
<div class="HOEnZb"><div class="h5"><br>
> On Mar 21, 2015, at 11:09, Matthew Butterick <<a href="mailto:mb@mbtype.com">mb@mbtype.com</a>> wrote:<br>
><br>
> Is there an approved way of using #lang typed/racket/base/no-check (or maybe `with-type`) to create libraries that have both a typed and untyped interface? (The goal being to avoid use of `require/typed`)<br>
><br>
> For instance, the following works, but maybe it's a bad idea for other reasons:<br>
><br>
> ;;;;;;;;;;;;;;;;;;;<br>
><br>
> ;; adder.rkt = write typed code, but leave off #lang line & `provide`<br>
><br>
> (: fladd (Flonum Flonum . -> . Flonum))<br>
> (define (fladd f1 f2)<br>
>  (+ f1 f2))<br>
> ;;;;;;;;;;;;;;;;;;;<br>
><br>
><br>
> ;;;;;;;;;;;;;;;;;;;<br>
><br>
> ;; typed.rkt = compile in typed context<br>
><br>
> #lang typed/racket/base<br>
> (require racket/include)<br>
> (provide fladd)<br>
> (include "adder.rkt")<br>
> ;;;;;;;;;;;;;;;;;;;<br>
><br>
><br>
> ;;;;;;;;;;;;;;;;;;;<br>
><br>
> ;; untyped.rkt = compile in untyped context with contract<br>
><br>
> #lang typed/racket/base/no-check<br>
> (require racket/include racket/contract racket/math)<br>
> (provide (contract-out [fladd (flonum? flonum? . -> . flonum?)]))<br>
> (include "adder.rkt")<br>
> ;;;;;;;;;;;;;;;;;;;<br>
><br>
><br>
> ;;;;;;;;;;;;;;;;;;;<br>
><br>
> ;; test.rkt<br>
><br>
> #lang racket/base<br>
><br>
> (module typed typed/racket/base<br>
>  (require "typed.rkt")<br>
>  (require typed/rackunit)<br>
>  (check-equal? (fladd 1.0 2.0) 3.0)) ; typechecks correctly<br>
><br>
> (module untyped racket/base<br>
>  (require "untyped.rkt")<br>
>  (require rackunit)<br>
>  (check-equal? (fladd 1.0 2.0) 3.0) ; meets `provide` contract<br>
>  (check-exn exn:fail:contract? (λ () (fladd 1 2)))) ; violates `provide` contract<br>
><br>
> (module violator racket/base<br>
>  (require "typed.rkt")<br>
>  (require rackunit)<br>
>  (check-exn exn:fail:contract? (λ () (fladd 1 2)))) ; violates typed/untyped contract barrier<br>
><br>
> (require 'typed)<br>
> (require 'untyped)<br>
> (require 'violator)<br>
> ;;;;;;;;;;;;;;;;;;;<br>
><br>
><br>
</div></div><div class="HOEnZb"><div class="h5">> ____________________<br>
>  Racket Users list:<br>
>  <a href="http://lists.racket-lang.org/users" target="_blank">http://lists.racket-lang.org/users</a><br>
<br>
</div></div></blockquote></div><br></div>