\ 4tH deskcalculator - (c) 1997,2008 HanSoft & Partners
[needs lib/interprt.4th]
\ In this section the exceptions are defined
\ and several routines that handle them
1 constant #UndefName
2 constant #BadVariable
8 constant #variables
#variables array variables
: variable? \ is it a valid variable?
dup #variables 1- invert and ( n f)
if #BadVariable throw else cells variables + then
;
\ Here all internal commands are listed
\ and placed inside the dictionary.
\ Checking is done by the routines above.
\ Note: there are aliases!
: +_ + ; \ + command
: -_ - ; \ - command
: *_ * ; \ * command
: /_ / ; \ / command
: ._ . ; \ . command
: .r_ .r ; \ .r command
: drop_ drop ; \ drop command
: dup_ dup ; \ dup command
: rot_ rot ; \ rot command
: /mod_ /mod ; \ /mod command
: */_ */ ; \ */ command
: */mod_ */mod ; \ */mod command
: swap_ swap ; \ swap command
: over_ over ; \ over command
: !_ variable? ! ; \ ! command
: +!_ variable? +! ; \ +! command
: @_ variable? @ ; \ @ command
: ?_ variable? ? ; \ ? command
: mod_ mod ; \ mod command
: abs_ abs ; \ abs command
: negate_ negate ; \ negate command
: invert_ invert ; \ invert command
: min_ min ; \ min command
: max_ max ; \ max command
: or_ or ; \ or command
: xor_ xor ; \ xor command
: and_ and ; \ and command
: lshift_ lshift ; \ lshift command
: rshift_ rshift ; \ rshift command
: inc 1+ ; \ inc command
: dec 1- ; \ dec command
: 2*_ 2* ; \ 2* command
: 2/_ 2/ ; \ 2/ command
: spaces_ spaces ; \ spaces command
: emit_ emit ; \ emit command
: base! 36 min 2 max base ! ; \ base command
: decimal_ decimal ; \ decimal command
: hex_ hex ; \ hex command
: octal_ octal ; \ octal command
: binary 2 base! ; \ binary command
: depth_ depth ; \ depth command
: bye quit ; \ quit command
: dummy ; \ dummy command
: space_ space ; \ space command
: random_ random ; \ random command
: cr_ cr ; \ cr command
: A. 0 ; \ variable A
: B. 1 ; \ variable B
: C. 2 ; \ variable C
: D. 3 ; \ variable D
: E. 4 ; \ variable E
: F. 5 ; \ variable F
: G. 6 ; \ variable G
: H. 7 ; \ variable H
: .(_ 41 parse type ; \ .( command
: (_ 41 parse drop drop ; \ ( command
: char_ bl parse drop c@ ; \ char command
: time_ time ; \ time command
create wordlist \ dictionary
," +" ' +_ ,
," th" ' +_ ,
," -" ' -_ ,
," *" ' *_ ,
," /" ' /_ ,
," quit" ' bye ,
," bye" ' bye ,
," q" ' bye ,
," ." ' ._ ,
," .r" ' .r_ ,
," drop" ' drop_ ,
," dup" ' dup_ ,
," rot" ' rot_ ,
," swap" ' swap_ ,
," over" ' over_ ,
," A." ' A. ,
," B." ' B. ,
," C." ' C. ,
," D." ' D. ,
," E." ' E. ,
," F." ' F. ,
," G." ' G. ,
," H." ' H. ,
," !" ' !_ ,
," +!" ' +!_ ,
," @" ' @_ ,
," ?" ' ?_ ,
," base!" ' base! ,
," decimal" ' decimal_ ,
," octal" ' octal_ ,
," hex" ' hex_ ,
," binary" ' binary ,
," .(" ' .(_ ,
," mod" ' mod_ ,
," abs" ' abs_ ,
," negate" ' negate_ ,
," invert" ' invert_ ,
," min" ' min_ ,
," max" ' max_ ,
," or" ' or_ ,
," and" ' and_ ,
," xor" ' xor_ ,
," lshift" ' lshift_ ,
," rshift" ' rshift_ ,
," depth" ' depth_ ,
," cells" ' dummy ,
," 1+" ' inc ,
," cell+" ' inc ,
," 1-" ' dec ,
," cell-" ' dec ,
," space" ' space_ ,
," spaces" ' spaces_ ,
," random" ' random_ ,
," 2*" ' 2*_ ,
," 2/" ' 2/_ ,
," emit" ' emit_ ,
," char" ' char_ ,
," [char]" ' char_ ,
," time" ' time_ ,
," (" ' (_ ,
," /mod" ' /mod_ ,
," */" ' */_ ,
," */mod" ' */mod_ ,
," cr" ' cr_ ,
NULL ,
\ Set up the interpreter loop
wordlist to dictionary \ assign dictionary
:noname #UndefName throw ; is NotFound \ standard 'abort' word
\ This is the actual DC program. It features only a
\ message handler and a interpretation-loop.
\ The rest is handled by library routines.
create Message
," Exception ignored"
," Undefined name"
," Bad variable"
: ShowMessage ( n --)
0 max Message swap th @c count type space
; \ print error message
: dc
begin
." OK" cr refill drop
['] interpret catch dup
if ShowMessage else drop then
again
;
dc
|