UNIX — универсальная среда программирования - Керниган Брайан Уилсон
Таблица П.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)
Откройте для себя мир чтения на siteknig.com - месте, где каждая книга оживает прямо в браузере. Здесь вас уже ждёт произведение UNIX — универсальная среда программирования - Керниган Брайан Уилсон, относящееся к жанру Интернет. Никаких регистраций, никаких преград - только вы и история, доступная в полном формате. Наш литературный портал создан для тех, кто любит комфорт: хотите читать с телефона - пожалуйста; предпочитаете ноутбук - идеально! Все книги открываются моментально и представлены полностью, без сокращений и скрытых страниц. Каталог жанров поможет вам быстро найти что-то по настроению: увлекательный роман, динамичное фэнтези, глубокую классику или лёгкое чтение перед сном. Мы ежедневно расширяем библиотеку, добавляя новые произведения, чтобы вам всегда было что открыть "на потом". Сегодня на siteknig.com доступно более 200000 книг - и каждая готова стать вашей новой любимой. Просто выбирайте, открывайте и наслаждайтесь чтением там, где вам удобно.


