summaryrefslogtreecommitdiff
path: root/scheme/experimental
diff options
context:
space:
mode:
authormichele.simionato <devnull@localhost>2009-05-05 04:40:29 +0000
committermichele.simionato <devnull@localhost>2009-05-05 04:40:29 +0000
commitf188590543d380845406892027714fa7cc750bd1 (patch)
tree03fdf9340a4deb68e0452bf391cfdec409bff0f5 /scheme/experimental
parentf840a4130daf07527fb7cc4d334007001559e855 (diff)
downloadmicheles-f188590543d380845406892027714fa7cc750bd1.tar.gz
My experiments with side-effects and separate compilation
Diffstat (limited to 'scheme/experimental')
-rw-r--r--scheme/experimental/define+.sls23
-rw-r--r--scheme/experimental/defines.sls11
-rw-r--r--scheme/experimental/registry.sls2
-rw-r--r--scheme/experimental/use-defines.ss5
4 files changed, 41 insertions, 0 deletions
diff --git a/scheme/experimental/define+.sls b/scheme/experimental/define+.sls
new file mode 100644
index 0000000..2e0b21b
--- /dev/null
+++ b/scheme/experimental/define+.sls
@@ -0,0 +1,23 @@
+#!r6rs
+(library (experimental define+)
+(export define-registered define+)
+(import (rnrs) (for (experimental registry) expand))
+
+;; save the content of the expand-time registry into a runtime definition
+(define-syntax define-registered
+ (lambda (x)
+ (syntax-case x ()
+ ((define-registered names)
+ #`(define names '#,(registry))))))
+
+(define-syntax define+
+ (lambda (x)
+ (syntax-case x ()
+ ((define+ name value)
+ #'(begin
+ ;; dirty trick to get an expand time side effect
+ (define-syntax dummy (begin (register #'name) (lambda (x) #f)))
+ ;; the real definition
+ (define name value))))))
+
+)
diff --git a/scheme/experimental/defines.sls b/scheme/experimental/defines.sls
new file mode 100644
index 0000000..4dc65cd
--- /dev/null
+++ b/scheme/experimental/defines.sls
@@ -0,0 +1,11 @@
+#!r6rs
+(library (experimental defines)
+(export a b visit-defines)
+(import (rnrs) (experimental define+))
+
+(define-syntax visit-defines
+ (lambda (x) "visited"))
+(define+ a 1)
+(define+ b 2)
+)
+
diff --git a/scheme/experimental/registry.sls b/scheme/experimental/registry.sls
index c8f06c1..e34c027 100644
--- a/scheme/experimental/registry.sls
+++ b/scheme/experimental/registry.sls
@@ -12,4 +12,6 @@
(printf "registering ~a\n" id)
(set! _registry (append _registry (list id)))
_registry)
+
+(display "registry instantiated\n")
)
diff --git a/scheme/experimental/use-defines.ss b/scheme/experimental/use-defines.ss
new file mode 100644
index 0000000..7d65148
--- /dev/null
+++ b/scheme/experimental/use-defines.ss
@@ -0,0 +1,5 @@
+(import (rnrs) (experimental define+) (experimental defines))
+(visit-defines)
+(define-registered names)
+(display names)
+(display (list a b));; just to use the names defined in defines