(define (dlang/core-form in)
(define tok (buf-lookahead! in 1))
- (cond (token-text tok)
- (("def") (dlang/define in))
- (("set!") (dlang/assign in))
- (("if") (dlang/if in))
- (("begin") (dlang/begin in))
- (("func") (dlang/func in))))
-
-(define (dlang/core-form? in) #f)
- ;(define tok (buf-lookahead! in 1))
- ;(cond (token-text tok)
- ; (("def" "set!" "if" "begin" "func") #t)
- ; (else #f)))
+ (define text (if (eof-object? tok) "" (token-text tok)))
+ (cond
+ ((string=? text "def") (dlang/define in))
+ ((string=? text "set!") (dlang/assign in))
+ ((string=? text "if") (dlang/if in))
+ ((string=? text "begin") (dlang/begin in))
+ ((string=? text "func") (dlang/func in))
+ (else (error "Expected a core form"))))
+
+(define (dlang/core-form? in)
+ (define tok (buf-lookahead! in 1))
+ (define text (if (eof-object? tok) "" (token-text tok)))
+ (or (string=? text "def")
+ (string=? text "set!")
+ (string=? text "if")
+ (string=? text "begin")
+ (string=? text "func")))
(define (dlang/define in)
(define node '())
; dlang/core-form
;------------------------------------------------------------------------------
+(def-test "dlang/define should parse a variable definition"
+ (call-with-input-string "def foo 1.0;"
+ (lambda (input)
+ (define lxr (make-lexer input))
+ (define result (dlang/core-form lxr))
+ (syntree=? result
+ (syntree 'define ""
+ (list
+ (syntree 'id "foo" '())
+ (syntree 'number "1.0" '())))))))
+
+(def-test "dlang/core-form should parse a variable assignment"
+ (call-with-input-string "set! foo 1.0;"
+ (lambda (input)
+ (define lxr (make-lexer input))
+ (define result (dlang/core-form lxr))
+ (syntree=? result
+ (syntree 'assign ""
+ (list
+ (syntree 'id "foo" '())
+ (syntree 'number "1.0" '())))))))
+
+(def-test "dlang/core-form should parse an if statement"
+ (call-with-input-string "if cond result1;"
+ (lambda (input)
+ (define lxr (make-lexer input))
+ (define result (dlang/core-form lxr))
+ (syntree=? result
+ (syntree 'if ""
+ (list
+ (syntree 'id "cond" '())
+ (syntree 'id "result1" '())))))))
+
+(def-test "dlang/core-form should parse a begin block"
+ (call-with-input-string "begin;"
+ (lambda (input)
+ (define lxr (make-lexer input))
+ (define result (dlang/core-form lxr))
+ (syntree=? result
+ (syntree 'begin "" '())))))
+
+(def-test "dlang/core-form should parse a func"
+ (call-with-input-string "func();"
+ (lambda (input)
+ (define lxr (make-lexer input))
+ (define result (dlang/core-form lxr))
+ (syntree=? result
+ (syntree 'func ""
+ (list
+ (syntree 'args "" '())
+ (syntree 'block "" '())))))))
; dlang/define
;------------------------------------------------------------------------------
; dlang/assign
;------------------------------------------------------------------------------
-(def-test "dlang/assign should parse a variable definition"
+(def-test "dlang/assign should parse a variable assignment"
(call-with-input-string "set! foo 1.0;"
(lambda (input)
(define lxr (make-lexer input))