Возведение в степень (FORTRAN **
), правоассоциативна ! -
Одноместные логическое и арифметическое отрицания * /
Умножение, деление + -
Сложение, вычитание >>=
Операции отношения: больше, больше или равно <<=
Меньше, меньше или равно == !=
Равно, не равно (все отношения одинакового приоритета) &&
Логическое И (оба операнда всегда вычисляются) ||
Логическое ИЛИ (оба операнда всегда вычисляются) =
Присваивание, правоассоциативна Таблица П.2.1. Операции по порядку уменьшения приоритета
Функции, как описывается ниже, могут быть определены пользователем. Аргументы функций — это выражения, разделяемые запятыми. В табл. П.2.2 перечислено несколько встроенных функций, имеющих по одному аргументу.
abs(x)
Абсолютная величина x atan(x)
Арктангенс x cos(x)
Косинус x exp(х)
Экспонента x int(x)
Целая часть x, усеченная в сторону нуля log(x)
Натуральный логарифм x log10(x)
Десятичный логарифм x sin(x)
Синус x sqrt(x)
Корень квадратный из x
Таблица П.2.2. Встроенные функции
Логические выражения имеют значения 1 (истина) и 0 (ложь). Как и в Си, любое ненулевое значение означает истину. При всех операциях над числами с плавающей точкой сравнения на равенство могут быть неточными. Кроме того,
hoc
имеет несколько встроенных констант, приведенных в табл. П.2.3.DEG 57.2957795130823208768 180/π, градусы на радианы E
2.71828182845904523536 е, основание натуральных логарифмов GAMMA
0.57721566490153286060 γ, константа Эйлера-Масчерони PHI
1.61803398874989484820 (√5+1)/2, золотое сечение PI
3.14159265358979323846 π, круговое трансцендентное число
Таблица П.2.3. Встроенные константы
Операторы и поток управленияОператоры
hoc
имеют следующую грамматику:оператор : выражение
| переменная выражение
| процедура (список, аргументов)
| while (выражение) оператор
| if (выражение) оператор
| if (выражение) оператор else оператор
| список_операторов
| print список_выражений
| return возможное_выражение
список_операторов : (пусто)
| список_операторов оператор
Присваивание распознается по умолчанию как оператор, а не как выражение, поэтому после ввода в диалоге присваиваний их значения не печатаются.
Отметим, что символ
;
не является для hoc
специальным: оператор оканчивается символом перевода строки. Это обусловливает некоторые особенности. Ниже показан допустимый оператор if
:if (x < 0) print(у) else print (z)
if (x < 0) {
print(y)
} else {
print(z)
}
Во втором примере скобки не обязательны: символ перевода строки после
if
оканчивал бы оператор и вызывал бы синтаксическую ошибку там, где опущены скобки.Синтаксис и семантика средств управления в
hoc
в основном те же, что и в Си. Одинаковы также while
и if
, однако в hoc
нет операторов break
и continue
.Ввод и вывод: read
и print
Функция ввода
read
(читать) имеет, подобно другим встроенным функциям, один аргумент: однако он не является выражением: это имя переменной. Следующее число, как определено выше, читается из стандартного входного потока и присваивается поименованной переменной. Функция read
возвращает значения 1 (истина), если величина была прочитана, и 0 (ложь), если read
встретила конец файла либо ошибку.Выходной поток порождается оператором
print
. Аргументы print
составляют разделяемый запятыми список выражений и строк, взятых в кавычки, как в Си. Символы перевода строки должны добавляться: print
их никогда автоматически не вводит.Отметим, что
read
есть специальная встроенная функция и поэтому получает один аргумент в скобках, тогда как print
оператор, получающий список, разделяемый запятыми без скобок:while (read (x)) {
print "value is", x, "\n"
}
Функции и процедурыФункции и процедуры в
hoc
различаются, хотя и определены одним и тем же механизмом. Это различие введено просто для контроля ошибок во время исполнения: возврат значения является ошибкой для процедуры, для функции же ошибочно не возвращать значения.Синтаксис определения таков:
function: func имя () оператор
procedure: proc имя() оператор
Здесь имя может быть именем некоторой переменной встроенные функции исключаются. Определение, вплоть до открывающейся скобки оператора, должно помещаться на одной строке, как в приведенном выше операторе
if
.В отличие от Си тело функции или процедуры может быть любым оператором, не обязательно составным (в скобках). Поскольку символ ; не имеет своего значения в
hoc
, пустое тело процедуры формируется пустой парой скобок.Функции и процедуры при вызовах могут получать аргументы, отделенные запятыми. На аргументы ссылаются так же, как в
shell
: $3
относится к третьему, индексируемому, начиная с единицы, аргументу. Они передаются значениями и внутри функций семантически эквивалентны переменным. Ссылка на аргумент с помощью числа, превышающего число аргументов, переданных процедуре, считается ошибкой. Контроль ошибок динамический, поскольку подпрограмма может иметь переменное число параметров, если ее начальные аргументы влияют на это число (см. функцию printf
в Си).Функции и процедуры могут быть рекурсивными, но стек имеет ограниченную глубину (около сотни вызовов).
Примеры• Ниже показано определение функции Аккерманна в
hoc
:$ hoc
time ack() {
if ($1 == 0) return $2+1
if ($2 ==0) return ack($1 - 1, 1)
return ack($1 - 1, ack($1, $2 - 1))
}
ack(3,2)
29
ack(3,3)
61
ack(3,4)
hoc: стек слишком велик (строка 8)
...
• Формула Стирлинга:
$ hoc
func stirl() {
return sqrt(2 * $1 * PI) * ($1 / E) ^ $1 * (1 + 1 / (12 * $1))
}
stirl(10) 3628684.7
Оглавление
-
Предисловия
-
Предисловие к русскому изданию
-
Предисловие
-
Глава 1 UNIX для начинающих
-
1.1 Итак, приступаем
-
***
-
***
-
1.2 Повседневная работа: файлы и основные команды
-
***
-
***
-
***
-
1.3 Продолжаем изучать файлы: каталоги
-
1.4 Интерпретатор shell
-
***
-
***
-
1.5 Другие средства UNIX
-
Глава 2 Файловая система
-
2.1 Основные сведения о файлах
-
2.2 Что хранится в файле?
-
2.3. Каталоги и имена файлов
-
2.4. Права доступа
-
***
-
2.5 Индексные дескрипторы
-
***
-
2.6 Иерархия каталогов
-
2.7 Файлы устройств
-
***
-
Глава 3 Возможности интерпретатора shell
-
3.1 Структура командной строки
-
3.2 Метасимволы
-
***
-
3.3 Создание новых команд
-
3.4 Аргументы и параметры команд
-
***
-
3.5 Результат выполнения программы в качестве аргумента
-
3.6 Переменные языка shell
-
***
-
3.7 Еще раз о переключении ввода-вывода
-
3.8 Циклы в shell-программах
-
3.9 Пр ограмма bundle : соберем все воедино
-
3.10 Для чего нужно программировать на языке shell!
-
Глава 4 Фильтры
-
4.1 Семейство программ grep
-
4.2 Другие фильтры
-
4.3 Потоковый редактор sed
-
***
-
4.4 Язык awk поиска и обработки шаблонов
-
***
-
***
-
***
-
***
-
***
-
4.5 Хорошие файлы и хорошие фильтры
-
Глава 5 Программирование на языке shell
-
5.1 Совершенствование команды cal
-
***
-
5.2 Что представляет собой команда which ?
-
***
-
5.3 Циклы while и until : контроль входа в систему
-
***
-
5.4 Команда trap : обработка прерываний
-
5.5 Команда overwrite : замена файла
-
5.6 Команда zap : уничтожение процесса по имени
-
5.7 Команда pick : пробелы или аргументы
-
5.8 Команда news : служба информации пользователей
-
5.9 Команды get и put : контроль изменении файла
-
5.10 Заключение
-
Глава 6 Программирование с помощью стандартных функций ввода-вывода
-
6.1 Стандартные входной и выходной потоки: программа vis
-
6.2 Аргументы программы: vis версия 2
-
6.3 Доступ к файлам: vis версия 3
-
6.4 Вывод на экран порциями: программа p
-
***
-
6.5 Пример: pick
-
6.6 Об ошибках и отладке
-
6.7 Пример: zap
-
6.8 Диалоговая программа сравнения файлов: idiff
-
***
-
6.9 Доступ к среде
-
Глава 7 Системные вызовы в UNIX
-
7.1 Ввод-вывод низкого уровня
-
***
-
7.2 Файловая система: каталоги
-
7.3 Файловая система: индексные дескрипторы
-
***
-
7.4 Процессы
-
***
-
7.5 Сигналы и прерывания
-
***
-
Глава 8 Разработка программ
-
8.1 Этап 1: калькулятор с четырьмя действиями
-
***
-
***
-
8.2 Этап 2: переменные и восстановление после ошибки
-
8.3 Этап 3: переменные с произвольными именами; встроенные функции
-
***
-
***
-
***
-
8.4 Этап 4: компиляция на машину
-
***
-
***
-
8.5 Этап 5: структуры управления и операции отношений
-
***
-
8.6 Этап 6: функции и процедуры; ввод-вывод
-
***
-
***
-
8.7 Оценка времени выполнения
-
8.8 Заключение
-
Глава 9 Подготовка документации
-
9.1 Пакет макроопределений ms
-
***
-
9.2 Уровень troff
-
***
-
9.3 Препроцессоры tbl и eqn
-
***
-
9.4 Справочник
-
9.5 Дополнительные средства для подготовки д окументации
-
Глава 10 Эпилог
-
Приложение 1 Краткое описание редактора
-
***
-
***
-
***
-
Приложение 2 Справочное руководство по hoc
-
***
-
Приложение 3 Исходные тексты калькулятора hoc
-
3.1 hoc1
-
3.1.1 makefile
-
3.1.2 hoc.y
-
3.1.3 hoc1.y , версия 1.5
-
3.2 hoc2
-
3.2.1 hoc.y
-
3.2.2 makefile
-
3.3 hoc3
-
3.3.1 makefile
-
3.3.2 hoc.h
-
3.3.3 hoc.y
-
3.3.4 init.c
-
3.3.5 math.c
-
3.3.6 symbol.c
-
3.4 hoc3 с lex
-
3.4.1. hoc.h
-
3.4.2 hoc.y
-
3.4.3 init.c
-
3.4.4. lex.l
-
3.4.5 makefile
-
3.4.6 math.c
-
3.4.7 symbol.c
-
3.5 hoc4
-
3.5.1 code.c
-
3.5.2 hoc.h
-
3.5.3 hoc.y
-
3.5.4 init.c
-
3.5.5. makefile
-
3.5.6. math.c
-
3.5.7 symbol.c
-
3.6 hoc5
-
3.6.1 code.c
-
3.6.2 fib
-
3.6.3 fib2
-
3.6.4 hoc.h
-
3.6.5 hoc.y
-
3.6.6 init.c
-
3.6.7 makefile
-
3.6.8 math.c
-
3.6.9 symbol.c
-
3.7 hoc6
-
3.7.1 ack
-
3.7.2 ack1
-
3.7.3 code.c
-
3.7.4 double
-
3.7.5 fac
-
3.7.6 fac1
-
3.7.7 fac2
-
3.7.8 fib
-
3.7.9 fib2
-
3.7.10 fibsum
-
3.7.11 fibtest
-
3.7.12 hoc.h
-
3.7.13 hoc.ms
-
3.7.14 hoc.y
-
3.7.15 init.c
-
3.7.16 makeapp
-
3.7.17 makefile
-
3.7.18 math.c
-
3.7.19 mbox
-
3.7.20 symbol.c
-
3.8 Всякая всячина
-
3.8.1 addup1
-
3.8.2. addup2
-
3.8.3 backup
-
3.8.4 backwards
-
3.8.5 badpick.c
-
3.8.6 bundle
-
3.8.7 cal
-
3.8.8 calendar1
-
3.8.9 calendar2
-
3.8.10 calendar3
-
3.8.11 cat0.c
-
3.8.12 checkmail.c
-
3.8.13 checkmail.sh
-
3.8.14 cp.c
-
3.8.15 doctype
-
3.8.16 double
-
3.8.17 efopen.c
-
3.8.18 error.c
-
3.8.19 field1
-
3.8.20 field2
-
3.8.21 fold
-
3.8.22 frequent
-
3.8.23 frequent2
-
3.8.24 get
-
3.8.25 get.с
-
3.8.26 getname
-
3.8.27 idiff.c
-
3.8.28 makefile
-
3.8.29 newer
-
3.8.30 news1
-
3.8.31 news2
-
3.8.32 news3
-
3.8.33 nohup
-
3.8.34 older
-
3.8.35 overwrite1
-
3.8.36 overwrite2
-
3.8.37 overwrite3
-
3.8.38 p1.c
-
3.8.39 p2.c
-
3.8.40 p3.c
-
3.8.41 p4.c
-
3.8.42 pick1
-
3.8.43 pick.c
-
3.8.44 prpages
-
3.8.45 put
-
3.8.46 readslow.c
-
3.8.47 replace
-
3.8.48 signaltest.c
-
3.8.49 spname.c
-
3.8.50 strindex.c
-
3.8.51 sv.c
-
3.8.52 system1.c
-
3.8.53 system.c
-
3.8.54 timeout.c
-
3.8.55 toolong
-
3.8.56 ttyin1.c
-
3.8.57 ttyin2.c
-
3.5.58 vis1.c
-
3.5.59 vis2.c
-
3.8.60 vis3.c
-
3.8.61 waitfile.c
-
3.8.62 watchfor
-
3.8.63 watchwho
-
3.8.64 which1
-
3.8.65 which1.H
-
3.8.66 which2
-
3.8.67 wordfreq
-
3.8.68 zap1
-
3.8.69 zap2
-
3.8.70 zap.c
-
Примечания