(define (test-apply fn buf . args)
(define result '())
(buf-mark! buf)
- (call/cc
- (lambda (cont)
- (with-exception-handler
- (lambda (x) (cont '()))
- (lambda () (set! result (apply fn (append buf args)))))))
+ (set! result
+ (call/cc
+ (lambda (cont)
+ (with-exception-handler
+ (lambda (x) (cont '()))
+ (lambda () (apply fn (append (list buf) args)))))))
(buf-release! buf)
(not (null? result)))
(abort "Expected a literal"))
(syntree (token-type tok) (token-text tok) '()))
-(define (dlang/arg-list in) '())
+(define (dlang/arg-list in)
+ (define tree (syntree 'arglist "" '()))
+ (define chldrn '())
+ (token-match in 'lpar)
+ (if (not (token-matches? in 'rpar))
+ (begin
+ (set! chldrn
+ (append chldrn (list (dlang/expression in))))
+ (while (not (token-matches? in 'rpar))
+ (token-match in 'comma)
+ (set! chldrn
+ (append chldrn (list (dlang/expression in)))))))
+ (token-match in 'rpar)
+ (syntree-children-set! tree chldrn)
+ tree)
(define (dlang/arg-list? in)
(test-apply dlang/arg-list in))
; dlang/arg-list
;------------------------------------------------------------------------------
+(def-test "dlang/arg-list should recognize an empty id list"
+ (call-with-input-string "()"
+ (lambda (input)
+ (define lxr (make-lexer input))
+ (define result (dlang/arg-list lxr))
+ (syntree=? result (syntree 'arglist "" '())))))
+
+(def-test "dlang/arg-list should recognize an arg list of length 1"
+ (call-with-input-string "(a)"
+ (lambda (input)
+ (define lxr (make-lexer input))
+ (define result (dlang/arg-list lxr))
+ (syntree=? result
+ (syntree 'arglist ""
+ (list (syntree 'id "a" '())))))))
+
+(def-test "dlang/arg-list should recognize an arg list of length 2"
+ (call-with-input-string "(a,1.0)"
+ (lambda (input)
+ (define lxr (make-lexer input))
+ (define result (dlang/arg-list lxr))
+ (syntree=? result
+ (syntree 'arglist ""
+ (list
+ (syntree 'id "a" '())
+ (syntree 'number "1.0" '())))))))
+
+(def-test "dlang/arg-list should recognize an arg list of length 3"
+ (call-with-input-string "(a,1.0,$c)"
+ (lambda (input)
+ (define lxr (make-lexer input))
+ (define result (dlang/arg-list lxr))
+ (syntree=? result
+ (syntree 'arglist ""
+ (list
+ (syntree 'id "a" '())
+ (syntree 'number "1.0" '())
+ (syntree 'symbol "$c" '())))))))
+
+; dlang/arg-list?
+;------------------------------------------------------------------------------
+(def-test "dlang/arg-list? should return true if input contains an arg list"
+ (call-with-input-string "(a, 1.0, $c)"
+ (lambda (input)
+ (define lxr (make-lexer input))
+ (equal? #t (dlang/arg-list? lxr)))))
+
+(def-test "dlang/arg-list? should return false if input does not contain an arg list"
+ (call-with-input-string "(a b c)"
+ (lambda (input)
+ (define lxr (make-lexer input))
+ (equal? #f (dlang/arg-list? lxr)))))
; dlang/id-list
;------------------------------------------------------------------------------