summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormichele.simionato <devnull@localhost>2009-01-29 18:53:59 +0000
committermichele.simionato <devnull@localhost>2009-01-29 18:53:59 +0000
commit9be94d5eed5fc099ec383a558d0b1f7e47db4668 (patch)
treec0cd14158549b9535e90aad16561b4e14da85012
parent5c682873e209811faa786562d13ef710807ab93a (diff)
downloadmicheles-9be94d5eed5fc099ec383a558d0b1f7e47db4668.tar.gz
Added two scripts
-rw-r--r--scheme/define-ct.ss20
-rw-r--r--scheme/table.sls31
2 files changed, 51 insertions, 0 deletions
diff --git a/scheme/define-ct.ss b/scheme/define-ct.ss
new file mode 100644
index 0000000..3d29380
--- /dev/null
+++ b/scheme/define-ct.ss
@@ -0,0 +1,20 @@
+(import (rnrs) (sweet-macros) (table) (ikarus))
+
+(def-syntax define-ct
+ (syntax-match (define)
+ (sub (define-ct kw (define name value) ...)
+ #'(define-syntax kw
+ (let ((t (tbl (name value) ...)))
+ (syntax-match (name ...)
+ (sub (kw name) (datum->syntax #'kw (t 'name))) ...))))))
+(define-ct example
+ (define x 1)
+ (define y (* x 2)))
+
+(pretty-print (syntax-expand
+(define-ct example
+ (define x 1)
+ (define y (* x 2)))))
+
+(display (list (example x) (example y)))
+
diff --git a/scheme/table.sls b/scheme/table.sls
new file mode 100644
index 0000000..55899e9
--- /dev/null
+++ b/scheme/table.sls
@@ -0,0 +1,31 @@
+(library (table)
+(export tbl table table-extend table-get)
+(import (rnrs) (sweet-macros) (only (ikarus) gensym))
+
+(def-syntax (tbl (name value) ...)
+ #'(letrec ((name value) ...)
+ (table (list (list 'name name) ...))))
+
+(def-syntax (table-get t key else0 else1 ...)
+ #'(let ((res (t key)))
+ (if (missing-key? res)
+ (begin else0 else1 ...)
+ res)))
+
+(define MISSING-KEY (gensym 'missing-key))
+
+(define (missing-key? x)
+ (eq? x MISSING-KEY))
+
+(define append-unique append)
+
+(define (table alist)
+ (define full-list (append-unique (list (list '->alist alist)) alist))
+ (lambda (k)
+ (define ls (assq k full-list))
+ (if ls (cadr ls) MISSING-KEY)))
+
+(define (table-extend base-table ext)
+ (table (append (base-table '->alist) ext)))
+
+)