dc (desk calculator) — пакунок для арифметичних обчислень із довільною точністю в UNIX-системах. Зазвичай він оперує цілими числами в десятковій системі числення, однак можна задати системи числення для введення і виведення, а також точність обчислень. Загальна структура dc — стековий калькулятор, який використовує зворотний польський запис.
Синтаксис виклику:
dc [файл]
Якщо аргумент вказано, то спочатку введення виконується з файлу, а потім зі стандартного вхідного потоку.
Допустимі операції
dc розпізнає такі конструкції:
число
|
Значення числа поміщається в стек. Число — неперервний ланцюжок цифр 0-9 або букв A-F (шістнадцяткові цифри). На початку може стояти знак підкреслення _ для введення від'ємного числа. Число може містити десяткову крапку.
|
+ − / * % ^ ~
|
Верхні два числа стека додаються (+ ), віднімаються (− ), множаться (* ), ділятися (/ ), береться остача (% ), виконується піднесення до степеня (^ ) або відбувається ділення з остачею (~ ).
^ : обидва операнди добуваються зі стека і результат поміщається назад у стек. Дробова частина показника степеня нехтується.
~ : обидва операнди добуваються зі стека, другий ділиться на перший, результат і остача від ділення поміщається в стек (операція SdSn lnld/ LnLd% дає такий самий результат).
|
sx, Sx
|
Добувається вершина стека і поміщається в регістр з назвою x , де x — будь-який символ ASCII. Якщо конструкція має вигляд Sx , то x розглядається як стек, у який і поміщається добуте значення.
|
lx, Lx
|
Значення, що зберігається в регістрі x , поміщається в стек. Регістр x не змінюється. Спочатку всі регістри ініціалізуються нулем. Якщо конструкція має вигляд Lx , то x розглядається як стек, його вершина добувається і поміщається в головний стек.
|
d
|
Вершина стека подвоюється.
|
p
|
Виводиться вершина стека (без видалення зі стека).
|
P
|
Якщо вершина стека — ланцюжок символів, то вона друкується і видаляється зі стека. Якщо вершина стека є числом, то воно друкується як послідовність байтів і видаляється зі стека.
|
f
|
Виводяться всі елементи стека (без видалення). Зручно для налагодження програм.
|
q
|
Завершує роботу програми. При виконанні ланцюжка символів рівень рекурсії зменшується на два.
|
Q
|
Завершує роботу програми. Вершина стека добувається і рівень рекурсії зменшується на отримане значення.
|
x
|
Вершина стека трактується як ланцюжок символів, що містить команди dc, і виконується.
|
X
|
Вершина стека замінюється кількістю цифр у її дробовій частини.
|
[..]
|
Ланцюжок символів, взятий у дужки, поміщається у вершину стека.
|
=x
|
Два верхні елементи стека добуваються і порівнюються. Якщо вони задовольняють зазначеній умові, то вміст регістра x розглядається як команда dc і виконується. Можна використовувати також знаки порівняння < і > та їх заперечення ! < і ! > .
|
v
|
Верхній елемент стека замінюється квадратним коренем з нього. Якщо він мав дробову частину, то вона враховується, інакше точність обчислення залежить від команди k .
|
!
|
Залишок рядка інтерпретується як команда shell.
|
c
|
Очищення стека.
|
i
|
Вершина стека добувається і використовується як основа системи числення при введенні. Команда I поміщає використану при введенні основу системи числення у вершину стека.
|
o
|
Вершина стека добувається і використовується як основа системи числення при виведенні. Команда o поміщає використану при виведенні основу системи числення у вершину стека.
|
k
|
Добувається вершина стека; вона використовується для задання точності обчислень — кількості знаків у дробовій частині при виведенні і при виконанні множення, ділення, піднесення до степеня і добування кореня.
|
z
|
У стек поміщається кількість його елементів.
|
Z
|
Число у вершині стека замінюється його довжиною (без урахування десяткової крапки, знака мінус і початкових нулів, навіть якщо вони після десяткової крапки).
|
?
|
Зі стандартного вхідного потоку вводиться один рядок і виконується.
|
;:
|
Використовуються для операцій із масивами.
|
Приклад використання
Вивести факторіали перших 10 натуральних чисел:
[la1+dsa*pla10>y]sy
0sa1
lyx
Квайн (програма, яка виводить саму себе):
[91Pn[dx]93Pn]dx
[91PP93P[dx]P]dx
Див. також
Посилання