From c7d78159e38b5000841c213bfb88839a9ea95df3 Mon Sep 17 00:00:00 2001 From: Sam Caldwell Date: Thu, 3 Jan 2019 14:01:09 -0500 Subject: [PATCH] require/typed - no contracts --- .../examples/roles/require:typed/client.rkt | 5 +++ .../examples/roles/require:typed/lib.rkt | 5 +++ racket/typed/roles.rkt | 32 +++++++++++++++++++ 3 files changed, 42 insertions(+) create mode 100644 racket/typed/examples/roles/require:typed/client.rkt create mode 100644 racket/typed/examples/roles/require:typed/lib.rkt diff --git a/racket/typed/examples/roles/require:typed/client.rkt b/racket/typed/examples/roles/require:typed/client.rkt new file mode 100644 index 0000000..8a3509b --- /dev/null +++ b/racket/typed/examples/roles/require:typed/client.rkt @@ -0,0 +1,5 @@ +#lang typed/syndicate/roles + +(require/typed "lib.rkt" [x : Int]) + +(displayln (+ x 1)) \ No newline at end of file diff --git a/racket/typed/examples/roles/require:typed/lib.rkt b/racket/typed/examples/roles/require:typed/lib.rkt new file mode 100644 index 0000000..04b8015 --- /dev/null +++ b/racket/typed/examples/roles/require:typed/lib.rkt @@ -0,0 +1,5 @@ +#lang racket + +(provide x) + +(define x 42) \ No newline at end of file diff --git a/racket/typed/roles.rkt b/racket/typed/roles.rkt index ac18232..5c92c04 100644 --- a/racket/typed/roles.rkt +++ b/racket/typed/roles.rkt @@ -39,6 +39,7 @@ match cond ;; require & provides require provide + require/typed require-struct ) @@ -350,6 +351,37 @@ (define (untyped-ctor stx) (user-ctor-untyped-ctor (syntax-local-value stx (const #f))))) +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Require & Provide +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +;; Import and ascribe a type from an untyped module +;; TODO: this is where contracts would need to go +(define-syntax (require/typed stx) + (syntax-parse stx + #:datum-literals (:) + [(_ lib [name:id : ty:type] ...) + #:with (name- ...) (format-ids "~a-" #'(name ...)) + #:with (name+ ...) (assign-types #'((name- ty name) ...)) + (syntax/loc stx + (begin- + (require (only-in lib [name name+] ...)) + (define-syntax name (make-variable-like-transformer #'name+)) ...))])) + +;; Format identifiers in the same way +;; FormatString (SyntaxListOf Identifier) -> (Listof Identifier) +(define-for-syntax (format-ids fmt ids) + (for/list ([id (in-syntax ids)]) + (format-id id fmt id))) + +;; (SyntaxListof (SyntaxList Identifier Type Identifier)) -> (Listof Identifier) +;; For each triple (name- ty name), +;; assign the ty to name- with the orig name +(define-for-syntax (assign-types los) + (for/list ([iti (in-syntax los)]) + (match-define (list name- ty name) (syntax->list iti)) + (add-orig (assign-type name- ty #:wrap? #f) name))) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Conveniences ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;