Введення в мову scheme для школярів

Ви добре знаєте українську, можливо, непогано вже говорите по-англійськи, в школі вас навчили кілька незвичайного мови математики. Пропоную вивчити ще один - Лісп. Точніше, один з його найцікавіших діалектів - Scheme (ським).

Спершу познайомимося з дещо незвичним порядком слів цієї мови: «дія - предмет». Але незвичайний він тільки в порівнянні з популярними мовами програмування. в українській мові така послідовність нередка:

  • Сума трьох і п'яти.
  • Твір п'яти, шести і семи.
  • Купи в булочній батон.

Кожна закінчена фраза цією мовою повинна бути оточена парою круглих дужок. Запишемо сказане вище на Scheme:

Можна записати вирази і складніше:

«Купи в булочній батони: два плюс ще один». Просто, чи не так? Давайте рухатися далі. Фраза (* 3 5) хороша, а (* width height) - краще. Вираз (* 2 3.1415926 5) - інтригуюче, а (* 2 pi radius) набагато більш осмислено. Тут width. height - змінні, а 3 і 5 - їх поточні значення.

Мінлива задається наступною конструкцією мови:

Прочитаємо записане по-російськи: «Покладемо ширина - це 3, висота - це 7, підрахуємо твір двох і суми ширини і висоти (наприклад, периметр прямокутника)». Результат такого обчислення в нашому випадку буде 20.

Продовжимо удосконалювати конструкції. Покладемо, нам потрібно підрахувати суму квадратів двох чисел. Це можна зробити, наприклад, так:

Щось не так; ми зазвичай замість «множ змінну на саму себе» говоримо «виведи в квадрат цю змінну», на ським - square:

«Сума квадрата a і квадрата b». Є завдання - є її рішення. Ми можемо оголосити нове слово-функцію, назвати її square. Функція буде приймати як параметр число і повертати його квадрат. Робиться це в такий спосіб:

Функція повертає останнім обчислене значення. Це означає, що наступна функція square2:

поверне той же результат, що і square. перед цим помноживши два на два без жодного ефекту. Перепишемо приклад з сумою квадратів чисел заново:

Нам не вистачало слів у мові - ми їх додали. Взагалі, коли пишете програму на Ліспі, ви описувати не алгоритм, а спочатку створюєте мову, а потім на ньому формулюєте вихідну задачу. Кілька точніше - ви «підганяєте» даний вам мову Scheme до тих пір, поки він не стане збігатися з мовою, на якому задача формулюється легко.

Відразу приклад. Нехай перед нами стоїть завдання зробити програму, яка запитує ім'я користувача, а потім виводить йому вітання.

Scheme надає нам кілька готових «дієслів»:

read для читання імені, display висновок чогось на дисплеї, newline висновок перекладу рядка.

Ми б хотіли мати такі «дієслова»:

привіт для вітання з одним параметром - ім'ям користувача; користувач для отримання імені користувача, без параметрів.

Наше завдання виглядала б так:

Справа за малим - визначити привіт і користувач. Немає проблем. Ось повний текст програми.

Лісп - повноцінний функціональний мову, а тому функції - повноправні члени цієї мови, незалежно від того, визначили ви їх самі, або вони вже були в мові готові. Зокрема, їх можна передавати в якості параметрів в інші функції, а там вже робити з ними все, що буде потрібно. Наприклад, функцію «модуль числа» можна визначити так:

«Визначимо, що функція abs повертає свій аргумент, якщо він позитивний, інакше - -x». А можна і так:

«... якщо аргумент позитивний, то плюс, інакше мінус x». Тут в результаті виконання виразу if повертається функція + або -. яка потім застосовується до аргументу x. Вважаю, що сенс конструкції if вам відразу ясний. Спочатку перевіряється перший аргумент, якщо він правдивий, то виповнюється другий аргумент, інакше третій. Загальний формат такий:

Де подивитися і спробувати Правити

В теорії все добре, а де трохи попрактикуватися? У світі можна знайти багато прекрасно розроблених середовищ для роботи з Scheme. На жаль, більшість документації по Scheme англійською мовою, але можна знайти і відмінні введення російською - мовою-то простий.

Ось назви кількох найпоширеніших реалізацій:

Racket одна з найповніших реалізацій, включає в себе зручну навчальне середовище Dr.Scheme. Є версії для платформ Windows. Linux. Mac OS. Bigloo теж досить повна реалізація. Доступна для платформ Windows. Linux. LispMe версія для кишенькових комп'ютерів з операційною системою Palm OS.

Також ще подивіться Gambit-C - один з найшвидших компіляторів Scheme.

Всі перераховані реалізації Scheme - це інтерпретатори. Запускаєте інтерпретатор - і можна вести з ним діалог на Scheme: у відповідь на його запрошення вводите конструкції на Scheme, а він буде повертати результати обчислень.


Спробуйте «програти» всі перераховані вище приклади. Думаю, вам сподобається!

Вправа Правити

Подивіться наступні дві реалізації функції обчислення факторіала f (n) = 1 ⋅ 2 ⋯ n. Одна з них заснована на рекурсії. а інша - на ітераціях. Напишіть на Scheme рекурсивную і засновану на ітераціях реалізації функції зведення в ступінь f (a. N) = a n>.

Варіант 1 Правити

Варіант 2 Правити

Схожі статті