aboutsummaryrefslogtreecommitdiff
path: root/racket/circuits/hypergraph.rkt
diff options
context:
space:
mode:
Diffstat (limited to 'racket/circuits/hypergraph.rkt')
-rw-r--r--racket/circuits/hypergraph.rkt36
1 files changed, 36 insertions, 0 deletions
diff --git a/racket/circuits/hypergraph.rkt b/racket/circuits/hypergraph.rkt
new file mode 100644
index 0000000..e0496e4
--- /dev/null
+++ b/racket/circuits/hypergraph.rkt
@@ -0,0 +1,36 @@
+#lang racket
+
+;; Top-level syntax transformer
+;; displays hypergraph after evaluating module
+(define-syntax-rule (hypergraph-mb expr ...)
+ (#%module-begin
+ expr
+ ...
+ (displayln `(hypergraph ,node-num))
+ (for-each displayln graph)))
+
+;; Need application, quotation, and defines
+(provide quote define #%app)
+
+;; As well as #%module-begin implicit form
+(provide
+ (rename-out
+ [hypergraph-mb #%module-begin]))
+
+;; Internal state
+(define graph empty)
+(define node-num 0)
+
+;; Create a fresh node
+(define (new-node)
+ (let ([fresh-num node-num])
+ (set! node-num (+ node-num 1))
+ fresh-num))
+
+;; Create a new hyperedge
+(define (new-edge label . nodes)
+ (set! graph (cons (cons label nodes) graph)))
+
+;; User code constructs hypergraph using
+;; new-node and new-edge
+(provide new-node new-edge)