Таблица П.2.2. Встроенные функции
Логические выражения имеют значения 1 (истина) и 0 (ложь). Как и в Си, любое ненулевое значение означает истину. При всех операциях над числами с плавающей точкой сравнения на равенство могут быть неточными. Кроме того,
hoc| 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 возможное_выражениесписок_операторов : (пусто) | список_операторов операторПрисваивание распознается по умолчанию как оператор, а не как выражение, поэтому после ввода в диалоге присваиваний их значения не печатаются.
Отметим, что символ
;hocifif (x < 0) print(у) else print (z)if (x < 0) { print(y)} else { print(z)}Во втором примере скобки не обязательны: символ перевода строки после
ifСинтаксис и семантика средств управления в
hocwhileifhocbreakcontinuereadprintФункция ввода
readreadreadВыходной поток порождается оператором
printprintprintОтметим, что
readprintwhile (read (x)) { print "value is", x, "\n"}Функции и процедуры в
hocСинтаксис определения таков:
function: func имя () операторprocedure: proc имя() операторЗдесь имя может быть именем некоторой переменной встроенные функции исключаются. Определение, вплоть до открывающейся скобки оператора, должно помещаться на одной строке, как в приведенном выше операторе
ifВ отличие от Си тело функции или процедуры может быть любым оператором, не обязательно составным (в скобках). Поскольку символ ; не имеет своего значения в
hocФункции и процедуры при вызовах могут получать аргументы, отделенные запятыми. На аргументы ссылаются так же, как в
shell$3printfФункции и процедуры могут быть рекурсивными, но стек имеет ограниченную глубину (около сотни вызовов).
• Ниже показано определение функции Аккерманна в
hoc$ hoctime 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) 29ack(3,3)