89 lines
2.3 KiB
Racket
89 lines
2.3 KiB
Racket
#lang at-exp racket/base
|
|
|
|
(require racket/sandbox
|
|
racket/port
|
|
rackunit
|
|
honu/core/read)
|
|
|
|
(define honu-eval (make-parameter (lambda args (error 'honu-eval "set the honu evaluator"))))
|
|
(define (make-honu-evaluator)
|
|
(call-with-trusted-sandbox-configuration
|
|
(lambda ()
|
|
(make-evaluator 'honu))))
|
|
|
|
(define (honu . input)
|
|
(with-input-from-string (apply string-append input)
|
|
(lambda ()
|
|
((honu-eval) (honu-read-syntax)))))
|
|
|
|
(define-syntax-rule (honu-tests checks ...)
|
|
(parameterize ([honu-eval (make-honu-evaluator)]) checks ...))
|
|
|
|
(honu-tests
|
|
(check-equal? @honu{1} 1)
|
|
(check-equal? @honu{5} 5)
|
|
(check-equal? @honu{1 + 1} (+ 1 1))
|
|
(check-equal? @honu{1 + 2 * 3} (+ 1 (* 2 3)))
|
|
(check-equal? @honu{3 * 2 + 1} (+ (* 3 2) 1))
|
|
(check-equal? @honu{1 + 4 ^ 2 * 3} (+ 1 (* (expt 4 2) 3)))
|
|
(check-equal? @honu{1 + 4 ^ 3 ^ 2} (+ 1 (expt 4 (expt 3 2))))
|
|
(check-equal? @honu{4 ^ 3 ^ 2 + 1} (+ (expt 4 (expt 3 2)) 1))
|
|
|
|
(check-equal? @honu{
|
|
var n = 5
|
|
cond
|
|
n < 10: 'x1,
|
|
n > 10: 'x2
|
|
}
|
|
'x1)
|
|
|
|
(check-equal? @honu{
|
|
if (2 > 1)
|
|
1
|
|
else
|
|
0
|
|
}
|
|
1)
|
|
|
|
(check-equal? @honu{
|
|
var x = 12
|
|
x *= 2
|
|
x -= 5
|
|
x
|
|
}
|
|
(- (* 12 2) 5))
|
|
|
|
(check-equal? @honu{[x + 1: x = [1, 2, 3]]} '(2 3 4))
|
|
(check-equal? @honu{[x + y: x = [1, 2, 3], y = [4, 5, 6]]} '(5 7 9))
|
|
)
|
|
|
|
(honu-tests
|
|
(check-equal? @honu{function foo(x){
|
|
x * 2
|
|
}
|
|
foo(5)
|
|
}
|
|
10)
|
|
|
|
(check-equal? @honu{
|
|
unary_operator u1 4 function(x){ x * 2}
|
|
u1 8
|
|
}
|
|
|
|
(* 8 2))
|
|
|
|
(check-equal? @honu{
|
|
unary_operator u1 4 function(x){ x * 2}
|
|
2 + u1 8 * 3
|
|
}
|
|
|
|
(+ 2 (* 3 (* 8 2))))
|
|
|
|
(check-equal? @honu{
|
|
binary_operator b1 4 'left function(left, right){ left + right * 2}
|
|
2 b1 4
|
|
}
|
|
|
|
(+ 2 (* 2 4)))
|
|
)
|