summaryrefslogtreecommitdiff
path: root/vikalpa.scm
diff options
context:
space:
mode:
Diffstat (limited to 'vikalpa.scm')
-rw-r--r--vikalpa.scm34
1 files changed, 23 insertions, 11 deletions
diff --git a/vikalpa.scm b/vikalpa.scm
index 78b751a..dab81b2 100644
--- a/vikalpa.scm
+++ b/vikalpa.scm
@@ -233,11 +233,7 @@
;; (expression? x) -> boolean?
(define (expression? expr)
- (cond ((expr-quoted? expr)
- (or (exact-integer? (expr-unquote expr))
- (boolean? (expr-unquote expr))
- (symbol? (expr-unquote expr))
- (null? (expr-unquote expr))))
+ (cond ((expr-quoted? expr) #t)
((if-form? expr)
(and (expression? (if-form-test expr))
(expression? (if-form-then expr))
@@ -668,6 +664,7 @@
(and (pair? x)
(eq? 'error (car x))))
+
(define (rewrite/eval expr sys)
(let eval ((expr expr))
(cond
@@ -676,14 +673,29 @@
((app-form? expr)
(let ((args (map eval (app-form-args expr)))
(name (app-form-name expr)))
+ (define (guard-ok? vars form g)
+ (let ((result (eval (apply-rule '()
+ (rule vars '() form g)
+ `(,name ,@args)
+ '()))))
+ (if (error? result)
+ result
+ (expr-unquote result))))
(cond
((find error? args) => identity)
- (else
- (eval (rewrite1 sys
- `(,name ,@args)
- (lambda args
- (cons* 'error 'rewrite name args))
- `(rewrite () ,name)))))))
+ ((lookup name sys)
+ => (lambda (f)
+ (let ((gs (get-guards f))
+ (vars (get-variables f))
+ (form (defined-function-app-form f)))
+ (if (every (lambda (g) (guard-ok? vars form g)) gs)
+ (eval (rewrite1 sys
+ `(,name ,@args)
+ (lambda args
+ (cons* 'error 'rewrite name args))
+ `(rewrite () ,name)))
+ `(error guard-error (,name ,@args) (and ,@gs))))))
+ (else `(error function not-found)))))
((if-form? expr)
(let ((test (eval (if-form-test expr))))
(if (error? test)