Dc (Unix)
Encyclopedia : D : DC : DCU : Dc (Unix)
- The correct title of this } is }}}. The initial letter is capitalized due to [Naming conventions #Lower case first lettertechnical restrictions].
This article provides some examples in an attempt to give a flavour of the language; for a complete list of commands and syntax you should consult a manual page for your implementation.
Unlike bc, dc is based on reverse-Polish notation, which means it interprets mathematical statements in a stack-based fashion.
For example, to multiply four and five in dc (note that most of the whitespace is optional):
4 5 * pThis translates into "push four and five onto the stack, then, with the multiplication operator, pop two elements from the stack, multiply them and push the result back on the stack." Then the 'p' command is used to examine (print out to the screen) the first element on the stack.
To evaluate (12 + 3^4)/11-22:
12 3 4 ^ + 11 / 22 - pIn addition to these basic arithmetic and stack operations, dc includes support for macros, conditionals and storing of results for later retrieval; unfortunately the syntax is terse and complex programs in dc tend to be very hard to read.
The mechanism underlying macros and conditionals is the register, which in dc is a storage location with a single character name which can be stored to and retrieved from: 'sc' pops the top of the stack and stores it in register c, and 'lc' pushes the value of register c onto the stack. For example:
3 sc 4 lc * pRegisters can also be treated as secondary stacks, so values can be pushed and popped between them and the main stack.
Macros are then implemented by allowing registers and stack entries to be strings as well as numbers. A string can be printed, but it can also be executed (ie processed as a sequence of dc commands). So for instance we can store a macro to add one and then multiply by 2 into register m:
[1 + 2 *] smand then (using the 'x' command which executes the top of the stack) we can use it like this:
3 lm x pFinally, we can use this macro mechanism to provide conditionals. The command '=r' will pop two values from the stack, and execute the macro stored in register r only if they are equal. So this will print the string 'equal' only if the top of the stack is equal to 5:
Looping is then possible by defining a macro which (conditionally) reinvokes itself.[[equal]p] sm 5 =m
As an example of a relatively simple program in dc, this command (in 1 line):
dc -ePn[ inches]P10Pdx]dx''[[Enter a number (metres), or 0 to exit]psj]sh[q]sz[lhx?d0=z10k39.370079*.5+0k12~1/rn[ feet ]
will convert distances from metres to feet and inches; the bulk of it is concerned with prompting for input, printing output in a suitable format and looping round to convert another number.
As an example of implementation Euclidean algorithm for search GCD:
dc -e'?[dSarLa%d0dc -e '[a=]P?[b=]P?[dSarLa%d0 References
- [The GNU dc manual page]
- [The sources for the manual page for 7th Edition Unix dc]
- Ritchie, Dennis M. (Sep. 1979) [The Evolution of the Unix Timesharing System]
From Wikipedia, the Free Encyclopedia. Original article here. Support Wikipedia by contributing or donating.
All text is available under the terms of the GNU Free Documentation License See Wikipedia Copyrights for details.
