Мова програмування seed7: особливості та приклади використання
Відео: Програмування. Мова Сі. Математичні операції. Змінні. Типи змінних. урок 2.0
Що ж являє собою Seed7, чи схожий він на інші мови, наскільки екзотичний? Перше і основне - це розширювана мова програмування, тобто синтаксис задається на рівні самої мови. Звичайно, Seed7 притаманний певний синтаксис, проте він визначений в бібліотеці, а не запрограмований жорстко в коді інтерпретатора або компілятора. У бібліотеки винесено практично все - навіть підтримка типів даних. До слова, крім «мовних» бібліотек, в Seed7 передбачені бібліотеки на всі випадки життя, але про це трохи пізніше.
Тепер про основні відмінності Seed7 від інших мов. Почну з того, що в ньому немає списку зарезервованих слів: синтаксис мови може задаватися користувачем, хоча, звичайно ж, є деякі попередньо конструкції. Ні оператора return - замість нього для повернення функцією значення використовується змінна result. На практиці немає різниці між функцією, оператором, процедурою і виразом. Масиви можуть бути параметрами функцій. Немає автоматичного приведення типів. Рядки можуть мати нескінченну довжину. Нескінченне число для значущих символів в ідентифікаторах.
Найпростіший приклад на Seed7 такий:
$ Include "seed7_05.s7i" - const proc: main is func begin writeln ( "hello world") - end func-
У першому рядку (include) ми підключаємо стандартну бібліотеку Seed7, де крім іншого визначено, що функція main - точка входу в програму, а writeln - оператор для виведення текстового рядка. Потім йде рядок (const proc: main is), яка означає константний об`єкт main типу proc. Далі - нехай вас не заплутає знання Паскаля - в Seed7 для визначення функції або процедури служить конструкція:
func end func-
Це може виглядати так:
func begin end func-
А може - так:
func begin end func-
Слово func - це початок функції, end func - кінець. Між ними може бути ще begin, а також local для оголошення змінних. Ось той же приклад, але з оголошенням рядки s_string зі значенням Hello world і її передачею в якості параметра для writeln:
$ Include "seed7_05.s7i"; const proc: main is func local var string: s_hello is "Hello world" - begin writeln (s_hello) - end func-
Як бачите, програми на Seed7 (в його «передвстановленому» варіанті) трохи схожі на Pascal. Схожість проявляється не тільки в синтаксисі, але і, наприклад, в способі оголошення параметрів. У Pascal, якщо функція не може змінювати значення параметра, то параметр оголошується без всякого, а якщо може, то з var:
function foo (a: integer- var b: integer)
У Seed7 незмінний параметр починається зі слова in, а змінний - inout: # 10003- параметр можна використовувати тільки як константу:
const func integer: foo (in integer: a)
# 10003- значення параметра можна змінювати всередині функції, і ця зміна буде діяти і поза її межами:
const func integer: foo (inout integer: a)
# 10003- значення можна змінювати всередині функції, зміни не вийдуть за межі її тіла:
const func integer: foo (in var integer: a)
Нові синтаксичні конструкції також оголошуються подібно до функцій. Наведу приклад з документації. До того ж до звичайних циклам while і repeat / until додамо loop, який дозволяє виконувати вихід з циклу в його середині. Приклад використання loop:
loop ch: = getc (inFile) - until ch = `n` do stri : = Str (ch) - end loop-
Тут ми читаємо посимвольний з файлу до тих пір, поки не зустрінеться символ нового рядка. Поки він не зустрічається, додаємо символ до рядка stri. Щоб додати в мову нову конструкцію циклу loop, треба визначити її так:
const proc: loop (In proc: statements].) Until (ref func boolean: condition) do (In proc: statements2) end loop is func local var boolean: exitLoop is FALSE; begin repeat statements] .; if not condition then statements2- else exitLoop: = TRUE- end if- until exitLoop- end func-
Щоб інтерпретатор «підхопив» таке визначення, треба ще додати рядок:
Я не зупиняюся на подробицях, оскільки прагну висвітлити найцікавіші сторони Seed7. Чи є в цій мові підтримка об`єктно-орієнтованого програмування? Так, але виглядає незвично. У Seed7 введена концепція інтерфейсів і втілень (implementations). Інтерфейс в Seed7 можна дуже грубо співвіднести з абстрактним класом в інших мовах програмування. А втілення - це похідні від інтерфейсу класи, що реалізують ту чи іншу функціональність. Наприклад, може бути інтерфейс читання растрових картинок - Raster, що визначає якийсь загальний набір функцій: читання, запис, надання доступу до даних зображення. І кілька втілень - окремо для форматів на зразок PNG, JPEG, TIFF.
приклад:
# Оголошуємо інтерфейс Raster const type: Raster is new interface; # Оголошуємо функцію відтворення картинки const proc: draw (in Raster image) is DYNAMIC-
Функції draw все одно, що малювати - аби їй було передано параметр з втіленням інтерфейсу Raster. А ось втілення:
const type: PNG is new struct var integer: width is 0- var integer: height is 0; # і так далі end struct-
Тепер зв`яжемо інтерфейс і втілення:
type_implements_interface (PNG, Raster) -
І напишемо функцію-втілення саме для PNG:
const proc: draw (in PNG: image) is func begin # Якось малюємо image end func-
Структури можуть успадковувати поля батьків. Ось як можна оголосити нащадка структури ClassA, доповнивши його строковим полем s:
const type: ClassB is sub ClassA var string: s is "hello world" - end struct-
Загальні зауваження по ООП в Seed7: поліморфізм і успадкування працюють, але їх підтримка здійснюється за рахунок функцій і структур - в загальному, схоже на «ООП без ООП» в GTK + (структури + функції), але все ж з великим ухилом в традиційне ООП.
Слід так само відзначити, що для вивчення Seed7 прекрасно підійде комп`ютер для початківців (https://Rumman.ru). Дана мова програмування не вимагає великих витрат ресурсів, в результаті чого є ідеальним рішенням для початківців програмістів. Втім, це не змінює того факту, що за допомогою Seed7 Ви зможете створити дійсно якісний програмний продукт!