Changed graph syntax to allow field names. Wrote node/incomplete-type and node/make-incomplete implementations.

This commit is contained in:
Georges Dupéron 2015-11-19 02:02:57 +01:00
parent 854383ef93
commit a2e37a10a4
2 changed files with 40 additions and 14 deletions

View File

@ -18,10 +18,10 @@ name. For example, a graph representing a city and its inhabitants could use
these variants:
@chunk[<example-variants>
[City (Listof Street) (Listof Person)]
[Street (Listof House)]
[House Person Street]
[Person String]]
[City [streets : (Listof Street)] [inhabitants : (Listof Person)]]
[Street [houses : (Listof House)]]
[House [owner : Person] [location : Street]]
[Person [name : String]]]
Notice the cycle in the type: a street contains houses, which are located on the
same street.
@ -192,10 +192,11 @@ flexible through wrapper macros.
@chunk[<signature>
(make-graph-constructor
([node field-type ...] ...)
([node [field-name:id (~literal :) field-type:expr] ...] ...)
(root-expr:expr ...)
[(mapping [param (~literal :) param-type] ...) (~literal :) result-type
body]
[(mapping:id [param:id (~literal :) param-type:expr] ...)
(~literal :) result-type:expr
. body]
...)]
The macro relies heavily on two sidekick modules: @tc[rewrite-type], and
@ -323,15 +324,25 @@ which return type is the desired node type.
@; TODO: use a type-expander here, instead of a template metafunction.
@CHUNK[<define-with-promises>
(define-type node/incomplete-type
(tmpl-replace-in-type (List 'node field-type ...)
@CHUNK[<define-incomplete>
(define-type field/incomplete-type
(tmpl-replace-in-type field-type
([node (U node/incomplete-type
mapping/placeholder-type ...)] ...)))]
mapping/placeholder-type ...)] ...)))
...
(define-type node/incomplete-type (List 'node field/incomplete-type ))
(: node/make-incomplete ( field/incomplete-type node/incomplete-type))
(define (node/make-incomplete field-name )
(list 'node field-name ))]
@chunk[<define-ids>
(define-temp-ids "~a/make-incomplete" (node ...))
(define-temp-ids "~a/incomplete-type" (node ...))]
(define-temp-ids "~a/make-incomplete" (node ))
(define-temp-ids "~a/incomplete-type" (node ))
;; TODO: format-ids doesn't accept arbitrary values. Should we change it?
(define/with-syntax ((field/incomplete-type ) )
(stx-map generate-temporaries #'((field-type ) )))]
@subsection{Processing the placeholders}
@ -354,6 +365,7 @@ which return type is the desired node type.
(let ()
(begin <define-placeholder>) ...
(begin <define-with-promises>) ...
(begin <define-incomplete>) ...
<fold-queue>)))]
@section{Conclusion}
@ -362,6 +374,7 @@ which return type is the desired node type.
(module main typed/racket
(require (for-syntax syntax/parse
racket/syntax
syntax/stx
syntax/parse/experimental/template
"rewrite-type.lp2.rkt"
"../lib/low-untyped.rkt")

View File

@ -170,7 +170,8 @@
nameof
first-value second-value third-value fourth-value fifth-value
sixth-value seventh-value eighth-value ninth-value tenth-value
(rename-out [compose ])
stx-list
stx-e
stx-pair
@ -189,6 +190,10 @@
check-duplicate-identifiers
generate-temporary)
(require (only-in racket
[compose ]
[... ]))
(require (for-syntax syntax/parse syntax/parse/experimental/template))
(: hash-set** ( (K V)
@ -474,6 +479,7 @@
[format-id ( Syntax String (U String Identifier) *
Identifier)])
(require (only-in racket/syntax define/with-syntax)
(only-in syntax/stx stx-map)
(for-syntax racket/base
racket/syntax
syntax/parse))
@ -535,6 +541,13 @@
(define-syntax (define-temp-ids stx)
(syntax-parse stx
;; TODO : factor this with the next case.
[(_ format ((base:id (~literal ...)) (~literal ...)))
#:when (string? (syntax-e #'format))
(with-syntax ([pat (format-id #'base (syntax-e #'format) #'base)])
#'(define/with-syntax ((pat (... ...)) (... ...))
(stx-map (curry format-temp-ids format)
#'((base (... ...)) (... ...)))))]
[(_ format (base:id (~literal ...)))
#:when (string? (syntax-e #'format))
(with-syntax ([pat (format-id #'base (syntax-e #'format) #'base)])