summaryrefslogtreecommitdiff
path: root/module/language/javascript.scm
diff options
context:
space:
mode:
authorIan Price <ianprice90@googlemail.com>2015-06-24 19:57:28 +0100
committerIan Price <ianprice90@googlemail.com>2015-06-24 19:57:28 +0100
commit89029a54f43e7698e7ddb5f72ada4c44ec5a1c68 (patch)
treee9619428de3e67d425f09541090e806a3ecd6071 /module/language/javascript.scm
parentb631576f13677e7834a9604ee6b664f0ff2acc06 (diff)
downloadguile-89029a54f43e7698e7ddb5f72ada4c44ec5a1c68.tar.gz
Explicitly test for undefined arguments to handle false values like 0
Diffstat (limited to 'module/language/javascript.scm')
-rw-r--r--module/language/javascript.scm39
1 files changed, 36 insertions, 3 deletions
diff --git a/module/language/javascript.scm b/module/language/javascript.scm
index 741282a61..8829b3be0 100644
--- a/module/language/javascript.scm
+++ b/module/language/javascript.scm
@@ -15,6 +15,8 @@
make-branch branch
make-var var
make-binop binop
+ make-ternary ternary
+ make-prefix prefix
print-statement))
@@ -59,6 +61,8 @@
(define-js-type branch test then else)
(define-js-type var id exp)
(define-js-type binop op arg1 arg2)
+(define-js-type ternary test then else)
+(define-js-type prefix op expr)
(define (unparse-js exp)
(match exp
@@ -85,7 +89,12 @@
(($ var id exp)
`(var ,id ,(unparse-js exp)))
(($ binop op arg1 arg2)
- `(binop ,op ,(unparse-js arg1) ,(unparse-js arg2)))))
+ `(binop ,op ,(unparse-js arg1) ,(unparse-js arg2)))
+ (($ ternary test then else)
+ `(ternary ,(unparse-js test) ,(unparse-js then) ,(unparse-js else)))
+ (($ prefix op expr)
+ `(prefix ,op ,(unparse-js expr)))
+ ))
(define (print-exp exp port)
(match exp
@@ -136,17 +145,41 @@
(print-binop op port)
(display "(" port)
(print-exp arg2 port)
- (display ")" port))))
+ (display ")" port))
+
+ (($ ternary test then else)
+ (display "(" port)
+ (print-exp test port)
+ (display ") ? (" port)
+ (print-exp then port)
+ (display ") : (" port)
+ (print-exp else port)
+ (display ")" port))
+
+ (($ prefix op exp)
+ (print-prefix op port)
+ (display "(" port)
+ (print-exp exp port)
+ (display ")" port))
+ ))
(define (print-binop op port)
(case op
((or) (display "||" port))
((and) (display "&&" port))
((=) (display "==" port))
- ((+ - < <= > >=) (format port "~a" op))
+ ((+ - < <= > >= ===) (format port "~a" op))
(else
(throw 'unprintable-binop op))))
+(define (print-prefix op port)
+ (case op
+ ((not) (display "!" port))
+ ((typeof + -)
+ (format port "~a" op))
+ (else
+ (throw 'unprintable-prefix op))))
+
(define (print-statement stmt port)
(match stmt
(($ var id exp)