REBOL [
	title: "Math-do"
	author: "Frank Sievertsen"
	version: 1.0.0
]

if not value? 'parser [
	;do http://proton.cl-ki.uni-osnabrueck.de/REBOL/parser.r
	do http://www.rebolforces.com/fx5/REBOL/parser.r
]

context [
	math-do-parser: make parser [rules: [
		expr: [sum]
		sum: [prod any [['+ | '-] prod]]
		prod: [pow any [['* | slash] pow]]
		pow: [val any ['** val]]
		val: [opt ['-] [integer! | word! | get-word! | into [expr]]]

		slash: to-lit-word "/"
	]]

	math-do-observer: math-do-parser/add-observer [
		val: [do mem]
		pow: [do mem]
		prod: [do mem]
		sum: [do mem]
		expr: [do mem]
	]

	set 'math-do func [[catch]
		calc [block!]
	] [
		throw-on-error [
			math-do-parser/run calc expr
		] 
		math-do-observer/out/1
	]
]
