summaryrefslogtreecommitdiff
path: root/scheme
diff options
context:
space:
mode:
authorChaos Eternal <chaos@shlug.org>2017-08-24 18:54:20 +0800
committerChaos Eternal <chaos@shlug.org>2017-08-27 15:03:43 +0800
commite038c289b15d6895c78d7694c12e75129bd2f4aa (patch)
tree85bb38a58c1a8130e572f78c8f3410cc014207ff /scheme
parent6a83beef6b949bcc51ae56bff7bdb3acf67ae69b (diff)
downloadgeiser-chez-e038c289b15d6895c78d7694c12e75129bd2f4aa.tar.gz
geiser-chez-e038c289b15d6895c78d7694c12e75129bd2f4aa.tar.bz2
more reduction on geiser:eval, add test
Diffstat (limited to 'scheme')
-rw-r--r--scheme/chez/geiser/geiser.ss58
-rw-r--r--scheme/chez/geiser/test.ss90
2 files changed, 117 insertions, 31 deletions
diff --git a/scheme/chez/geiser/geiser.ss b/scheme/chez/geiser/geiser.ss
index ca50295..8b9aba7 100644
--- a/scheme/chez/geiser/geiser.ss
+++ b/scheme/chez/geiser/geiser.ss
@@ -34,37 +34,33 @@
(if module
(eval form (environment module))
(eval form))))
- (result-mid (call-with-values
- (lambda ()
- (call/cc
- (lambda (k)
- (with-exception-handler
- (lambda (e)
- (k 'error e))
- (lambda ()
- (call-with-values
- (lambda ()
- (body))
- (lambda (x . y)
- (if (null? y)
- (k 'single x)
- (k 'multi (cons x y))))))))))
- (lambda (t v)
- (cons t v))))
- (result (if (eq? (car result-mid) 'error)
- ""
- (with-output-to-string
- (lambda ()
- (pretty-print (cdr result-mid))))))
- (error (if (eq? (car result-mid) 'error)
- (cons 'error (list
- (cons 'key
- (with-output-to-string
- (lambda () (display-condition (cdr result-mid)))))))
- '())))
- (write `((result ,result)
- (output . "")
- ,error))
+ (gen-result (lambda (result-mid is-error?)
+ (if is-error?
+ `((result "")
+ (output . "")
+ (error . ,(list
+ (cons 'key
+ (with-output-to-string
+ (lambda ()
+ (display-condition result-mid)))))))
+ `((result ,(with-output-to-string
+ (lambda ()
+ (pretty-print result-mid))))
+ (output . "")))))
+ (result (call/cc
+ (lambda (k)
+ (with-exception-handler
+ (lambda (e)
+ (k (gen-result e #t)))
+ (lambda ()
+ (call-with-values
+ (lambda ()
+ (body))
+ (lambda (x . y)
+ (if (null? y)
+ (k (gen-result x #f))
+ (k (gen-result (cons x y) #f)))))))))))
+ (write result)
(newline)))
(define (geiser:module-completions prefix . rest)
diff --git a/scheme/chez/geiser/test.ss b/scheme/chez/geiser/test.ss
new file mode 100644
index 0000000..ac5503b
--- /dev/null
+++ b/scheme/chez/geiser/test.ss
@@ -0,0 +1,90 @@
+(import (geiser)
+ (chezscheme))
+
+
+(define-syntax get-result
+ (syntax-rules ()
+ ((_ form)
+ (with-output-to-string
+ (lambda ()
+ (geiser:eval #f form))))))
+
+(define-syntax do-test
+ (syntax-rules ()
+ ((_ form result)
+ (assert
+ (equal?
+ (get-result form)
+ result)))))
+
+;; (something-doesnot-exist)
+;;=> Error: Exception: variable something-doesnot-exist is not bound
+(do-test
+ '(something-doesnot-exist)
+ "((result \"\") (output . \"\") (error (key . \"Exception: variable something-doesnot-exist is not bound\")))\n"
+ )
+
+;; (make-violation)
+;;=> #<condition &violation>
+(do-test
+ '(make-violation)
+ "((result \"#<condition &violation>\\n\") (output . \"\"))\n")
+
+;; (values 1 2 3)
+;;==> (1 2 3)
+(do-test
+ '(values 1 2 3)
+ "((result \"(1 2 3)\\n\") (output . \"\"))\n")
+
+;; 1
+;;=> 1
+(do-test '1 "((result \"1\\n\") (output . \"\"))\n")
+
+
+;; '(case-lambda
+;; [(x1 x2) (+ x1 x2)]
+;; [(x1 x2 x3) (+ (+ x1 x2) x3)]
+;; [(x1 x2 . rest)
+;; ((letrec ([loop (lambda (x1 x2 rest)
+;; (let ([x (+ x1 x2)])
+;; (if (null? rest)
+;; x
+;; (loop x (car rest) (cdr rest)))))])
+;; loop)
+;; x1
+;; x2
+;; rest)]
+;; [(x1) (+ x1)]
+;; [() (+)])
+#|=> (case-lambda
+ [(x1 x2) (+ x1 x2)]
+ [(x1 x2 x3) (+ (+ x1 x2) x3)]
+ [(x1 x2 . rest)
+ ((letrec ([loop (lambda (x1 x2 rest)
+ (let ([x (+ x1 x2)])
+ (if (null? rest)
+ x
+ (loop x (car rest) (cdr rest)))))])
+ loop)
+ x1
+ x2
+ rest)]
+ [(x1) (+ x1)]
+ [() (+)])
+ |#
+(do-test (quote '(case-lambda
+ [(x1 x2) (+ x1 x2)]
+ [(x1 x2 x3) (+ (+ x1 x2) x3)]
+ [(x1 x2 . rest)
+ ((letrec ([loop (lambda (x1 x2 rest)
+ (let ([x (+ x1 x2)])
+ (if (null? rest)
+ x
+ (loop x (car rest) (cdr rest)))))])
+ loop)
+ x1
+ x2
+ rest)]
+ [(x1) (+ x1)]
+ [() (+)])) "((result \"(case-lambda\\n [(x1 x2) (+ x1 x2)]\\n [(x1 x2 x3) (+ (+ x1 x2) x3)]\\n [(x1 x2 . rest)\\n ((letrec ([loop (lambda (x1 x2 rest)\\n (let ([x (+ x1 x2)])\\n (if (null? rest)\\n x\\n (loop x (car rest) (cdr rest)))))])\\n loop)\\n x1\\n x2\\n rest)]\\n [(x1) (+ x1)]\\n [() (+)])\\n\") (output . \"\"))\n")
+