\ 4tH equation solver - Copyright 2007,2009 J.L. Bezemer \ You can redistribute this file and/or modify it under \ the terms of the GNU General Public License 1 constant BadTerm \ an invalid term has been entered false value right? \ are we on the right side? variable Snum \ variable holding numbers variable Sx \ variable holding x terms \ apply sign : ?negate if negate then ; ( n f -- n | -n) : ?sign swap ?negate false swap ; ( f n -- -f n | -f -n) : ?error catch if ." Invalid equation" cr quit then ; : .intermediate over over 0 .r ." x = " . cr ; : .solution /mod ." x = " 0 .r dup if ." , remainder " . else drop then cr ; : prompt ." Enter an equation (e.g. 2x - 10 = 0)" cr cr refill drop ; : +n right? 0= ?negate ?sign Snum +! ; ( n --) : +x right? ?negate ?sign Sx +! ; ( n --) : x? 1- 2dup chars + c@ [char] x = ; ( a1 n1 -- a1 n1-1 f) : #x dup 0= if 2drop 1 else number then ; : c= >r 1 = swap c@ r> = and ; ( a n c -- f) : is-minus [char] - c= dup >r if drop true then r> 0= ; : is-plus [char] + c= 0= ; ( a n -- f) : is-number number error? dup >r if drop else +n then r> ; : is-equal [char] = c= dup if dup to right? then 0= ; : is-x x? if #x error? if drop else +x false exit then else 2drop then true ; \ resolve term : term ( a n --) 2>r \ throw term on stack 2r@ is-minus if \ is it a minus sign 2r@ is-plus if \ is it a plus sign 2r@ is-x if \ is it an x term 2r@ is-number if \ is it a number 2r@ is-equal if BadTerm throw then then \ if not, it is an illegal term then then then 2r> 2drop \ clear the return stack ; \ decompose all terms : decompose false begin bl parse-word dup while term repeat 2drop drop ; : solve 0 dup Sx ! Snum ! decompose Snum @ Sx @ .intermediate .solution ; : equation prompt ['] solve ?error ; ( --) \ prompt for an equation and solve it equation