166 lines
6.0 KiB
Racket
166 lines
6.0 KiB
Racket
#lang hyper-literate #:♦ #:no-auto-require (dotlambda/unhygienic . racket/base)
|
|
|
|
♦require[scribble-math
|
|
racket/require
|
|
(for-label (subtract-in (only-meta-in 0 type-expander/lang)
|
|
subtemplate/override)
|
|
typed-worklist
|
|
type-expander/expander
|
|
phc-toolkit/untyped/aliases
|
|
phc-toolkit/untyped/syntax-parse
|
|
subtemplate/override)]
|
|
|
|
♦title[#:style (with-html5 manual-doc-style)
|
|
#:tag "graph-draft"
|
|
#:tag-prefix "phc-graph/graph-draft"]{Draft of the implementation of
|
|
the graph macro}
|
|
|
|
♦(chunks-toc-prefix
|
|
'("(lib phc-graph/scribblings/phc-graph-implementation.scrbl)"
|
|
"phc-graph/graph-draft"))
|
|
|
|
♦chunk[<overview>
|
|
(define low-graph-impl
|
|
(syntax-parser
|
|
[<signature+metadata>
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
|<phase 1: call mappings and extract placeholders>|
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
|<phase 2: inline placeholders within node boundaries>|
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
|<phase 3: replace indices with promises>|
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
<equality-coalescing>
|
|
<invariants+auto-fill>
|
|
<inflexible-row-polymorphism>
|
|
<flexible-row-polymorphism>
|
|
<polymorphic-node-types-and-mappings>
|
|
;<general-purpose-graph-algorithms>
|
|
;<garbage-collection>
|
|
|
|
|
|
|<phase~1: call mappings and extract placeholders>|
|
|
]))]
|
|
|
|
♦chunk[<signature+metadata>
|
|
<signature>
|
|
<metadata>]
|
|
|
|
♦chunk[<signature>
|
|
(_ graph-name
|
|
#:∀ (pvarₕ …)
|
|
({~lit node} nodeᵢ [fieldᵢⱼ cᵢⱼ:colon field-τᵢⱼ] …)
|
|
…
|
|
({~lit mapping} (mappingₖ [argₖₗ :colon arg-τₖₗ] …)
|
|
:colon result-τₖ
|
|
. bodyₖ)
|
|
…)]
|
|
|
|
♦chunk[<metadata>
|
|
(void)]
|
|
|
|
♦chunk[|<phase 1: call mappings and extract placeholders>|
|
|
'<worklist>
|
|
'<call-mapping-functions+placeholders>
|
|
'<extract-placeholders> ;; and put them into the worklist
|
|
]
|
|
|
|
♦chunk[|<phase~1: call mappings and extract placeholders>|
|
|
#'(begin
|
|
(define
|
|
#:∀ (pvarₕ …)
|
|
(graph-name [rootₖ : (Listof (List arg-τₖₗ …))] …)
|
|
|
|
;; TODO: move these to a separate literate programming chunk
|
|
(define-type nodeᵢ (tagged nodeᵢ [fieldᵢⱼ cᵢⱼ field-τᵢⱼ] …))
|
|
…
|
|
|
|
(define (make-placeholderₖ argₖₗ …)
|
|
(list 'placeholderₖ argₖₗ …))
|
|
…
|
|
|
|
(worklist
|
|
(list rootₖ …)
|
|
((λ ([args : (List arg-τₖₗ …)])
|
|
(define-values (argₖₗ …) (apply values args))
|
|
(define result
|
|
(let* ([mappingₖ make-placeholderₖ]
|
|
…
|
|
[argₖₗ 'convert-inflexible-to-flexible?]
|
|
…
|
|
[argₖₗ 'invariant-well-scopedness?]
|
|
…)
|
|
(error "NOT IMPL YET.787543")
|
|
;. bodyₖ
|
|
'(bodyₖ)))
|
|
;; returns placeholders + the result:
|
|
'(extract-placeholders result)
|
|
(error "NOT IMPL YET.8946513648"))
|
|
…)
|
|
((List arg-τₖₗ …) result-τₖ) …)))]
|
|
|
|
♦chunk[|<phase 1: call mappings and extract placeholders>|
|
|
;; Phase 1: call the mapping functions on the input data
|
|
#'(: phase-1 (∀ (pvarₕ …) ;; or use this? (nodes-pvar … mapping-pvar … …)
|
|
(→ (List (Listof mapping-arg-type) ddd)
|
|
(List (Listof mapping-result-type) ddd))))
|
|
#'(begin
|
|
;; Maybe this should be done last, when all phases are available?
|
|
(define (phase1-many-roots (argₖₗ …) …) 'TODO)
|
|
(define (phase1-single-root-for-mapping (argₖₗ …)) 'TODO)
|
|
…)]
|
|
|
|
♦chunk[|<phase 2: inline placeholders within node boundaries>|
|
|
;; Phase 2: inline placeholders within node boundaries
|
|
'(generate-worklist
|
|
nodes
|
|
#'(…?))
|
|
'{(funcion which for a mapping-result → inserts nodes into worklist) …}
|
|
'(for the root mapping results
|
|
call the function to insert nodes and keep the surrounding part)
|
|
'(for each mapping result
|
|
call the function to insert nodes)]
|
|
|
|
♦chunk[|<phase 3: replace indices with promises>|
|
|
;; Phase 3: Replace indices with promises
|
|
;; Phase 3a: have an empty set of invariant witnesses, and call the
|
|
;; invariants for checking
|
|
;; Phase 3b: have the full set of invariant witnesses.
|
|
;; TODO phase 3: auto-fill.
|
|
(void)]
|
|
|
|
♦chunk[<equality-coalescing>
|
|
;; implement as always-#f-unless-eq? for now
|
|
(void)]
|
|
♦chunk[<invariants+auto-fill>
|
|
(void)]
|
|
♦chunk[<inflexible-row-polymorphism>
|
|
(void)]
|
|
♦chunk[<flexible-row-polymorphism>
|
|
(void)]
|
|
♦chunk[<polymorphic-node-types-and-mappings>
|
|
(void)]
|
|
|
|
♦chunk[<overview>
|
|
; high-level graph API:
|
|
#;(<metadata2>
|
|
<extending-existing-graph-types>
|
|
<invariants-for-extended-graph-types>
|
|
<auto-generate-mappings>)]
|
|
|
|
Row polymorphism: make a generic struct->vector and vector->struct?
|
|
|
|
♦chunk[<*>
|
|
(provide low-graph-impl
|
|
(for-template (all-from-out "literals.rkt")))
|
|
|
|
(require (for-template (only-meta-in 0 type-expander/lang)
|
|
typed-worklist
|
|
phc-adt)
|
|
type-expander/expander
|
|
phc-toolkit/untyped/aliases
|
|
phc-toolkit/untyped/syntax-parse
|
|
subtemplate/override)
|
|
|
|
(require (for-template "literals.rkt"))
|
|
<overview>] |