Since I favor blunt instruments, and I like having the typed & untyped
interfaces in separate files, I adapted Alex’s submodule idea using a new
function called `include-without-lang-line` [1] that pulls out the code
from a typed file so it can be recompiled in an untyped context.

For instance, with the arrangement below, the function `fladd` only gets
written in one place, but it can be required 1) from typed code as a typed
function, 2) from untyped code as an untyped, contracted function 3) from
untyped code with no contract.

;;; typed.rkt
#lang typed/racket/base
(provide fladd)
(: fladd (Flonum Flonum . -> . Flonum))
(define (fladd f1 f2)
  (+ f1 f2))

;;; untyped.rkt
#lang racket/base
(require racket/contract)

(module typed-functions typed/racket/base/no-check
  (require sugar/include)
  (include-without-lang-line "typed.rkt"))

(require 'typed-functions)
(provide fladd)
(module+ safe
  (provide (contract-out [fladd (flonum? flonum? . -> . flonum?)])))


[1]
http://pkg-build.racket-lang.org/doc/sugar/#%28form._%28%28lib._sugar%2Finclude..rkt%29._include-without-lang-line%29%29


On Mon, Mar 23, 2015 at 10:42 AM, Vincent St-Amour <[email protected]>
wrote:

> This is what Ian is referring to:
>
> http://docs.racket-lang.org/ts-reference/Utilities.html#%28part._.Untyped_.Utilities%29
>
> I think `define-typed/untyped-identifier` may be what you're looking for.
>
> Vincent
>
>
> At Sat, 21 Mar 2015 14:18:44 -0400 (EDT),
> J. Ian Johnson wrote:
> >
> > At RacketCon a couple years ago, Vincent and Neil Toronto worked out a
> crazy way to do this with macros and submodules. I think the math library
> uses the technique they came up with.
> > One of them should write a blog post about the technique.
> > -Ian
> >
> > ----- Original Message -----
> > From: "Matthew Butterick" <[email protected]>
> > To: "users" <[email protected]>
> > Sent: Saturday, March 21, 2015 2:09:04 PM
> > Subject: [racket] making libraries work natively with both Racket &
> Typed     Racket
> >
> > 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`)
> >
> > For instance, the following works, but maybe it's a bad idea for other
> reasons:
> >
> > ;;;;;;;;;;;;;;;;;;;
> >
> > ;; adder.rkt = write typed code, but leave off #lang line & `provide`
> >
> > (: fladd (Flonum Flonum . -> . Flonum))
> > (define (fladd f1 f2)
> >   (+ f1 f2))
> > ;;;;;;;;;;;;;;;;;;;
> >
> >
> > ;;;;;;;;;;;;;;;;;;;
> >
> > ;; typed.rkt = compile in typed context
> >
> > #lang typed/racket/base
> > (require racket/include)
> > (provide fladd)
> > (include "adder.rkt")
> > ;;;;;;;;;;;;;;;;;;;
> >
> >
> > ;;;;;;;;;;;;;;;;;;;
> >
> > ;; untyped.rkt = compile in untyped context with contract
> >
> > #lang typed/racket/base/no-check
> > (require racket/include racket/contract racket/math)
> > (provide (contract-out [fladd (flonum? flonum? . -> . flonum?)]))
> > (include "adder.rkt")
> > ;;;;;;;;;;;;;;;;;;;
> >
> >
> > ;;;;;;;;;;;;;;;;;;;
> >
> > ;; test.rkt
> >
> > #lang racket/base
> >
> > (module typed typed/racket/base
> >   (require "typed.rkt")
> >   (require typed/rackunit)
> >   (check-equal? (fladd 1.0 2.0) 3.0)) ; typechecks correctly
> >
> > (module untyped racket/base
> >   (require "untyped.rkt")
> >   (require rackunit)
> >   (check-equal? (fladd 1.0 2.0) 3.0) ; meets `provide` contract
> >   (check-exn exn:fail:contract? (λ () (fladd 1 2)))) ; violates
> `provide` contract
> >
> > (module violator racket/base
> >   (require "typed.rkt")
> >   (require rackunit)
> >   (check-exn exn:fail:contract? (λ () (fladd 1 2)))) ; violates
> typed/untyped contract barrier
> >
> > (require 'typed)
> > (require 'untyped)
> > (require 'violator)
> > ;;;;;;;;;;;;;;;;;;;
> >
> >
> > ____________________
> >   Racket Users list:
> >   http://lists.racket-lang.org/users
> >
> > ____________________
> >   Racket Users list:
> >   http://lists.racket-lang.org/users
>
> --
> You received this message because you are subscribed to the Google Groups
> "Racket Users" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to [email protected].
> For more options, visit https://groups.google.com/d/optout.
>

-- 
You received this message because you are subscribed to the Google Groups 
"Racket Users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to