(use-modules (thales seal))
(sealed string-starts-with
- (& "foo" "fo" => #t)
- (& "fo" "foo" => #f)
- (& "f" #\c -->))
+ ([& "foo" "fo"] => #t)
+ ([& "fo" "foo"] => #f)
+ ([& "f" #\c] !-->))
(define (string-starts-with str prefix)
(define prefix-length (string-length prefix))
(equal? prefix (substring str 0 prefix-length))))
(sealed string-strip-prefix
- (& "foo" "f" => "oo")
- (& "bar" "f" => "bar"))
+ ([& "foo" "f"] => "oo")
+ ([& "bar" "f"] => "bar"))
(define (string-strip-prefix str prefix)
(if (string-starts-with str prefix)
str))
(sealed string-empty?
- (& "fo" => #f)
- (& "" => #t))
+ ([& "fo"] => #f)
+ ([& ""] => #t))
(define (string-empty? str) (equal? str ""))
(sealed relpath->module-name
- (& "/foo/bar/baz.scm" => (foo bar baz))
- (& "foo/bar/baz" => (foo bar baz)))
+ ([& "/foo/bar/baz.scm"] => '(foo bar baz))
+ ([& "foo/bar/baz"] => '(foo bar baz)))
(define* (relpath->module-name path)
(map (compose string->symbol #[basename <> ".scm"])
(filter (negate string-empty?) (string-split path #\/))))
(eq? (stat:type st) 'regular))
(sealed have-extension?
- (& "foo.foo" ".foo" => #t)
- (& "barfoo" ".foo" => #f))
+ ([& "foo.foo" ".foo"] => #t)
+ ([& "barfoo" ".foo"] => #f))
(define (have-extension? str ext)
(not (equal? str (basename str ext))))
(define-module (thales seal)
#:export (sealed))
+(use-modules (thales syntax))
(use-modules (ice-9 match))
(use-modules (srfi srfi-1))
(use-modules (srfi srfi-26))
-(eval-when (eval load compile)
- (read-hash-extend #\[
- (lambda (ch stream)
- (unread-char ch stream)
- (cons 'cute (read stream)))))
-
(define-syntax push
(syntax-rules ()
((_ val list)
(unless throw-handler-called
(apply <on-values> args))))))))
-(define-syntax seal-clause
- (syntax-rules (=> -->)
- ((_ <form>) (seal-clause <form> => #t))
- ((_ <form> => <val> <vals> ... )
- (let ((expected (cons 'values '(<val> <vals> ...))))
- (call-and-catch <form>
+(define-syntax seal-clause-expect-values
+ (syntax-rules ()
+ ([_ <form> (<val> ...)]
+ (let* ((expected (list 'values <val> ...))
+ (error:handle #[error:broken-seal '<form> expected]))
+ (call-and-catch <form>
+ (lambda args
+ (unless (equal? args (cdr expected))
+ (error:handle (cons 'values args))))
+ (lambda throw-args
+ (error:handle (cons 'throw throw-args))))))))
+
+(define-syntax seal-clause-expect-throw
+ (syntax-rules ()
+ ([_ <form> (<val> ...)]
+ (let* ((expected (list 'throw <val> ...))
+ (error:handle #[error:broken-seal '<form>
+ (append expected '(....))]))
+ (call-and-catch <form>
(lambda args
- (unless (equal? args (cdr expected))
- (error:broken-seal '<form>
- expected
- (cons 'values args))))
- (lambda throw-args
- (error:broken-seal '<form>
- expected
- (cons 'throw throw-args))))))
- ((_ <form> <forms> ... => <val> <vals> ...)
- (seal-clause (<form> <forms> ...) => <val> <vals> ...))
- ((_ <form> --> <val> ...)
- (let ((expected (cons 'throw '(<val> ...))))
- (call-and-catch <form>
- (lambda args
- (error:broken-seal '<form>
- (append expected '(....))
- (cons 'values args)))
- (lambda throw-args
- (unless (and (<= (length (cdr expected)) (length throw-args))
- (every equal? (cdr expected) throw-args))
- (error:broken-seal '<form>
- (append expected '(....))
- (cons 'throw throw-args)))))))
- ((_ <form> <forms> ... --> <val> ...)
- (seal-clause (<form> <forms> ...) --> <val> ...))
- ((_ obj ...)
- (error "Macro seal-clause usage:
-Assert, that evaluation of EXPR returns value(s).
- (seal-clause expr => value [values])
-Assert, that evaluation of EXPR is #t
- (seal-clause expr)
-Assert, that evaluation of EXPR throws with argument list, starting with value(s)
- (seal-clause expr --> value [values])
-In particular, (seal-clause expr -->) asserts, that EXPR throws something."))))
+ (error:handle (cons 'values args)))
+ (lambda throw-args
+ (define (throw-args-match expected-args actual-args)
+ (and (<= (length expected-args) (length actual-args))
+ (every equal? expected-args actual-args)))
+ (unless (throw-args-match (cdr expected) throw-args)
+ (error:handle (cons 'throw throw-args)))))))))
+
+;; (define-syntax paaqqck-forms
+;; (syntax-rules ()
+;; (_ <form>)
+;; )
+;; )
+(define-syntax seal-clause
+ (syntax-rules (=> !-->)
+ ([_ <form> => <val> ...]
+ (seal-clause-expect-values <form> (<val> ...)))
+ ([_ <form> !--> <val> ...]
+ (seal-clause-expect-throw <form> (<val> ...)))
+ ([_ <form>]
+ (seal-clause-expect-values <form> (#t)))))
+
+;; (define-syntax seal-clause
+;; (syntax-rules (=> !-->)
+;; ((_ <form> => <val> <vals> ... )
+;; (let ((expected (cons 'values '(<val> <vals> ...))))
+;; 'CLAUSE-1
+;; (call-and-catch <form>
+;; (lambda args
+;; (unless (equal? args (cdr expected))
+;; (error:broken-seal '<form>
+;; expected
+;; (cons 'values args))))
+;; (lambda throw-args
+;; (error:broken-seal '<form>
+;; expected
+;; (cons 'throw throw-args))))))
+;; ((_ <form> <forms> ... => <val> <vals> ...)
+;; (seal-clause (<form> <forms> ...) => <val> <vals> ...))
+;; ((_ <form> !--> <val> ...)
+;; (let ((expected (cons 'throw '(<val> ...))))
+;; 'CLAUSE-2
+;; (call-and-catch <form>
+;; (lambda args
+;; (error:broken-seal '<form>
+;; (append expected '(....))
+;; (cons 'values args)))
+;; (lambda throw-args
+;; (unless (and (<= (length (cdr expected)) (length throw-args))
+;; (every equal? (cdr expected) throw-args))
+;; (error:broken-seal '<form>
+;; (append expected '(....))
+;; (cons 'throw throw-args)))))))
+;; ((_ <form> ... !--> <val> <vals> ...)
+;; #f
+;; ;; (let ('CLAUSE-X)
+;; ;; (seal-clause (<form> ...) !--> <val> ...))
+;; )
+;;; ((_ <form> ...) (seal-clause <form> ... => #t))
+;; ((_ obj ...)
+;; (error "Macro seal-clause usage:
+;; Assert, that evaluation of EXPR returns value(s).
+;; (seal-clause expr => value [values])
+;; Assert, that evaluation of EXPR is #t
+;; (seal-clause expr)
+;; Assert, that evaluation of EXPR throws with argument list, starting with value(s)
+;; (seal-clause expr --> value [values])
+;; In particular, (seal-clause expr -->) asserts, that EXPR throws something."))
+
+;; ))
(define-syntax sealed