notes about data and adding theory & model
This commit is contained in:
parent
dde82280a2
commit
9cf40894b8
|
@ -104,6 +104,9 @@
|
||||||
#:methods remix:gen:dot-transformer
|
#:methods remix:gen:dot-transformer
|
||||||
[(define (dot-transform _ stx)
|
[(define (dot-transform _ stx)
|
||||||
(syntax-parse stx
|
(syntax-parse stx
|
||||||
|
[(_dot me:id (x:interface-member . args))
|
||||||
|
(quasisyntax/loc stx
|
||||||
|
(remix:#%app (remix:#%app (remix:#%dot me x)) . args))]
|
||||||
[(_dot me:id x:interface-member)
|
[(_dot me:id x:interface-member)
|
||||||
(get-rhs-id stx #'x)]
|
(get-rhs-id stx #'x)]
|
||||||
[(_dot me:id . (~and x+more (x:interface-member . more)))
|
[(_dot me:id . (~and x+more (x:interface-member . more)))
|
||||||
|
@ -115,6 +118,11 @@
|
||||||
#:methods remix:gen:app-dot-transformer
|
#:methods remix:gen:app-dot-transformer
|
||||||
[(define (app-dot-transform _ stx)
|
[(define (app-dot-transform _ stx)
|
||||||
(syntax-parse stx
|
(syntax-parse stx
|
||||||
|
[(_app (_dot me:id (x:interface-member . args)) . body)
|
||||||
|
(quasisyntax/loc stx
|
||||||
|
(remix:#%app
|
||||||
|
(remix:#%app (remix:#%app (remix:#%dot me x)) . args)
|
||||||
|
. body))]
|
||||||
[(_app (_dot me:id x:interface-member) . body)
|
[(_app (_dot me:id x:interface-member) . body)
|
||||||
(quasisyntax/loc stx
|
(quasisyntax/loc stx
|
||||||
(#,(get-rhs-id stx #'x) . body))]
|
(#,(get-rhs-id stx #'x) . body))]
|
||||||
|
@ -417,5 +425,42 @@
|
||||||
layout-immutable
|
layout-immutable
|
||||||
layout-mutable)
|
layout-mutable)
|
||||||
|
|
||||||
|
;; theory & model
|
||||||
|
|
||||||
|
(define-syntax theory
|
||||||
|
(singleton-struct
|
||||||
|
#:property prop:procedure
|
||||||
|
(λ (_ stx)
|
||||||
|
(raise-syntax-error 'theory "Illegal outside def" stx))
|
||||||
|
#:methods remix:gen:def-transformer
|
||||||
|
[(define (def-transform _ stx)
|
||||||
|
(syntax-parse stx
|
||||||
|
#:literals (remix:#%brackets remix:def theory)
|
||||||
|
[(remix:def (remix:#%brackets theory thy:id)
|
||||||
|
v:id ...)
|
||||||
|
(syntax/loc stx
|
||||||
|
(remix:def (remix:#%brackets phase0:layout thy)
|
||||||
|
v ...))]))]))
|
||||||
|
|
||||||
|
(define-syntax model
|
||||||
|
(singleton-struct
|
||||||
|
#:property prop:procedure
|
||||||
|
(λ (_ stx)
|
||||||
|
(raise-syntax-error 'model "Illegal outside def" stx))
|
||||||
|
#:methods remix:gen:def-transformer
|
||||||
|
[(define (def-transform _ stx)
|
||||||
|
(syntax-parse stx
|
||||||
|
#:literals (remix:#%brackets remix:def model)
|
||||||
|
[(remix:def (remix:#%brackets model thy:id mod:id)
|
||||||
|
(remix:#%brackets f:id v:expr) ...)
|
||||||
|
(syntax/loc stx
|
||||||
|
(remix:def (remix:#%brackets thy mod)
|
||||||
|
(remix:#%app
|
||||||
|
(remix:#%dot thy #:alloc)
|
||||||
|
(remix:#%brackets f v) ...)))]))]))
|
||||||
|
|
||||||
|
(provide theory
|
||||||
|
model)
|
||||||
|
|
||||||
;; xxx (dynamic-)interface
|
;; xxx (dynamic-)interface
|
||||||
;; xxx data
|
;; xxx data
|
||||||
|
|
|
@ -199,15 +199,18 @@
|
||||||
#:declare dt (static dot-transformer? "dot transformer")
|
#:declare dt (static dot-transformer? "dot transformer")
|
||||||
(dot-transform (attribute dt.value) stx)]))
|
(dot-transform (attribute dt.value) stx)]))
|
||||||
|
|
||||||
|
;; XXX This should work differently... add a method to dot-transformer
|
||||||
|
;; that has a sensible default and let it pass out a def block to put
|
||||||
|
;; around the apply.
|
||||||
(begin-for-syntax
|
(begin-for-syntax
|
||||||
(define-generics app-dot-transformer
|
(define-generics app-dot-transformer
|
||||||
(app-dot-transform app-dot-transformer stx)))
|
(app-dot-transform app-dot-transformer stx)))
|
||||||
(define-syntax (remix-#%app stx)
|
(define-syntax (remix-#%app stx)
|
||||||
(syntax-parse stx
|
(syntax-parse stx
|
||||||
#:literals (#%dot)
|
#:literals (#%dot)
|
||||||
[(_ (#%dot x ... (#%dot y ...)) . body)
|
[(_ (#%dot x ... (#%dot . y)) . body)
|
||||||
(syntax/loc stx
|
(syntax/loc stx
|
||||||
(remix-#%app (#%dot x ... y ...) . body))]
|
(remix-#%app (#%dot x ... . y) . body))]
|
||||||
[(_ (#%dot adt . (~not (x ... (#%dot . _) . _))) . body)
|
[(_ (#%dot adt . (~not (x ... (#%dot . _) . _))) . body)
|
||||||
#:declare adt (static app-dot-transformer? "app-dot transformer")
|
#:declare adt (static app-dot-transformer? "app-dot transformer")
|
||||||
(app-dot-transform (attribute adt.value) stx)]
|
(app-dot-transform (attribute adt.value) stx)]
|
||||||
|
|
|
@ -1,16 +1,4 @@
|
||||||
;; THEORIES + MODELS
|
;; THEORIES + MODELS
|
||||||
;; A theory is a specification of some values
|
|
||||||
(def [theory Monoid]
|
|
||||||
op id)
|
|
||||||
;; XXX specify properties
|
|
||||||
|
|
||||||
;; A model is an object that satisfies the theory
|
|
||||||
(def zero 0)
|
|
||||||
(def [model Monoid Nat+Monoid]
|
|
||||||
[op +]
|
|
||||||
;; XXX lift non-identifiers
|
|
||||||
[id zero])
|
|
||||||
;; XXX verify properties
|
|
||||||
|
|
||||||
;; INTERFACES + OBJECTS
|
;; INTERFACES + OBJECTS
|
||||||
;; An interface is just a vtable specification (theory)
|
;; An interface is just a vtable specification (theory)
|
||||||
|
|
37
remix/tests/data-ramble2.rkt
Normal file
37
remix/tests/data-ramble2.rkt
Normal file
|
@ -0,0 +1,37 @@
|
||||||
|
;; Interfaces & Objects
|
||||||
|
|
||||||
|
(def [interface 2d<%>]
|
||||||
|
translate
|
||||||
|
area)
|
||||||
|
|
||||||
|
(def [interface Circle<%>]
|
||||||
|
(layout-interface circle))
|
||||||
|
|
||||||
|
(def [class Circle]
|
||||||
|
#:layout circle
|
||||||
|
#:new
|
||||||
|
(λ (x y r)
|
||||||
|
(this.#:alloc [c (posn.#:alloc [x x] [y y])]
|
||||||
|
[r r]))
|
||||||
|
|
||||||
|
(layout-implements Circle<%>)
|
||||||
|
|
||||||
|
(def [implements 2d<%>]
|
||||||
|
[(translate x y)
|
||||||
|
{this.#:set
|
||||||
|
[c (this.c.#:set [x {x + this.c.x}]
|
||||||
|
[y {y + this.c.y}])]}]
|
||||||
|
[(area)
|
||||||
|
{3 * this.r * this.r}]))
|
||||||
|
|
||||||
|
(def [Circle C1] (Circle.#:new 1 2 3))
|
||||||
|
(module+ test
|
||||||
|
{C1.Circle<%>.c.x ≡ 1}
|
||||||
|
{C1.Circle<%>.c.y ≡ 2}
|
||||||
|
{C1.Circle<%>.r ≡ 3}
|
||||||
|
{(C1.2d<%>.area) ≡ 27}
|
||||||
|
(def [Circle C1′] (C1.2d<%>.translate 3 2))
|
||||||
|
{C1′.Circle<%>.c.x ≡ 4}
|
||||||
|
{C1′.Circle<%>.c.y ≡ 4}
|
||||||
|
{C1′.Circle<%>.r ≡ 3})
|
||||||
|
|
|
@ -509,3 +509,29 @@ def x4
|
||||||
{even1.o.e.o.o ≡ 1}
|
{even1.o.e.o.o ≡ 1}
|
||||||
{even1.o.e.o.e.e ≡ 0})
|
{even1.o.e.o.e.e ≡ 0})
|
||||||
|
|
||||||
|
;; Theories & Models
|
||||||
|
|
||||||
|
;; A theory is a specification of some values
|
||||||
|
;; XXX add parameters
|
||||||
|
(def [theory Monoid]
|
||||||
|
op id)
|
||||||
|
;; XXX specify properties
|
||||||
|
|
||||||
|
;; A model is an object that satisfies the theory
|
||||||
|
(def [model Monoid Monoid-Nat:+]
|
||||||
|
[op +]
|
||||||
|
[id 0])
|
||||||
|
;; XXX verify properties
|
||||||
|
|
||||||
|
(def [model Monoid Monoid-Nat:*]
|
||||||
|
[op *]
|
||||||
|
[id 1])
|
||||||
|
|
||||||
|
(module+ test
|
||||||
|
(def (monoid-id-test [Monoid m] a)
|
||||||
|
(≡ ((m.op) a m.id) ;; (#%app (#%dot m op) a (#%dot m id))
|
||||||
|
m.(op m.id a) ;; (#%app (#%dot m (#%app op (#%dot m id) a)))
|
||||||
|
;; => (#%app (#%app (#%dot m op)) (#%dot m id) a)
|
||||||
|
))
|
||||||
|
(monoid-id-test Monoid-Nat:+ 5)
|
||||||
|
(monoid-id-test Monoid-Nat:* 5))
|
||||||
|
|
Loading…
Reference in New Issue
Block a user