Керівництво по HOC

Hoc – інтерактивний мова для математичних виразів з плаваючою точкою

Брайан Керниган Роб Пайк

АНОТАЦІЯ

Hoc –  це простий програмований інтерпретатор для виразів з плаваючою крапкою У ньому є Сі-подібні опера тори управління, визначення функцій і звичайні вбудовані числові функції, такі як косинус і логарифм

1 Вирази

Hoc представляє собою мову виразів, подібний Сі У ньому існує деяка кількість операторів управління, але більшість операторів (наприклад, присвоювання) є виразами, значення яких ігнорується Наприклад, оператор присвоювання = при привласнювати значення свого правого операнда лівому операнду і видає значення, так що працюють множинні присвоювання Граматика вираження така:

expr:

number

|

variable

|

( expr )

|

expr binop expr

|

unop expr

|

function ( arguments )

Використовуються числа з плаваючою крапкою Формат введення такої, кото рий розпізнається scanf (3): цифри, десяткова крапка, цифри, e або E, порядок зі знаком Повинна бути вказана принаймні одна цифра або десяткова точка інші компоненти не обовязкові

Імена змінних утворені буквою, за якою слід буквенноціфровая рядок Бінарні операції, такі як додавання чи логи тичне порівняння, позначені binop unop – це два оператора заперечення: (Логічне заперечення, «не») і – (арифметичне заперечення, зміна знака) Оператори перераховані в табл 1

Таблиця 1 Оператори в порядку зниження пріоритету

Оператор

Дія

^

* /

+ –

&gt &gt=

&lt &lt=

== =

&amp&amp

||

=

зведення в ступінь (як ** в Фортране), ассоціатівен справа (унарні) логічне і арифметичне заперечення множення, ділення

додавання, віднімання

оператори відносини: більше, більше або дорівнює менше, менше або дорівнює

дорівнює, не дорівнює (всі з однаковим пріоритетом) логічне І (завжди оцінюються обидва операнда) логічне АБО (завжди оцінюються обидва операнда) присвоювання, асоціативно праворуч

Функції, як буде розказано далі, можуть бути визначені поль зователем Аргументами функцій є вирази, розділені комами Існують і вбудовані функції (всі вони приймають тільки один аргумент), вони описані в табл 2

Таблиця 2 Вбудовані функції

Функція Значення, що повертається abs(x)              |x|, Абсолютна величина x atan (x) арктангенс x

cos(x)              cos(x), Косинус x

exp(x)              ex, Експонента x

int (x) ціла частина x, Дрібна частина відкидається

log(x)           log(x), Логарифм x по підставі e log10(x)         log10(x), Логарифм x по підставі 10 sin (x) sin (x), Синусx

sqrt (x) корінь квадратний з x x1/2

Логічні вирази мають значення 1,0 (істина) і 0,0 (неправда) Як і в Сі, будь-яка ненульова величина сприймається як істина Як це завжди буває з числами з плаваючою точкою, встановлення рівності вкрай сумнівно

У hoc ​​є також кілька вбудованих констант, представлених в табл 3

Таблиця 3 Вбудовані константи

Константа

Значення

Пояснення

DEG E GAMMA PHI

PI

57,29577951308232087680

2,71828182845904523536

0,57721566490153286060

1,61803398874989484820

3,14159265358979323846

180 / π, градусів в радіані

e, Основа натурального логарифма

γ, константа Ейлера-Маськероні (5 +1) / 2, золотий перетин

π, відношення довжини кола до його

діаметру

2 Оператори і керуюча логіка

Оператори hoc мають наступну граматику:

stmt:

|

expr

variable = expr

|

|

|

|

|

|

|

procedure ( arglist )

while ( expr  ) stmt if ( expr ) stmt

if ( expr ) stmt else stmt

{ stmtlist }

print expr5list

return optional5expr

stmtlis

|

(nothing) stmlist  stmt

За замовчуванням присвоювання аналізується як оператор, а не як вираз, тому присвоювання, введені в інтерактивному режимі, не виводять свої значення

Зверніть увагу, що крапка з комою не має спеціального значення в hoc: оператори закінчуються роздільниками рядків Цим пояснюються деякі особливості поведінки Нижче наведені приклади правильно побудованих операторів if:

if (x  &lt  0)  print(y)  else  print(z) if (x  &lt  0)  {

print(y)

} else { print(z)

}

У другому прикладі наявність фігурних дужок обовязково: якби їх не було, то символ роздільник рядків, введений в кінці рядка з if, сприймався б як кінець оператора і видавалося б повідомлення про синтаксичну помилку

Синтаксис і семантика засобів керуючої логіки hoc аналогічні діючим у Сі Оператори while і if практично повторюють оператори Сі, тільки в hoc немає операторів break та continue

3 Введення і виведення: read і print

Функція введення read, як і інші вбудовані функції, приймає один аргумент Але на відміну від інших вбудованих функцій, аргумент read – це не вираження, а імя змінної Наступне число (Як описано вище) прочитується з пристрою стандартного введення і присвоюється зазначеної змінної Значення, що повертається read, дорівнює 1 (істина), якщо зчитування успішно, і 0 (неправда), якщо досягнуть кінець файлу або сталася помилка

Висновок генерується оператором print Аргументами print є список виразів і рядків, взятих в подвійні лапки, кото риє розділені комами (як в Сі) Роздільники рядків необхідно вводити, автоматично print їх не надає

Зверніть увагу, що, будучи спеціальної вбудованою функцією, read приймає тільки один аргумент, укладений в дужки, тоді як print – це оператор, що приймається не укладений в дужки список аргументів, розділених комами:

while  (read(x)) {

print  &quotvalue  is &quot,  x, &quot\n&quot

}

4 Функції та процедури

У hoc ​​різняться функції і процедури (хоча визначаються вони одним і тим же способом) Відмінність є тільки в контролі помилок часу виконання: для процедури помилкою є повернення величини, а для функції – НЕповернення

Синтаксис визначення виглядає наступним чином:

function:               func  name() stmt procedure:             proc  name()  stmt

name може бути імям будь-якої змінної, за винятком вбудо енних функцій Визначення (аж до відкриває фігурної дужки або оператора), повинно знаходитися на одному рядку, як оператор if в прикладі вище

На відміну від Сі, тілом функції або процедури може бути будь-який оператор, не обовязково складовою (укладений у фігурні дужки) Оскільки крапка з комою не має спеціального значення в hoc, то нульове тіло формується порожній парою фігурних дужок

При виклику функції і процедури можуть приймати аргументи, розділені комами Аргументи вказуються так само, як і в оболонці:

$ 3 посилається на третій (нумерація починається з одиниці) аргумент Вони передаються за значенням і всередині функцій семантично еквівалентні змінним Посилання на аргумент з номером, що перевищує кількість аргументів, переданих програмі, є помилкою Втім, контроль над помилками здійснюється динамічно, тому функція може мати непостійне кількість аргументів, якщо початкові аргументи змінюють кількість аргументів, на кото риє посилаються (як в Сі-функції printf)

Функції та процедури можуть бути рекурсивними, але розмір стека обмежений (близько сотні викликів) Покажемо це на прикладі функції Аккермана (Ackermann), визначеної в hoc:

$   hoc

func    ack()   {

if (  ==  0)  return

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*