diff --git a/graph-lib/graph/fold-queues.lp2.rkt b/graph-lib/graph/fold-queues.lp2.rkt index aa6b727d..09f20585 100644 --- a/graph-lib/graph/fold-queues.lp2.rkt +++ b/graph-lib/graph/fold-queues.lp2.rkt @@ -20,7 +20,7 @@ . body] … (~parse (root-name . _) - (template ((?? root-spec) name …))))] + (template ((?? root-spec) 'name …))))] @chunk[<enqueue-type> (case→ (→ 'name @@ -209,7 +209,7 @@ position in the vector equal to the index associated to it in the hash table: … [else (Δ-results-to-vectors results)]))) - (% index Δ-hash = (Δ-hash2-enqueue 'root-name root-value Δ-hash2-empty) + (% index Δ-hash = (Δ-hash2-enqueue root-name root-value Δ-hash2-empty) (process-queues Δ-hash Δ-results-empty))] @chunk[<process-queue> diff --git a/graph-lib/graph/graph-5-multi-ctors.lp2.rkt b/graph-lib/graph/graph-5-multi-ctors.lp2.rkt index 4ee9b564..83759a50 100644 --- a/graph-lib/graph/graph-5-multi-ctors.lp2.rkt +++ b/graph-lib/graph/graph-5-multi-ctors.lp2.rkt @@ -57,6 +57,8 @@ And @tc[<mapping-declaration>] is: (stx-map (λ (mr) (cdr-assoc-syntax mr #'([node . node/mapping] …))) #'(result-node …))) (define/with-syntax all-nodes #'(node …)) + (define/with-syntax (root-node . _) #'(result-node …)) + (define/with-syntax (root-mapping . _) #'(mapping …)) ; TODO: we should order the graph's nodes so that the root is ; the first one! (or add a #:root) @@ -72,9 +74,16 @@ And @tc[<mapping-declaration>] is: (λ (stx) (syntax-case stx () [(_ . rest) #'(name/wrapped . rest)])) - #:else-id name/constructor) + #:call (λ (stx) + (syntax-parse stx + [(_ . rest) + (syntax/loc stx + (name/constructor . rest))])) + #:id (λ (stx) + (syntax/loc stx name/constructor))) (define (name/constructor [root-param : root-param-type] …) - (list name/wrapped root-param …)) + (name/wrapped #:root root-node (list 'root-mapping + root-param …))) <define-mappings>) [node [field c field-type] … ((node/mapping [node/arg : <node-arg-type>]) diff --git a/graph-lib/graph/graph.lp2.rkt b/graph-lib/graph/graph.lp2.rkt index 2cb3469b..d7761ba2 100644 --- a/graph-lib/graph/graph.lp2.rkt +++ b/graph-lib/graph/graph.lp2.rkt @@ -2,8 +2,6 @@ @(require "../lib/doc.rkt") @doc-lib-setup -@(define (comment . _) "") - @title[#:style manual-doc-style]{Graph library} @(table-of-contents) @@ -207,7 +205,8 @@ We derive identifiers for these based on the @tc[node] name: (define/with-syntax ((root-param …) . _) #'((param …) …)) (define/with-syntax ((root-param-type …) . _) #'((param-type …) …)) - (define-temp-ids "~a/constructor" name) + (define-temp-ids "~a/main-constructor" name) + (define-temp-ids "~a/constructor" (node …) #:first-base root) (define-temp-ids "~a/make-placeholder" (node …) #:first-base root) (define-temp-ids "~a/placeholder-type" (node …)) (define-temp-ids "~a/placeholder-tag" (node …)) @@ -301,7 +300,8 @@ two values: the result of processing the element, and the latest version of @tc[Δ-queues], which stores the new elements to be added to the queue. @chunk[<fold-queues> - (fold-queues <root-placeholder> + (fold-queues #:root queue-name + placeholder [(node/placeholder-queue [e : <fold-queue-type-element>] [Δ-queues : Δ-Queues] enqueue) @@ -369,7 +369,6 @@ that node's @tc[with-promises] type. @; TODO: use a type-expander here, instead of a template metafunction. @CHUNK[<define-with-promises> - (define-type node/with-promises-type (tagged node/with-promises-tag [field : <field/with-promises-type>] …)) @@ -544,43 +543,6 @@ are replaced by tagged indices: @;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -@comment[#| - @subsection{Converting incomplete nodes to with-promises ones} - - @chunk[<convert-incomplete-to-with-promises> - [node/incomplete-type - node/with-promises-type - (λ (x) (and (pair? x) (eq? (car x) 'node/incomplete-tag))) - (λ ([x : node/incomplete-type] [acc : Void]) - <convert-incomplete-successor>)]] - - @chunk[<convert-placeholder-to-with-promises> - [mapping/placeholder-type - (tmpl-replace-in-type result-type [node node/with-promises-type] …) - (λ (x) (and (pair? x) (eq? (car x) 'mapping/placeholder-tag))) - (λ ([x : mapping/placeholder-type] [acc : Void]) - <convert-placeholder-successor>)]] - - @; TODO: this would be much simpler if we forced having only one mapping per - @; node, and extended that with a macro. - - @chunk[<define-compatible-mappings> - (define/with-syntax ((node/compatible-mappings ...) ...) - (for/list ([x (in-syntax #'(node ...))]) - (multiassoc-syntax - x - #'([result-type . mapping] - …))))] - - @chunk[<convert-incomplete-successor> - (error (~a "Not implemented yet " x))] - - @chunk[<convert-placeholder-successor> - (% index new-Δ-queues = (enqueue 'mapping/placeholder-tag x Δ-queues) - (list 'mapping/placeholder-tag index) - (error (~a "Not implemented yet " x)))] - |#] - @section{Referencing the type of nodes} The identifier defined by @tc[define-graph] will both act as a constuctor for @@ -624,7 +586,21 @@ We will be able to use this type expander in function types, for example: (define-multi-id name #:type-expander <graph-type-expander> - #:else-id name/constructor) + #:call (λ (stx) + (syntax-parse stx + ;; TODO: move this to a dot expander, so that writing + ;; g.a gives a constructor for the a node of g, and + ;; (g.a foo bar) or (let ((c .g.a)) (c foo bar)) both + ;; call it + [(_ #:λroot (~datum node)) + #'node/constructor] + … + [(_ #:root (~datum node) . rest) + (syntax/loc stx (node/constructor . rest))] + … + [(_ . rest) + (syntax/loc stx (root/constructor . rest))])) + #:id (λ (stx) #'root/constructor)) (?? (splicing-let ([mapping node/make-placeholder] … @@ -633,14 +609,25 @@ We will be able to use this type expander in function types, for example: extra-definition …)) - (: name/constructor (→ root-param-type … - (Promise root/with-promises-type))) - (define (name/constructor root-param …) - (match-let ([(list node/database …) <fold-queues>]) - (begin <define-with-indices→with-promises>) … - (let ([root/with-promises (root/with-indices→with-promises - (vector-ref root/database 0))]) - (delay root/with-promises))))))))] + (: fq (case→ (→ 'node/placeholder-queue node/placeholder-type + (List (Vectorof node/with-indices-type) …)) + …)) + (define (fq queue-name placeholder) + <fold-queues>) + + <constructors>))))] + +@chunk[<constructors> + (begin + (: node/constructor (→ param-type … (Promise node/with-promises-type))) + (define (node/constructor param …) + (match-let ([(list node/database …) + (fq 'node/placeholder-queue + (node/make-placeholder param …))]) + (begin <define-with-indices→with-promises>) … + (delay (node/with-indices→with-promises + (vector-ref node/database 0)))))) + …] @chunk[<module-main> (module main typed/racket diff --git a/graph-lib/lib/low.rkt b/graph-lib/lib/low.rkt index 89f5dd95..2eca2d1c 100644 --- a/graph-lib/lib/low.rkt +++ b/graph-lib/lib/low.rkt @@ -1424,7 +1424,11 @@ ;; ==== low/typed-not-implemented-yet.rkt ==== (provide ?) -(define-syntax-rule (? t . rest) ((λ () : t (error "Not implemented yet") - . rest))) +(define-syntax (? stx) + (syntax-case stx () + [(q t . rest) + (quasisyntax/loc stx + ((λ () : t #,(syntax/loc #'q (error "Not implemented yet")) + . rest)))])) ;; ==== end ==== \ No newline at end of file