|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217 |
- -- DC --
-
- desktop calculator implementation
-
- Copyright 2022, 2023 Emil Williams, see LICENSE
-
- GMP based DC. Uses readline. No limitations, either.
-
- -- Summary --
-
- DC is a reverse-polish desk calculator which supports unlimited precision arithmetic. Normally DC reads from the
- standard input; if any command arguments are given to it, they are filenames, and DC reads and executes the contents of
- the files instead of reading from standard input.
-
- A reverse-polish calculator stores numbers on a stack. Entering a number pushes it on the stack. Arithmetic operations
- pop arguments off the stack and push the results.
-
- To enter a number in DC, type the digits, with an optional decimal point. To enter a negative number, begin the number
- with `_'. `-' cannot be used for this, as it is a binary operator for subtraction instead. To enter two numbers in
- succession, separate them with spaces or newlines. These have no meaning as direct commands. Exponential notation is not
- supported.
-
- A-F are respected as values under the circumstance that the input radix is higher than their given number.
-
- -- Invocation --
-
- DC may be invoked with the following command-line options:
-
- `-e expr'
- `-e=expr'
- `--expression expr'
- `--expression=expr'
- Evaluates a DC expression.
-
- `-f file'
- `-f=file'
- `--file file'
- `--file=file'
- Reads and evaluates expressions from a file.
-
- `-h'
- `--help'
- Print a usage message summarizing the command-line options, then exits.
-
- `-V'
- `--version'
- Print the current version for DC, then exits.
-
- The envoriment is reset after every command-line entry.
-
- -- Printing Commands --
-
- `p'
- Prints the value on the top of the stack, without altering the stack. A newline is printed after the value.
-
- `n' (Supported GNU extension)
- Prints the value on the top of the stack, popping it off, and does not print a newline after.
-
- `f'
- Prints the entire contents of the stack. This is a good command to use if you are lost or want to figure out what the
- effect of some command has been.
-
- -- Arithmetic --
-
- Arithmetic
-
- `+'
- Pops two values off the stack, adds them, and pushes the result. The precision of the result is determined only by the
- values of the arguments, and is enough to be exact.
-
- `-'
- Pops two values, subtracts the first one popped from the second one popped, and pushes the result.
-
- `*'
- Pops two values, multiplies them, and pushes the result.
-
- `/'
- Pops two values, divides the second one popped from the first one popped, and pushes the result.
-
- `%'
- Pops two values, computes the remainder of the division that the `/' command would do, and pushes that. The value
- computed is the same as that computed by the sequence Sd dld/ Ld*- .
-
- `~' (Supported GNU extension)
- Pops two values, divides the second one popped from the first one popped. The quotient is pushed first, and the
- remainder is pushed next.(The sequence SdSn lnld/ LnLd% could also accomplish this function, with slightly different
- error checking.)
-
- `^'
- Pops two values and exponentiates, using the first value popped as the exponent and the second popped as the base. The
- fraction part of the exponent is ignored.
-
- FIXME reread and rephrase truness of secondary expression always working or not.
- `|' (Supported GNU extension)
- Pops three values and computes a modular exponentiation. The first value popped is used as the reduction modulus; this
- value must be a non-zero number, and the result may not be accurate if the modulus is not an integer. The second popped
- is used as the exponent; this value must be a non-negative number, and any fractional part of this exponent will be
- ignored. The third value popped is the base which gets exponentiated, which should be an integer. For small integers
- this is like the sequence Sm^Lm%, but, unlike ^, this command will work with arbritrarily large exponents.
-
- `v'
- Pops one value, computes its square root, and pushes that.
-
-
- Most arithmetic operations are affected by the precision value, which you can set with the `k' command. the default
- precision value is stated within config.h and is usually 128, this refers to bit complexity and not a number of digits.
-
- -- Additional Mathematical Functions --
-
- (These are all my extensions.)
-
- `@'
- Pops one value, computes its absolute value, and pushes that.
-
- `\"'
- Pops one value, ceils the value, and pushes that.
-
- `''
- Pops one value, floors the value, and pushes that.
-
- -- Stack Control --
-
- `c'
- Clears the stack, rendering it empty.
-
- `d'
- Duplicates the value on the top of the stack, pushing another copy of it. Thus, `4d*p' computes 4 squared and prints
- it.
-
- `r' (Supported GNU extension)
- Reverses the order of (swaps) the top two values on the stack.
-
- `R' (Supported GNU extension)
- Rotates the top N items in a cyclical order, negatives do this in reverse.
-
- -- Registers --
-
- Under DC_COMPLY, DC provides at least 256 memory registers, each named by a single character. You can store a number in
- a register and retrieve it later. Without DC_COMPLY there are only 95 registers, being any character between ' ' and '~'
- (inclusive.)
-
- `sr'
- Pop the value off the top of the stack and store it into register r.
-
- `lr'
- Copy the value in register r, and push it onto the stack. This does not alter the contents of r. Each register also
- contains its own stack. The current register value is the top of the register's stack.
-
- `Sr'
- Pop the value off the top of the (main) stack and push it onto the stack of register r. The previous value of the
- register becomes inaccessible.
-
- `Lr'
- Pop the value off the top of register r's stack and push it onto the main stack. The previous value in register r's
- stack, if any, is now accessible via the `lr' command.
-
- -- Params --
-
- NOTE THAT INCOMPATIBILITIES EXIST WITHIN SOME OF THESE FEATURES, ESPECIALLY THE OUTPUT RADIX, WHICH DOES NOTHING.
-
- DC has three parameters that control its operation: the precision, the input radix, and the output radix. The precision
- specifies the number of fraction digits to keep in the result of most arithmetic operations. The input radix controls the
- interpretation of numbers typed in; all numbers typed in use this radix. The output radix is used for printing numbers.
-
- The input and output radices are separate parameters; you can make them unequal, which can be useful or confusing. The
- input radix must be between 2 and 16 inclusive. The output radix must be at least 2. The precision must be zero or
- greater. The precision is always measured in decimal digits, regardless of the current input or output radix.
-
- `i'
- Pops the value off the top of the stack and uses it to set the input radix.
- `o'
- Pops the value off the top of the stack and uses it to set the output radix.
- `k'
- Pops the value off the top of the stack and uses it to set the precision.
- `I'
- Pushes the current input radix on the stack.
- `O'
- Pushes the current output radix on the stack.
- `K'
- Pushes the current precision on the stack.
-
- -- Status Inquiry --
-
- `Z'
- Pops a value off the stack, calculates the number of digits it has and pushes that number.
- `X'
- Pops a value off the stack, calculates the number of fraction digits it has, and pushes that number.
- `z'
- Pushes the current stack depth: the number of objects on the stack before the execution of the `z' command.
-
- -- Misc --
-
- `!'
- Will run the rest of the line as a system command. Note that parsing of the !<, !=, and !> commands take precidence, so
- if you want to run a command starting with <, =, or > you will need to add a space after the !.
-
- `#' (Supported GNU extension)
- Will interpret the rest of the line as a comment.
-
- `:r'
- Will pop the top two values off of the stack. The old second-to-top value will be stored in the array r, indexed by the
- old top-of-stack value.
-
- `;r'
- Pops the top-of-stack and uses it as an index into the array r. The selected value is then pushed onto the stack.
-
- -- COMPILING --
-
- This project uses GNU Make.
-
- Building options:
-
- DEBUG[=1]
- Enables the debugging detail.
-
- SAN[=...]
- Adds a given sanitization.
|