racket/collects/redex/examples/arithmetic.ss
2009-11-13 18:16:07 +00:00

60 lines
1.3 KiB
Scheme

#lang scheme
(require redex)
(define-language lang
(e (binop e e)
(sqrt e)
number)
(binop +
-
*
/)
(e-ctxt (binop e e-ctxt)
(binop e-ctxt e)
(sqrt e-ctxt)
hole)
(v number))
(define reductions
(reduction-relation
lang
(c--> (+ number_1 number_2)
,(+ (term number_1) (term number_2))
"add")
(c--> (- number_1 number_2)
,(- (term number_1) (term number_2))
"subtract")
(c--> (* number_1 number_2)
,(* (term number_1) (term number_2))
"multiply")
(c--> (/ number_1 number_2)
,(/ (term number_1) (term number_2))
"divide")
(c-->(sqrt number_1)
,(sqrt (term number_1))
"sqrt")
with
[(--> (in-hole e-ctxt_1 a) (in-hole e-ctxt_1 b))
(c--> a b)]))
(define traces-file
(make-temporary-file "traces~a.ps"))
(traces/ps reductions (term (- (* (sqrt 36) (/ 1 2)) (+ 1 2)))
traces-file)
;; Check for the command line flag --no-print
;; If it's set, don't print the temporary file name,
;; This flag is so that DrDr can avoid seeing a change here.
;; -- samth
(define print-name?
(let ([print? #t])
(command-line
#:once-each
["--no-print" "omit printing of file name" (set! print? #f)])
print?))
(when print-name?
(printf "Traces are in ~a~n" traces-file))