2 основні можливості мови scheme рекурсії. Мова програмування Scheme. GNU Guix – новий менеджер пакетів від команди GNU

Scheme, також відомий під ім'ям Lisp (не плутати з Common Lisp) - це сучасна алгоритмічна мова програмування, знаменита своєю орієнтацією на функціональну парадигму програмування, проте їй не обмежує себе.

Сімейство Lisp - друге за тривалістю застосування сімейство мов (після Фортрана), засноване Джоном Маккарті як інструмент написання штучного інтелекту. Одним із активних учасників розробки спеціалізованих комп'ютерівдля інтерпретації Lisp був Річард Столлман, згодом засновник Фонду Вільного Програмного Забезпечення. Як наслідок, одним із основних інструментів при розробці на Scheme є Emacs (+Geiser, Scheme-Complete, company-mode). Передбачається, що в якийсь момент Scheme буде внутрішньою мовою Emacs замість Emacs Lisp. (Вже зараз можна побачити EdWin.)

Scheme - це Lisp, орієнтований на легкість портування, функціональний підхід та впровадження найкращих практик теорії мов програмування.

Scheme розвивається двома шляхами. Індивідуальні розширення формулюються згідно з процесом, подібним до RFC, і називаються SRFI, (Scheme Request For Implementation). У відведені терміни виходять об'єднані редакції «стандартного звіту», що формулюють, що являє собою scheme «в цілому». Останнім завершеним виданням є Revised 7 Report on Algorithmic Language Scheme (small language), а останнім експериментальним виданням є R7RS-large Red Edition. Передбачається, що до виходу остаточної редакції R7RS-large вийде сім або вісім проміжних редакцій, та Наразірозглядаються редакція 2 (Tangerine), що ставить за мету формалізувати структури даних, колекції та numerics і редакція 3, націлена на нові фічі.

Зацікавленим фахівцям пропонується вивчити дискусійний матеріал та проголосувати згідно з власним баченням питання, представившись перед цим заздалегідь у [email protected]

  • Строкова бібліотека
  • Асоціативні масиви
  • Регулярні вирази
  • Генератори/Акумулятори
  • Цілочисельні операції
  • Побутові операції
  • Математичні операції з fixpoint
  • Математичні операції з floating point
  • Бітові вектор
  • Гомогенні вектор
  • Форматування
  • Великі числа
  • Дроби
  • Точні числа

Запитання, які пропонується розглянути у третьому виданні:

  • Випадкові числа
  • Прості числа
  • Цілочисленні множини
  • Дискрептивна статистика
  • Діапазони
  • Бітові вектор
  • Байтові рядки
  • Перерахування
  • Комбінаторика та перестановки

Anonymous (28.11.2018 23:36:26)

MIT/GNU Scheme – це реалізація мови програмування Scheme, що надає інтерпретатор, компілятор, налагоджувач вихідного коду, вбудований Emacs-образний редактор та велику бібліотеку часу виконання. MIT/GNU Scheme заточений під програмування великих додатківіз швидким циклом розробки.

Зміни:

  • Складання для Windows більшене поширюються, оскільки 32-розрядні зборки, що існували, малопридатні для сучасних систем, а для досягнення працездатності 64-розрядної потрібні чималі зусилля, в яких ніхто з поточних супровідників не зацікавлений.
  • Для macOS тепер випускаються тільки 64-розрядні зборки, оскільки в інструментарії, що застосовується в останніх випусках, підтримка 32-розрядної збірки оголошена застарілою.
  • Версія для C, що переноситься, не включена в цей випуск, оскільки її не вдалося вчасно відремонтувати.
  • На наступний випуск заплановано купу дрібних покращень; Першочерговими завданнями цього випуску є нововведення.

Важливі нововведення:

Ще зміни:

  • початкова підтримка SMP;
  • повідомлення збирача сміття;
  • події ниток;
  • багато інших дрібні нововведення та виправлення.

Несумісні зміни:

Експериментальні нові можливості:

  • Тип URI має новий синтаксис: #<...>. І читачі, і письменники працюють із цим синтаксисом.

GNU Guile 2.9.1 (beta)

Guile - це реалізація мови програмування Scheme від GNU, що підтримує багато SRFI, що реалізує стандарт R5RS, що надає модульну систему, повний доступ до системним викликам POSIX, підтримку мережі, ниток, динамічного зв'язування, викликів зовнішніх функцій та потужну обробку рядків. Guile може інтерпретувати код інтерактивно, компілювати його в байткод віртуальної машиниі навіть підключатися бібліотекою як вбудований додаток інтерпретатора.

2.9.1 - перший beta-випуск готується до стабільного випуску 3.0 гілки. У порівнянні з поточною стабільною гілкою (2.2.x), в ній додана JIT-компіляція, що прискорює всі Guile-програми до 4-х разів. У цьому випуску JIT підтримується лише на x86-64; у майбутніх випусках планується підтримка всіх платформ, що підтримуються GNU lightning.

GNU Guile-CV 0.2.0

Guile-CV – це бібліотека комп'ютерного зорудля мови програмування GNU Guile, що є прив'язкою до бібліотеки Vigra, написаної на C++, і працює через прошарок Vigra C. Guile - реалізація мови Scheme, діалекту Lisp.

Вийшла мова програмування Racket 7.0

GNU Guile-CV 0.1.9

Guile-CV - це бібліотека комп'ютерного зору мови програмування GNU Guile, що є прив'язкою до бібліотеки Vigra, написаної на C++, і що працює через прошарок Vigra C. Guile - реалізація мови Scheme, діалекту Lisp.

Зміни з версії 0.1.8:

  • Оновлено залежності.Сумісність тепер підтримується з Vigra C від комміту a2ff675f4 і вище, через зміни в січні цього року: в інтерфейсі vigra_nonlocalmean_c перейменований аргумент, функції vigra_medianfilter_c доданий аргумент out-of-bound strategy .
  • Нові інтерфейси: im-median-filter , im-median-filter-channel , im-nl-means , im-nl-means-channel .
  • Виправлення:у модулі (cv support latex) , що використовує latex-pdftoppm - недокументованої, але дуже корисною для підготовки тексту до додавання на зображення процедури - опціональний аргумент із ключовим словом [#:res 72] фактично не використовувався, тепер це виправлено.

Вийшла Нова версія 0.2.3 веб-фреймворка GNU Artanis мовою Scheme

Фреймворк написаний на реалізації мови Scheme - Guile Scheme і призначений для створення динамічних веб-сайтів, веб-додатків, веб-сервісів та веб-ресурсів.

Фреймворк також надає інструменти роботи з БД, шаблонами, сесіями, кешуванням, URL-remapping для RESTful тощо.

Сама назва Artanis походить від зворотного Sinatra – веб-фреймворку на Ruby.

Artanis схожий на такі веб-фреймворки, як Ruby Sinatra, Python Flask та Java Spark.

Ім'я головного розробника - Nala Ginrut, знову ж таки від зворотного Alan Turing.

Guile-Ncurses 2.0

Відбувся реліз guile-ncurses 2.0 — бібліотеки для створення текстових інтерфейсів на GNU Guile, реалізації функціональної мови програмування Scheme. guile-ncurses є обгорткою до бібліотеки Ncurses.

Вийшов GNU Guile 2.0.10

GNU Guile - це проект з розвитку вільної реалізації функціональної мови програмування Scheme, що підтримує можливість вбудовування коду у додатки іншими мовами програмування.

Реліз містить 253 коміти від 11 людей, прийняті за 11 місяців.

Окрім виправлень безлічі помилок, реліз містить нові можливості, таких як імплементація векторної бібліотеки SRFI-43 та API для тестування SRFI-64, часткова підтримка нового стандарту мови Scheme R7RS та розширення GDB для налагодження Guile.

Опубліковано переклад книги "Lisp in Small Pieces"

Це досить відома книга Крістіана Кеннека, що розглядає семантику Ліспа та основи його реалізації на прикладі діалекту Scheme. У процесі оповідання розбирається безліч аспектів семантики мови, починаючи різноманітними варіантами оточення, проходячи через продовження та винятки, закінчуючи рефлексією, суттю макросів, компілятором у Сі та об'єктною системою.

Книга містить 11 інтерпретаторів, 2 компілятори, стопку вправ у кожному розділі, безліч цікавого матеріалу про історію Лиспа та причини прийняття тих чи інших рішень у дизайні мови, деяка кількість алюзій на сучасні мовипрограмування, а також невеликий вагончик літератури на додачу.

Тут немає одкровень, неймовірно ефективних оптимізації, потужних системтипів та інших атрибутів сучасної computer science (книзі 20 років все ж таки), але є відмінне тверде введення в реалізацію мов програмування, покликане зацікавити новачків, познайомити їх з основними поняттями та прийомами цієї справи, побудувавши таким чином фундамент для подальшого розвитку.

Сьогодні, 22 січня 2013 року, відбувся новий релізшироко відомого у вузьких колах інтерпретатора мови програмування Scheme - Scheme48, розробником якого є один з основних членів Керівного комітету (Steering committee) Scheme Джонатан Різ. Реліз має номер 1.9 і досить довгоочікуваний, оскільки інтерпретатор не оновлювався порівняно давно.

Основні додавання такі:

  • додано новий механізм FFI (старий поки що теж доступний, однак, незабаром буде видалений);
  • додано набір функцій для підтримки мережі (з повною підтримкою IPv6 та UDP, поки не документовано);
  • записи тепер підтримують успадкування (доступно через пакет r6rs-records);
  • додано letrec*;
  • інтерпретатор тепер попереджає про циклічні залежності та перевизначення в модулях;
  • доданий статистичний профільник;
  • якщо VM інтерпретатора збирається компілятором, що підтримує GNU C, використовується прямий шитий код, що дозволяє прискорити виконання;
  • інші додавання щодо підтримки можливостей R6RS, системи складання та ліцензування (за посиланням «Подробиці»).

Список найважливіших змін:

  • перероблено власний збирач сміття BIBOP GC, який тепер використовується за умовчанням;
  • переписано реалізацію syntax-rules;
  • інші зміни щодо системи збирання, ліцензування та підтримки POSIX (за посиланням «Подробиці»).

Вийшла нова версія реалізації мови Scheme – GNU Guile 2.0.7. Незважаючи на незначну зміну номера версії, з'явилося кілька цікавих нововведень, а саме:

  • Повна підтримка інфіксних виразів (curly-infix-expressions). Тепер замість (*a(+bc)) можна писати (a*(b+c)).
  • Підтримка різних опцій читання (read option) для різних портів.
  • Підтримка вкладених директив future.
  • Спеціальний синтаксис для додавання шляхів у змінні оточення GUILE_LOAD_PATH та GUILE_LOAD_COMPILED_PATH до кінця списку шляхів, а не на початок.
  • Виправлено нестачу функції load-in-vicinity, яка не сканувала директорії, встановлені в змінній %load-compiled-path.
  • Виправлено порядок пошуку розширень. Тепер Guile не змінює змінного оточення LD_LIBRARY_PATH.
  • Функція make-vtable-vtable позначена застарілою, рекомендується використовувати make-vtable та .
  • Оптимізовано equal виклики? та eqv? для випадків, коли один із аргументів - константа.
  • Нові попередження компілятора -Wduplicate-case-datum та -Wbad-case-datum.
  • Численні незначні поліпшення та виправлення помилок.

GNU Guix - новий менеджерпакетів від команди GNU

Людовік Кортес (Ludovic Courtès), один із учасників проекту GNU, оголосив про випуск першої альфа-версії нового менеджера пакетів для будь-яких дистрибутивів GNU/Linux - GNU Guix, що створюється на базі менеджера пакетів Nix.

Крім стандартних функційустановки, видалення та оновлення ПЗ GNU Guix буде підтримувати транзакційні оновлення з можливістю відкату на колишню версію, працювати без привілеїв root, містити окремі профілі налаштувань для кожного користувача та включати збирач сміття (для відстеження та ігнорування неактуальних пакетів). Але найголовніша особливість GNU Guix полягає в тому, що його розробляють функціональною мовою Scheme.

Отримати вихідні тексти можна через Git-репозиторій.

Подано версію 5.2 мови програмування Racket (раніше PLT Scheme).

Нове у цій версії:

  • Нова бібліотека `db", що надає високорівневий інтерфейс до популярних РСУБД: MySQL, SQLite, PostgreSQL та іншим через ODBC.
  • Нова колекція XREPL, що надає допоміжні команди для циклу читання-виконання-друку (REPL) Racket. Вона буде корисна людям, які використовують консольну версію Racket та альтернативні редактори.
  • Колекція `plot” переписана на Racket, тепер вона підтримує виведення у PDF, логарифмічні осі, гістограми та багато іншого.
  • DrRacket використовує традиційні комбінації клавіш: C-t створює нову вкладку, C-w закриває вкладку, C-r виконує визначення.
  • Typed Racket:
    • Typed Racket надає кошти для статичної налагодження продуктивності: показується, який код буде оптимізований, а який ні.
    • Більш інтуїтивні типи у виведенні REPL та повідомлення про помилки.
    • Підтримується визначення функцій з необов'язковими аргументами з синтаксисом, як у Racket.
  • Виправлено кілька проблем з графічним інтерфейсом, У тому числі з Ubuntu 11.10 (GTK+3) та 64-бітної Mac OS X.
  • Внутрішні визначення тепер мають семантику `let*" якщо не містять зворотних посилань, це виключає втрату продуктивності при використанні внутрішніх визначень замість `let" і змінює зміст програм, які захоплюють продовження у внутрішніх визначеннях. Використання внутрішніх визначень вважається кращим стилем.

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

Мова Scheme має досить хорошу підтримку Emacs. Ця підтримка реалізується набором пакетів, які можуть працювати як з довільними реалізаціями цієї мови ( scheme-mode, cmuscheme, quack), і підтримувати лише конкретні реалізації ( xscheme, gds, bee-mode, gambit). Як правило, підтримка конкретних реалізація має дещо більше можливостей, порівняно з пакетами, орієнтованими на підтримку всіх реалізацій.

Ця стаття намагається охопити всі питання підтримки програмування на Scheme, і розповідь спочатку ведеться про спільні для всіх реалізацій речі, а потім розглядаються пакети, що реалізують підтримку конкретних версій мови.

Scheme-mode

Scheme-mode Emacs, що поставляється в поставці дистрибутивів, є модифікацією lisp-modeдля роботи з вихідним кодом на Scheme. Цей пакет реалізує таку функціональність:

  • підсвічування синтаксису
  • розстановку відступів
  • підсвічування парних дужок

На базі scheme-modeстворено кілька інших пакетів - , та інші, які розширюють його функціональність додаванням функцій для виконання коду прямо з буфера Emacs, і т.п. речей.

Цей режим автоматично вмикається для файлів, які використовують стандартні розширеннядля файлів з вихідними текстамина Scheme - .scm, .ss і т.п. Щоб включити даний режимдля інших файлів, додайте у свій файл ініціалізації наступний код (замінивши.scm на потрібне розширення):

(add-to-list "auto-mode-alist" ("\\.scm$" . scheme-mode))

Якщо ви хочете змінити поведінку пакета, то ви можете задати параметри функції, яка буде додана до змінної scheme-mode-hook , буде викликана при включенні режиму в конкретному буфері. Крім того, деякі параметри можна встановити за допомогою стандартних засобів налаштування. Відповідна група налаштування називається scheme.

Cmuscheme

Пакет cmuschemeбув написаний Olin Shivers багато років тому, але досі є одним із основних пакетів, які забезпечують роботу зі Scheme. Цей пакет реалізує інтерактивну роботу з інтерпретаторами мови Scheme. Взаємодія з інтерпретатором реалізується за рахунок використання можливостей пакету comint, що входить до постачання Emacs.

Налаштування пакета

Налаштування пакета досить просте - помістіть у свій файл ініціалізації наступний код

(autoload "run-scheme "cmuscheme" "Run an inferior Scheme" t) (setq scheme-program-name "mzscheme" )

і пакет буде автоматично завантажений під час першого запуску функції run-scheme . Другий рядок у цьому прикладі використовується для вказівки імені інтерпретатора Scheme, яке можна замінити на свій улюблений діалект. Усі налаштування цього пакета також доступні для інтерактивного налаштування через групу налаштування cmuscheme.

У буфері інтерпретатора, що створюється пакетом, використовується спеціальний режим - inferior-scheme-mode, який можна налаштувати використовуючи хук inferior-scheme-mode-hook. Крім того, якщо існує файл ~/.emacs_SCHEMENAME або ~/.emacs.d/init_SCHEMENAME.scm (де SCHEMENAME — назва інтерпретатора), вони будуть виконані відразу після завантаження інтерпретатора.

Робота з пакетом

Основною функцією пакету є функція run-scheme, яка запускає вибраний інтерпретатор мови Scheme і дозволяє виконувати інтерактивне виконання коду, не залишаючи Emacs.

При цьому ви можете керувати тим, яка частина коду (виділений блок, визначення функції або окремий вираз) буде виконана шляхом використання різних функцій, визначених пакетом - функція scheme-send-definition (поєднання клавіш C-c C-e або C-M-x) передає до виконання інтерпретатору поточне визначення; функція scheme-send-region (C-c C-r) дозволяє виконати виділений шматок вихідного коду; функція scheme-send-last-sexp (C-x C-e) використовується для обчислення виразу перед курсором; функція scheme-load-file (C-c C-l) дозволяє завантажити в інтерпретатор файл цілком (вона дозволяє виконати код з будь-якого файлу, вказаного користувачем, а не тільки з поточного буфера).

Інтерпретатор Scheme виконується в окремому буфері з ім'ям *scheme* , куди також виводяться результати обчислення виразів і функцій. Для швидкого перемикання в буфер з буфера з вихідним текстом, існує окрема функція switch-to-scheme (C-c C-z). Крім того, оскільки часто потрібно виконати код і переглянути результати, то в пакеті також визначено дві функції, які відправляють інтерпретатору код для виконання, і перемикаються до буфера *scheme* — scheme-send-definition-and-go (C-c M-e) для обчислення поточного визначення та scheme-send-region-and-go (C-c M-r) для обчислення виділеного вихідного коду.

Для роботи з макросами пакет надає функцію scheme-expand-current-form (C-c C-x), яка дозволяє розкрити визначення поточного макросу відповідний код Scheme. Розкриття коду здійснюється інтерпретатором і виводиться в буфер *scheme*. А при роботі з реалізаціями Scheme, які підтримують компіляцію вихідного коду, користувач може скористатися функціями scheme-compile-file (C-c C-k) та scheme-compile-definition (C-c M-c), які виконують компіляцію файлу або поточного визначення.

Як зазначалося вище, в буфері інтерпретатора діє спеціальний режим - inferior-scheme-mode в якому працюють усі команди режиму comint, а також наступні команди cmuscheme- scheme-compile-file (C-c C-k), scheme-load-file (C-c C-l), scheme-send-last-sexp (C-x C-e) та scheme-send-definition (C-M-x).

Quack

Пакет Quack є розширенням для пакету cmuschemeта реалізує такі додаткові можливості (багато з них насамперед належать до роботи з PLT Scheme):

  • меню, що дозволяють отримувати доступ до документації з мови, інтерпретатора та SRFI, а також можливість пошуку опису для імені функції, що знаходиться в поточній позиції курсору;
  • нові набори підсвічування для font-lock— для PLT Scheme та розширена, для інших реалізацій;
  • можливість використання грецького символу lambdaдля позначення lambda-виразів (приклади наведені нижче);
  • додаткові опції та команди для вставки правильних дужок, що відкривають і закривають;
  • розширення для правил розміщення відступів, з можливістю налаштування для різних інтерпретаторів Scheme;
  • розширена версія команди run-scheme, яка знає імена команд популярних інтерпретаторів Scheme, а також запам'ятовує останній запущений варіант інтерпретатора;
  • розширена версія команди switch-to-scheme;
  • можливість перегляду вмісту.plt колекцій та команди для відкриття буфера Diredдля потрібної колекції.

Встановлення та налаштування

Пакет написаний Neil Van Dyke, і доступний для завантаження із сайту автора . Пакет встановлюється шляхом копіювання в каталог, де Emacs зможе знайти його, та завантажується командою:

(require "quack)

Усі налаштування пакета можуть бути задані, використовуючи групу налаштування quack, або використовуючи меню Quack. Ці настройки включають адреси посібників і SRFI, визначення префіксного поєднання клавіш, використовуваного пакетом і т.п.

Користувачам PLT Scheme рекомендується завантажити посібники з даного інтерпретатора з сайту проекту та встановити їх у колекцію doc. Знаходження колекцій PLT Scheme визначається або змінною quack-pltcollect-dirs, в якій можна перерахувати всі каталоги з робочими колекціями, або змінними середовища PLTHOME та/або PLTCOLLECTS .

Також для роботи пакета потрібна наявність програми wget, яка буде використовуватись для доступу до SRFI.

Робота з пакетом

Після завантаження пакета, на додаток до функцій cmuschemeі scheme-modeстають доступними функції, визначені пакетом. Користувач може виконувати ці функції або за допомогою стандартних механізмів (поєднання клавіш та/або запуск по імені функції), або за допомогою меню Quack .

Перегляд документації здійснюється за допомогою кількох функцій. Функція quack-view-manual (C-c C-q m) використовується для перегляду документації у веб-браузері. Ця команда дозволяє переглядати як базову документацію з мови Scheme, так і документацію з конкретних реалізацій. Для перегляду SRFI визначено окрему команду — quack-view-srfi (C-c C-q s), яка запитує номер потрібного документаі відкриває його у браузері. Для користувачів PLT Scheme ще доступна і команда quack-view-keyword-docs (C-c C-q k), яка показує документацію для заданого ключового слова ( робота цієї команди залежить від правильної установкидокументації PLT Scheme).

Як уже зазначалося вище, пакетом реалізована функція run-scheme (C-c C-q r), яка дозволяє запускати інтерпретатори мови Scheme, вибираючи їх зі списку відомих (включаючи запуск із потрібними опціями), а також запам'ятовує останній вибіркористувача.

Для користувачів PLT Scheme також є зручні функції для роботи з колекціями. Функція quack-find-file (C-c C-q f) відкриває файл, використовуючи дані з поточного контексту отримання імені файла. Наприклад, якщо ви використовуєте цю функцію в той час як курсор знаходиться на коді (require (lib "list.ss")), то вам буде запропоновано відкрити файл list.ss з колекції mzlib. Крім того, визначено функцію quack-dired-pltcollect, яка дозволяє відкрити буфер Diredдля потрібної колекції PLT Scheme (при заданні імені користувач може використовувати доповнення імені колекції).

Цей пакет також реалізує кілька функцій, які змінюють форматування коду, роблячи його зручнішим для використання. Функція quack-tidy-buffer (C-c C-q t) наново розставляє відступи в коді, замінює знаки табуляції на прогалини, видаляє зайві порожні рядки, видаляє заключні пробільні символиу рядках, а також додає знак перекладу рядка в кінці файлу, якщо його немає. Функція quack-toggle-lambda (C-c C-q l) змінює оголошення поточної функції з (define (func args) ...) на (define func (lambda (args) ..))), що дозволяє показувати знак лямбда в коді (при включеній опції відображення цього символу). Наприклад, ось так:

Пакет GCA

GCA- Пакет призначений для ефективної роботи з вихідним кодом Scheme. Він розроблявся для підтримки Gauche Scheme, але може використовуватись і з іншими діалектами. Як і quack, він розширює функції пакету cmuscheme.

Цей пакет має такі можливості:

  • вставку шматків коду, використовуючи механізм шаблонів
  • показ описів для функцій
  • доповнення імен

Цей пакет має деякі архітектурні відмінності від інших пакетів — замість взаємодії з інтерпретаторами, використовуючи стандартне введення та виведення, цей пакет використовує простий мережевий протокол для передачі даних. Цей підхіддозволяє виконувати Велика кількістьзавдань, але залежить від реалізації інтерпретатора і вимагає окремого процесу Scheme (сервера gds), який використовуватиметься взаємодії з іншими процесами.

Встановлення та налаштування

Пакет gdsпоставляється разом з останніми версіями Guile, так що вам необхідно лише додати файли з вихідними текстами Emacs Lisp у шляху пошуку Emacs, та вписати у файл ініціалізації наступний рядок:

(require "gds)

Ця команда призводить до завантаження пакета та запуску окремого процесу, який відповідатиме за взаємодію з інтерпретаторами Scheme. Варто зазначити, що для роботи пакета потрібна наявність окремого пакета на Scheme у шляхах пошуку Guile. Якщо пакет знаходиться в нестандартному місці, то ви можете вказати його розташування за допомогою змінної gds-scheme-directory, інакше, за відсутності цього пакета, завантаження пакета не буде здійснено повністю.

Інші налаштування можуть бути задані за допомогою групи налаштувань gds .

Робота з вихідним кодом

Пакет gdsдля обчислення коду використовує самі поєднання клавіш, що й cmuscheme. Винятком є ​​функція gds-eval-expression (C-c C-e), яка обчислює вираз, введений у міні-буфері.

Одним із приємних додавань, реалізованих gdsє доповнення імен функцій та змінних, а також отримання довідки про конкретні символи та/або пошук символу на ім'я.

Додаток до імен виконується функцією gds-complete-symbol (поєднання клавіш M-TAB), яка намагається знайти всі відомі символи, чиї імена відповідають тим літерам, які знаходяться перед курсором. Якщо знайдено одне ім'я, воно вставляється відразу, але якщо є кілька варіантів, то буде показано нове вікно, в якому користувач може вибрати потрібне ім'я.

Отримання довідки на конкретний символ здійснюється за допомогою функції gds-help-symbol (C-h g), яка видає ті ж результати, що й запуск команди (help SYMBOL) в інтерактивному середовищі Guile. Ім'я символу запитується у користувача через міні-буфер, але як значення за замовчуванням використовується ім'я, на якому знаходиться курсор. Якщо ви не пам'ятаєте точне ім'я символу, то ви можете скористатися функцією gds-apropos (C-h G), яка аналогічна до виконання (apropos REGEXP) у Guile, і яка виводить список символів, чиї імена відповідають введеному регулярному виразу.

Налагодження

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

(use-modules (ice-9 gds-client debugging traps)) (named-module-use! "(guile-user) "(ice-9 session)) (gds-accept-input #f)

Після цього, ви можете працювати з gds. Для встановлення точки зупинки в процедурі proc_name використовується наступний, що обчислюється в буфері з вихідним кодом:

(install-trap (make #:behaviour gds-debug-trap #:procedure proc_name))

і після виклику зазначеної процедури, отримайте в буфері gdsприблизно таке:

Calling procedure: => s s --:** PID XXXXX (Guile-Debug)--All--------

у цьому буфері ви можете переміщатися по стеку, переглядати його стан, продовжувати виконання програми та/або покрокове виконання. Робота в буфері стека забезпечується за рахунок використання певної кількості команд, прив'язаних до окремих кнопок.

Для переміщення по стеку викликів функцій можуть використовуватися такі клавіші: u , C-p та стрілка вгору використовуються для переміщення вгору по стеку викликів та вибору цього кадру (функція gds-up), d , C-n та стрілка вниз – для переміщення вниз (gds-down) , а клавіша RET використовується для вибору кадру, на якому знаходиться курсор.

Вибір кадру стека призводить до відображення відповідної частини вихідного коду. Крім того, деякі функції також будуть використовувати оточення, що відносяться до обраного кадру, під час виконання.

До додаткових функцій, що працюють у буфері стека відносяться такі:

gds-evaluate (клавіша e)дозволяє обчислити вираз, використовуючи оточення, що відповідає обраному кадру, при цьому результат відображається в луні; gds-frame-info (i)показує інформацію про вибраний кадр — рядок у вихідному файлі, відповідний вираз, тип кадру тощо; gds-frame-args (A)показує аргументи кадру програми; gds-proc-source (S)показує вихідний код викликаної процедури. Ця функція дуже корисна в тих випадках, коли процедура створена анонімним лямбда-виразом, оскільки такі процедури показуються в стеку функцій викликів у вигляді Що не робить зрозумілим, що буде виконано далі.

Для продовження виконання перерваної програми, gdsреалізує наступні функції:

gds-go (g, c або q)продовжує виконання програми; gds-step-file (SPC)виконує один крок функцій, що відносяться до того ж вихідного файлу, що і фрейм стека. Функції з інших файлів будуть виконуватись, але без входу до них; gds-step-into (i)виконує наступний крок. Це найбільш детальний рівень виконання програми; gds-step-over (o)виконує програму доти, доки буде закінчено виконання обраного кадру стека.

Користуючись усіма цими функціями, розробник може отримувати детальну інформацію про стан програми, і отримує можливість знаходження та виправлення помилок.

Scheme48

scheme48- Ще один пакет заснований на cmuscheme, але реалізує розширену підтримку реалізації Scheme48. Цей пакет додає підтримку font-lockдля ключових слів та операторів, специфічних для Scheme48, а також додаткові прив'язкиклавіш для команд обчислення виразів.

Процедура встановлення цього пакета стандартна - помістіть gambit.el у місце, де його знайде Emacs, і додайте наступні рядки до файлу ініціалізації:

(autoload "gambit-inferior-mode "gambit" "Hook Gambit mode в cmuscheme.") (autoload "gambit-mode "gambit" "Hook Gambit mode в scheme.") (add-hook "inferior-scheme-mode-hook (function gambit-inferior-mode)) (add-hook "scheme-mode-hook (function gambit-mode)) (setq scheme-program-name "gsi -: d-" )

Інтерпретатор Gambit запускається за допомогою функції run-scheme, реалізованої в cmuscheme, але gambitдодає до неї процедури фільтрації виводу, що дозволяє пакету отримувати інформацію про місцезнаходження вихідному файлі. Після запуску інтерпретатора, користувач отримує можливість використовувати стандартні комбінації клавіш для виконання та компіляції коду - C-x C-e, C-c C-l, C-c C-k і т.д.

На додаток до функцій cmuscheme, пакет gambitпропонує кілька функцій, призначених для налагодження вихідного коду:

gambit-continue (F8 або C-c c)продовжити виконання коду. Аналогічно команді, з інтерпретатора; gambit-crawl-backtrace-newer (F9 або C-c])перейти до попереднього кадру в ланцюжку. Аналогічно команді - інтерпретатора; gambit-crawl-backtrace-older (F10 або C-c [)перейти до наступного кадру в ланцюжку. Аналогічно команді + інтерпретатора; gambit-step-continuation (F11 або C-c s)виконати один крок обчислення включаючи входження в функцію, що викликається. Аналогічно команді, інтерпретатора; gambit-leap-continuation (F12 або C-c l)виконати один крок обчислення, не заходячи в функцію, що викликається. Аналогічно команді, інтерпретатора; gambit-kill-last-popup (C-c _)видалити вікно, створене для показу висловлювання.

Існують і більш короткі комбінації клавіш для цих команд: M-c, M-[, M-], M-s, M-l і M-_, але вони за замовчуванням не активовані, оскільки вони не зовсім відповідають угодам, прийнятим для комбінацій клавіш в Emacs. Щоб дозволити їх використання, вам необхідно виконати наступну команду (або помістити її у файл ініціалізації):

(setq gambit-repl-command-prefix "\e" )

Bee-mode (bmacs)

bmacs- Це реалізація інтегрованого програмного середовища для роботи з Bigloo Scheme. Цей пакет реалізує такі можливості:

  • налагодження коду;
  • профільування;
  • автоматичне створення та оновлення файлів Makefile;
  • навігація за кодом;
  • інтеграція із системами контролю версій;
  • перегляд документації;
  • інтерактивне виконання коду;
  • розкриття макросів;
  • деяка підтримка грамотного іміджу програмування (literate programming).

Для роботи цього пакета потрібна наявність деякої кількості додаткових утиліт, більшість з яких постачається разом із Bigloo. Документацію можна знайти на сайті проекту або у складі дистрибутива.

Встановлення та налаштування

Цей пакет поставляється у складі Bigloo Scheme і знаходиться у підкаталозі bmacs дистрибутива. Для встановлення пакету треба перейти до цього каталогу і виконати команду:

Make make install EMACSDIR =

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

(autoload "bdb "bdb" "bdb mode" t) (autoload "bee-mode "bee-mode" "bee mode" t) (setq auto-mode-alist (append "(("\\.scm$" )). bee-mode) ("\\.sch$" . bee-mode) ("\\.scme$" . bee-mode) ("\\.bgl$" . bee-mode) ("\\.bee$ " . bee-mode)) auto-mode-alist))

Установки пакета можуть бути встановлені, використовуючи групу налаштування bee , яка забезпечує завдання налаштувань bee-mode, та груп dbg & bug, що використовуються для налаштування налагодження.

Робота з вихідним кодом

Після завантаження bee-modeкористувач може виконувати основні команди, використовуючи відповідні іконки тулбара, або вибираючи потрібні пунктиз меню Bee, яке з'являється під час запуску режиму.

Для розміщення відступів відповідно до прийнятих для Bigloo угод, пакет bee-modeвизначає кілька функцій: bee-indent-sexp (C-M-q) розставляє відступи для поточного виразу, bee-indent-define ( C-c TAB C-d) робить це для поточного визначення функції bee-indent-last-sexp (C-c TAB C-l) розставляє відступи висловлювання перед курсором тощо.

Дуже важливий набір функцій, які використовуються під час роботи з вихідним кодом, це функції пошуку визначень функцій та змінних. Щоб знайти визначення змінної, можна скористатися функцією bee-tags-find (C-x 5 .) або bee-tags-find-variable (C-c C-d f). Для пошуку визначення модуля існує функція bee-find-module (C-c C-d m). Крім того, bee-modeперевизначає два сполучення клавіш - M-. & M-, які прив'язуються до функцій bee-tag-find та bee-tags-find-next , що дозволяє знаходити визначення функцій та класів.

Для спрощення роботи з модулями, bee-modeвизначає набір функцій, які управляють списком модулів імпортованих поточним вихідним кодом - функція bee-import-binding (C-c RET i), а також списком функцій та змінних, що експортуються з поточного модуля - bee-export-function (C-c RET f) та bee- export-variable (C-c RET v). Крім того, існує окрема функція, яка дозволяє імпортувати символи з файлів мовою C - bee-import-c-file (C-c RET c), а також вона оновлює Makefile, додаючи залежність для компіляції відповідного коду.

Пакет також забезпечує деяку підтримку з так званого грамотного програмування (literate programming). Підтримка, що реалізується, не є повною, але принаймні дозволяє вставляти в код посилання на описи модулів і функцій. Це досягається за рахунок використання ключових слів @path, @node & @deffn у коментарях для модуля та описів функцій. Ключові слова @path & @node визначають файл і розділ документації, що описують цей модуль, і вказуються в коментарі для оголошення модуля. А ключове слово @deffn вказується у коментарі для функції. Використовуючи ці ключові слова, розробник отримує можливість швидкого переходу до відповідних розділів та описів функцій, що дозволяє покращити документування коду.

Виконання та компіляція коду

Як і інші пакети, bee-modeдозволяє виконувати код Scheme безпосередньо із буфера Emacs. Для запуску інтерпретатора необхідно виконати функцію ude-repl-other-frame (C-c C-r C-r), вибрати відповідну іконку тулбара ( Repl), або пункт меню.

І після завантаження інтерпретатора, користувач може виконувати код, використовуючи такі функції:

  • ude-repl-send-buffer (C-c C-r b) передає для обчислення весь буфер;
  • ude-repl-send-region (C-c C-r r), передає інтерпретатору виділений блок коду;
  • bee-repl-send-define (C-c C-r d) використовується для виконання поточного визначення (define);
  • bee-repl-send-last-sexp (C-c C-r l) обчислює значення виразу перед курсором;
  • bee-repl-send-toplevel-sexp (C-c C-r t) використовується для обчислення всього поточного виразу.

Дуже часто при використанні макросів необхідна можливість їхнього розкриття. Так само як і для роботи зі звичайним кодом, bee-modeреалізує набір функцій для розкриття макросів у вашому коді (при цьому весь буфер буде просканований щодо наявності визначень макросів):

  • bee-expand-buffer (C-c C-e C-e) призводить до розкриття макросів у поточному буфері;
  • bee-expand-region (C-c C-e C-r) розкриває макроси у виділеному коді;
  • bee-expand-define (C-c C-e C-d) розкриває макроси у поточному визначенні (define)
  • bee-expand-last-sexp (C-c C-e C-l) здійснює розкриття макросів у виразі перед курсором;
  • bee-expand-toplevel-sexp (C-c C-e C-t) розкриває макроси у поточному виразі.

Для компіляції програм необхідна наявність файлу Makefile, який описує залежності між модулями та вказує прапори компіляції. Для проекту потрібна наявність так званого кореневого каталогу. bee-modeнамагається визначити кореневий каталог проекту шляхом пошуку одного з файлів Makefile .

Після того, як кореневий каталог заданий, Makefile може бути згенерований за допомогою функції ude-generate-makefile (C-c C-ca або C-c C-c C-l), яка запросить у користувача ім'я модуля, в який буде скомпільований даний вихідний код. У тому випадку, якщо Makefile вже існує, то ці комбінації клавіш оновлюють його, а також перебудовують файли .afile і .etags . Крім того, є набір функцій для редагування Makefile - ude-edit-makefile (C-c C-c e), оновлення Makefile - ude-update-makefile (C-c C-c u), перемикання між налагоджувальною та остаточною версіями програми - ude-makefile-debug-mode (C-c C-c C-d) & ude-makefile-final-mode (C-c C-c C-f) та інші.

Коли Makefile існує, з'являється можливість компіляції коду за допомогою функції ude-mode-compile-from-menu (C-c C-c C-c) . Перервати компіляцію можна за допомогою функції kill-compilation (C-c C-c k).

І після того, як компіляція закінчиться, можна виконати модуль за допомогою функції ude-execute (C-c C-c C-r).

Налагодження та профільування

Разом з пакетом Bigloo поставляється і налагоджувач, який дозволяє проводити налагодження на рівні вихідного коду. bee-modeпідтримує взаємодію з цим налагоджувачем в Emacs. Для запуску відладчика потрібно виконати функцію bee-debug (C-c C-b C-b) або вибрати відповідну іконку тулбара або пункт меню. Але запуск налагоджувача не призводить до автоматичного підключення до нього, тому необхідно явно виконати функцію bee-toggle-connect-buffer (C-c C-b c) щоб зв'язати поточний буфер з налагоджувачем, що дозволить встановлювати точки зупинки та виконувати інші завдання, перебуваючи в буфері з вихідним текстом. .

Профілювання програм підтримується автоматично, якщо ви користуєтеся генерацією Makefile. Щоб провести профіль коду, необхідно його спочатку скомпілювати за допомогою профілювання, що виконується функцією bee-profiler-start (C-c C-p c). А після компіляції, ви можете виконати функцію bee-profiler-inspect (C-c C-pi), що призведе до запуску програми, а потім до запуску утиліти bglprof , яка збере дані про виконання, і ви отримаєте їх у зручному для аналізу вигляді.

Інші функції

Пакет надає можливості отримання довідкової інформації. Це може бути зроблено шляхом запуску функції bee-doc-visit (C-c C-di) або натискання на іконку Info в тулбарі. Ця функція поводиться по-різному в залежності від поточного положеннякурсора — якщо курсор знаходиться на ідентифікаторі, то видається документація для цього ідентифікатора, якщо виділено регіон коду, то буде видано документацію для цього регіону. В іншому випадку, у користувача буде запитано ім'я розділу документації, що цікавить, і показаний вибраний розділ.

Інформація, що показується користувачеві, береться з файлів у форматі Info, які поставляються разом з Bigloo. Крім того, документація шукається в каталогах поточного проекту і вони додаються автоматично. Крім того, користувач може вказати додаткові файли документації, в яких здійснюватиметься пошук.

Пакет bmacsтакож представляє кілька функцій до роботи з системами контролю версій, які дозволяють оперувати даними лише на рівні проектів. Але у зв'язку з появою нових систем контролю версій та відповідних інтерфейсів для них ці функції стають не особливо затребуваними.

Крім того, існує безліч додаткових функцій, реалізованих цим пакетом, наприклад, підтримка роботи з кодом, написаним мовою C, тощо, але опис цих можливостей лежить за межами цієї статті.

Підтримка Scheme у SLIME

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

(add-hook "slime-load-hook (lambda () (require "slime-scheme)))

Ця команда встановить хуки, необхідні для роботи зі SLIME, але для кожного з підтримуваних діалектів вам може знадобитися виконати додаткове налаштуваннявідповідно до інструкцій, викладених у відповідному файлі - swank-kawa.scm або swank-mit-scheme.scm.

А все інше, що стосується роботи зі SLIME, описано у відповідному розділі.

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

Крім того, у постачанні bmacsтакож є пакети cee, призначений для редагування коду мовою C, який використовується для написання розширень Bigloo, bug-mode, що забезпечує підтримку відладчика Bigloo, та ude(Unix Development Environment), що реалізує підтримку компіляції, та різних утиліт, що використовуються в роботі з Bigloo.

Якщо Makefile не існує, то ця функція призводить до запуску компіляції виконуваного модуля з одного файлу.

Так званий swank-модуль.

Усі компоненти, що відносяться до Scheme, знаходяться у підкаталозі contrib дистрибутива SLIME, так що не забудьте додати його на шляху пошуку.

Яку Мова вибрати для навчання програмування?Вивчення програмування не варто починати десь із середини.

Спочатку потрібно натренувати мозок, уміння створювати алгоритми та описувати їх знаючи можливості тієї чи іншої мови. У вітчизняних школах та вишах зазвичай вивчають програмування на прикладі Basic або Pascal. До цього часу Pascal вважається одним з кращих мовдля навчання, це строга мова зі статичною типізацією, яка дозволяє без зайвих проблемвідпрацювати принципи процедурного та об'єктно-орієнтованого програмування. Але, познайомившись із навчальними матеріалами провідних західних університетів (Berkeley, Stanford, MIT), схожу на думку, що непогано було б розпочати вивчення з однієї з функціональних мов.

Взагалі досить дивно, але функціональна парадигма завзято ігнорується вітчизняною освітою. Щоб згладити цю прогалину, хотів би розповісти про мову програмування Scheme.

Scheme – це дуже проста мова програмування. Його цілком можна вивчити за один день, але ця простота оманлива. Scheme одночасно і дуже потужна мова. Існує безліч реалізацій.

Програми сертифікації зберігаються в файлах *.scm, або можна використовувати інтерактивний режимінтерпретатора, за аналогією з Python.

Константи та змінні

Приступимо до вивчення основних структур Scheme. Насамперед, визначимося з константами:

123 - ціле число

3.1415926 - дробове число

2 + 3i – комплексне число

2/3 - дріб

# B1111 - двійкове число

#xFF - шістнадцяткова стаття

# O123 - вісімкове число

#\A - одиничний символ

"Hello, World!" - Символьний рядок

"Hello - символ

#f - логічне значення

З константами можна здійснювати операції за допомогою операторів чи функцій. Зрештою, Scheme є функціональною мовою, а тому в ній є всі функції.

З математики ви знайомі з формою запису функцій f(x) або t(a, b). Але те саме можна записати і у вигляді (f x) або (t a b). Саме таку форму запису використовує Scheme. Не як арифметичний вираз, що записуються у формі, наприклад 2 + 3, а у префіксальному - (+ 2 3).

Наприклад:

guile> (+ (* 3 4) (/ 5 2))

29/2

guile> (+ 1 1 1 1 1)

guile> (/ 2)

guile> (sqrt 2)

1.4142135623731

Для оголошення змінних використовується конструкція (define ім'я значення)

guile> (define a 2)

guile> (define b 2)

guile> (+ a b)

Значення вже існуючої змінної можна змінити за допомогою конструкції (set! Ім'я значення)

guile> (set! a 5)

guile> a

Функції оголошуються за допомогою конструкції (define (ім'я параметра) тило_функції)

guile> (define (square x) (* x x))

guile> (square 3)

Для демонстрації рекурсії наведу приклад обчислення факторіалу:

(Define (fact x)

(If (= x 1)

(* X (fact (- x 1)))))

Як ви вже зрозуміли, перевірку умови можна виконувати за допомогою конструкції.

Не заглиблюючись у подробиці, зверну увагу на основні функції

(Display "Hello, World!") - Вивести рядок

(Newline) - перейти на новий рядок

Для роботи з наборами даних зручно використовувати списки

guile> (define nums (list 1 2 3 4 5 6 7 8 9 10)) - оголошуємо список

guile> (list-ref nums 0) - читаємо елемент із номером 0

guile> (car nums) – читаємо перший елемент

guile> (cdr nums) - читаємо всі інші елементи

(2 3 4 5 6 7 8 9 10)

Можна обробити всі елементи списку заразом

згенерувати новий список застосувавши функцію для кожного елемента

guile> (map square nums)

(1 4 9 16 25 36 49 64 81 100)

guile> (map (lambda (x) (* x 3)) nums)

(3 6 9 12 15 18 21 24 27 30)

Конструкція lambda дозволяє оголошувати функції при необхідності, не даючи їм імен. Якщо ви програмуєте на Python, то знаєте ці конструкції.

Насправді, Scheme не має цикли у тому вигляді як вони є у імперативних мовах. Тут для тих самих цілей використовується рекурсія. Наприклад, виведемо в стовпчик вміст списку

(Define (print-list lst)

(If (not (null? Lst))

(Begin (display (car lst))

(Newline)

(Print-list (cdr lst)))))

Конструкція (begin...) використовується в тому випадку, якщо потрібно вставити кілька операторів там, де за синтаксисом допускається тільки один.

Наступна конструкція дозволяє змоделювати відомий з інших мов програмування цикл for:

(Let loop ((i 1))

(Display i)

(Newline)

(If (<= i 10) (loop (+ i 1))))

Конструкція let використовується у разі, коли у межах висловлювання потрібно оголосити локальні змінні, або якщо потрібно оголосити вкладену функцію. Таким чином, можна реалізовувати практично всі можливі варіанти циклів. Звичайно, завжди можна створити власну функцію для скорочення форми запису, адже функції можна передавати у вигляді інших параметрів, як і прості дані. Взагалі, Scheme дозволяє підігнати мову під себе оскільки подобається. Напрочуд гнучку мову.

Наприклад, можна навести реалізацію функції обчислення певного інтегралу

(Define (func x)

(Define (integrate a b e f)

(Define sum 0)

(Let loop ((i a))

(If (

(Set! Sum (+ sum (*(fi)) e)))

(Loop (+i e)))))

Sum)

(Display (integrate 0 1 0.01 func))

(Newline)

Офіційний сайт Guile

Schemers.org

Відеозаписи лекцій з курсу The Structure and Interpretation of Computer Programs в університеті Berkeley

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

Вступ

Scheme- функціональна мова програмування, одна з двох найбільш відомих у наш час діалектів мови Lisp. Гай Стіл (Guy L. Steele)і Джеральд Сассмен (Gerald Jay Sussman)з Массачусетського технологічного інституту ( MIT) - Створили його в середині 1970-х років. Саме Schemeдовгий час застосовувався в MITдля навчання програмування (зараз замінений на Python) і саме на Schemeнаписані приклади у знаменитій книзі "Структура та інтерпретація комп'ютерних програм"- біблії будь-якого поважаючого себе програміста.

Для інтегрованого середовища розробки Eclipseіснує плагін, що дозволяє програмувати на Scheme. У цій статті ми розглянемо основні можливості даного плагіна, вивчимо процес його використання та процедуру налаштування.

Плагін називається SchemeScript і є частиною проекту SchemeWay. Завантажити останню версію даного плагіна можна з сайту (після завантаження досить скопіювати jar-файлу каталог eclipse/plugins). Проект активно розвивається, остання версія має назву 1.3.0 alpha10та випущена 09.05.2010 р. Вихідний код доступний на GitHub. Додаткову інформацію про плагін, деякі трюки, які допускає SchemeScript, та його можливості можна дізнатися з блогу Dominique Boucher- Автора даного розширення.

Варто зазначити, що навіть остання версія SchemeScriptне працює в Eclipse Helios, тому поки що для розробки мовою Schemeслід використовувати Eclipse Galileo.

UPD 17.07.10:Остання версія на GitHub працює в Eclipse HeliosАле її потрібно збирати з вихідних джерел. Через деякий час Домінік обіцяв перезбирати і дистрибутив.

Eclipse-перспектива Scheme

Після встановлення плагіна стане доступною Eclipse-перспектива Scheme. За замовчуванням вона виглядає так:

Перспектива включає вигляд (у термінах Eclipse) навігатора за проектами - Navigator, вид з відображенням розібраного вмісту файлу, що редагується - Outline, в якому відображатиметься список визначень констант і функцій, а також два згорнуті види: вид з іконкою у вигляді букви лямбда - Definitionsі вигляд Console.

У головне меню Eclipseдодано групу команд Scheme, призначена передусім керувати інтерпретатором. На панель швидкого запуску виведено три кнопки (забезпечені іконками у вигляді букви лямбда), ліворуч: запустити інтерпретатор, перезапустити інтерпретатор і зупинити інтерпретатор.

Перш ніж приступати до роботи з редактором, необхідно створити Eclipse-проект, в якому зберігатимуться файли вихідного коду. Специфічного для Schemeтипу проекту плагін SchemeScriptне надає, тому потрібно створити звичайний проект із каталогу General:

Створений проект відобразиться у навігаторі:

Тепер у проекті можна виконати New -> Fileта створити файл, призначений для зберігання вихідного коду на Scheme. Цей файл повинен мати розширення .ssабо .scm. Файли з цими розширеннями редагуватимуться за допомогою спеціального редактора з постачання SchemeScript.

Редагування вихідного коду

SchemeScriptнадає редактор вихідного коду мовою Schemeіз досить багатими можливостями. Розглянемо їх докладніше.

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

Редактор містить вбудований аналізатор коректності S-виражень. Якщо, наприклад, пропустити дужку, що закриває, то буде згенеровано повідомлення про помилку:

Існує така ж корисна річ, як автопідстановкаабо автозавершення виразів. Тобто, якщо при наборі натиснути Ctrl+Space, то спливе віконце з доступними варіантами завершення конструкції, що вводиться:

При створенні визначень (наприклад, за допомогою ключового слова define) вони додаються до вигляду Outline, що дозволяє за необхідності швидко звернутися до потрібного визначення:

Плагін SchemeScriptдодає дві групи пунктів у контекстне меню редактора коду: Source- містить команди редагування вихідного коду - та Eval- Містить команди його інтерпретації:

Розглянемо групу пунктів меню Source:

Find definition- Здійснює пошук визначення символу у вихідному коді. Тобто, наприклад, нам потрібно подивитися як визначений символ sqr. Для цього потрібно поставити курсор після цього символу

та натиснути F12. Курсор буде переміщений для визначення функції sqr, причому дане визначення буде виділено:

Complete symbol- З цією командою ми вже познайомилися, це - команда автозавершення.

Describe symbol- виводить підказку з описом символу. Наприклад, розглянутий нами у минулому прикладі символ sqrє функцією:

Insert header comment- Додає глобальний коментар на початок файлу з вихідним кодом. У налаштуваннях (див. нижче) можна визначити деякі поля такого коментаря – автор, копірайт тощо.

Insert chapter comment- Додає коментар до деякого блоку коду - набору функцій та визначень.

Insert section comment- Додає коментар до конкретної функції або визначення.

Toggle comment- закоментувати/розкоментувати виділений блок коду. Якщо блок коду не є коментарем, то до нього додаються лідируючі символи ";":

І, відповідно, навпаки - якщо якийсь вираз закоментований, то символи коментарів забираються:

Compress spaces- прибирає зайві попередні та наступні прогалини та символи перекладу рядка. Щось на кшталт функції trim:

Формат- Здійснює форматування коду відповідно до заданих налаштувань. Розставляє відступи, прибирає зайві прогалини та перенесення рядка.

Код до форматування

Код після форматування

Swap S-expressions- Змінює порядок слідування S-виразів одного рівня вкладеності. Наприклад, якщо у попередньому прикладі виконати цю команду, то listі lambdaпоміняються місцями:

У пункті Schemeголовного меню Eclipseміститься команда Find Scheme Symbol(доступна так само по Ctrl+F12). При виклику цієї команди з'являється діалогове вікно, що дозволяє швидко визначити потрібну функцію. Наприклад, у нас у файлі вихідного коду визначено функцію sqrвідповідно, якщо в полі Enter the symbol prefix:діалогового вікна ввести sq, то в полі Matching symbolsз'явиться певна в коді функція sqr:

Якщо з поля Matching symbolsвибрати цю функцію, то курсор у редакторі автоматично перейде до місця визначення. Припустимо, що ми маємо кілька файлів з вихідним кодом і в кожному визначено функцію sqr. Тоді, крім самої функції, потрібно ще вибрати файл. Для цього слугує вигляд Definitions, який після вибору функції поміщається інформація про варіанти її визначення з різних файлів:

Інтерпретація

Коли код написаний, його хочеться перевірити, наприклад, запустивши на інтерпретаторі Scheme. Плагін SchemeScriptнадає можливості для цього. Насамперед, це пункт Schemeголовного меню Eclipse, що містить команди вибору потрібного інтерпретатора та управління ним: запуск, перезапуск та зупинка (необхідний у разі зависання програми, наприклад - вічного циклу. Т.к. Schemeможе оптимізувати хвостову рекурсію, вічний цикл – справді вічний).

На малюнку видно варіанти вибору інтерпретатора. Насамперед це - External Interpreter- Підключає зовнішній інтерпретатор, встановлений на тій же машині, що і Eclipse. Інтерпретаторів Schemeзараз багато, під Windowsможна використовувати, наприклад, Chez Scheme.

Embedded Kawa- що входить у постачання SchemeScriptінтепретатор Kawa. Являє собою розроблюваний під егідою GNUна Javaфреймворк для реалізації високорівневих та динамічних мов, код з яких компілюється у Java-байткод. Дозволяє легко використовувати в коді на Scheme Java-класиі тому гарний як скриптова мова. Крім інтерпретатора містить і компілятор, що дозволяє використовувати його як повноцінну мову під JVM, як використовуються Scala, Groovyі Clojure. Деякі ентузіасти використовують Kawaдля розробки програм, що працюють на платформі Android.

Remote Interpreter- дозволяє вибрати в якості інтерпретатора спеціальний сервер, запущений іншою машиною. Наприклад, в інституті під час навчання програмуванню можна підняти спеціальний сервер, який вміє інтерпретувати Scheme-код. Взаємодія SchemeScriptі даного інтерпретатора здійснюватиметься через мережу.

SISC Interpreter- вбудований REPLвід Second Interpreter of Scheme Code- написаного на Javaінтерпретатора Scheme.

Після вибору працюючого інтерпретатора, наприклад Kawa, потрібно запустити відповідною командою меню або кнопкою з панелі швидкого запуску:

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

Ця група містить такі команди:

Eval top expression- Виконати вираз верхнього рівня щодо того, в якому знаходиться курсор. Якщо курсор знаходиться перед останньою дужкою, що закриває - див. малюнок

і виконано цю команду, то в інтерпретатор буде завантажено визначення функції sqr.

Eval previous expression- Виконати попередній щодо курсору вираз. Якщо у прикладі

виконати цю команду, то в інтерпретатор буде завантажено вираз (* x x), що він зможе виконати, т.к. параметр xне визначений:

Load file in Interpreter- Завантажити файл в інтерпретатор, тобто. виконати в інтерпретаторі весь вміст файлу.

Розглянемо приклад: існує код функції, яка обчислює n-е число Фібоначчі. Ми хочемо обчислити четверте число Фібоначчі:

Якщо виконати команду Eval previous expressionпісля (Fib 4), то буде згенеровано помилку: інтерпретатор не знає визначення функції fib:

Якщо ж виконати команду Load file in Interpreter, а потім - Eval previous expression, то обчислення пройде коректно:

Підтримка Kawa REPL

Read-eval-print loop (REPL)- Просте інтерактивне середовище програмування, в даному середовищі користувач може вводити вирази, які відразу будуть обчислені, а результати обчислення - відображені користувачеві.

В склад Kawaвходить таке середовище. Наприклад, можна прямо в консолі із запущеним інтепретатором визначити функцію sumі обчислити її значення щодо якихось аргументів (кожний рядок трактується як один вираз):

Додатково так само існує вигляд Kawa Stack Trace, що дозволяє стежити за станом стека викликів під час налагодження. Щоб зрозуміти як ним користуватися - змоделюємо помилку, наприклад, викличемо функцію, що обчислює квадрат числа, від аргументу "ss":

Kawaне зможе обчислити значення даного виразу та виведе на екран помилку приведення типів:

Стектрейс при цьому виглядатиме так:

Якщо віджати у вигляді Kawa Stack Traceкнопку Show Scheme frames only, то буде відображено повний стектрейс, що містить у тому числі і виняткові ситуації в коді, написаному на Java, а не тільки на Scheme:

Налаштування

Плагін SchemeWayє досить гнучким розширенням для середовища розробки Eclipse. Щоб розібратися з усіма його можливостями, обов'язково варто розглянути налаштування. Дерево налаштувань починається з групи Scheme:

На сторінці Schemeдоступні такі настройки:
- Displayed tab with- дозволяє встановити ширину (в пробілах) для відображення символу табуляції. Це працює лише якщо в команді не прийнято замінювати табуляції на прогалини.
- Enable structural editing- галочка відповідає за включення/вимкнення структурованого редактора Scheme. Структурований редактор працює не з символами, а з S-виразами цілком. Тобто. по backspaceНаприклад, видалятиметься відразу всі S-вирази. Так само при відкритті дужки відразу ж додаватиметься парна закриваюча.
- Save...і Load...дозволяють зберегти та навпаки - завантажити - налаштування SchemeScriptв/із .epf-файл/а.

Сторінка Appearanceвідповідає за зовнішній вигляд редактора. Дозволяє налаштувати колір, яким виділятиметься парна дужка (група Matched parenthesis), колір фону редактора (група Background) та кольори, що використовуються при підсвічуванні синтаксису (група Foreground).

На малюнку наведено приклад установки для рядкових констант синього кольору.

Сторінка Commentsвідповідає за відображення коментарів. На ній представлені наступні опції:
- Prefix for comments- префікс, з якого розпочинатиметься коментар. За замовчуванням - дві точки з комою ( ;; ).
- Author field content- Вміст поля Автор, дозволяє задати ім'я/прізвище автора коду.
- Copyright field content- Вміст поля Копірайт, дозволяє задати інформацію про авторські права.
- Automatically continue comment from previous line- якщо ця галочка встановлена, то при натисканні Enterпісля коментаря новому рядку коментар продовжитися, тобто. новий рядок почнеться з ;; .

Сторінка Fast Eval Keysдозволяє задати команди (тобто імена Scheme-функцій), які будуть виконані при натисканні клавіатурних комбінацій. За замовчуванням кожному Fast Eval Key 0 ... 9відповідає комбінація клавіш Alt-K, 0...9. При активному використанні плагіна у кожного розробника формується набір назв методів, які він постійно викликає (наприклад, метод testдля запуску якогось тестуючого коду). Відповідно, виклик даних методів можна призначити на клавіатурні комбінації.

Сторінка Indentationслужить для налаштування відступів, що додаються під час написання/форматування коду. Для кожного ключового слова можна вказати налаштування відступів, які застосовуються для його аргументів. Таблиця налаштувань влаштована так: у колонці Symbolзадається ключове слово, відступи якого налаштовуються. Колонка Indentation schemeзадає схему розміщення відступів. Схеми бувають такими:
- default- всі під-вирази вирівнюються нижче за перший символ свого обрамляючого виразу.
- definition- всі вирази вирівнюються як обрамляє вираз + 2 пробіли (схоже на оформлення форми define).
- if- всі вирази вирівнюються як обрамляє вираз + 4 пробіли (схоже на оформлення форми if).
- none- немає відступів, всі вирази вирівнюються так само як і вираз, що обрамляє.
- with- найбільш складна форма вирівнювання, використовується для функцій з довгими іменами та/або великим списком параметрів. Перші N-параметрів вирівнюються з відступом в 4 пробіли, інші - в 2. Стовпець Hintзадає величину N. Прикладом використання цієї форми є вирівнювання ключового слова let:

Сторінка Interpreterдозволяє задати налаштування інтерпретації та аналізу коду. Поки що таких параметрів дві: - якщо галочка встановлена, то перед відправкою на інтерпретацію файл буде збережено. Дозволяє не пам'ятати про збереження змін перед інтерпретацією.
- Surround exressions with (begin ...)- чи обрамлювати вирази, що інтепретуються, у форму (begin...). Як я розумію, ця опція необхідна для роботи з деякими інтепретаторами, які можуть виконувати тільки один S-вираз.

Сторінка External Interpreterдозволяє вказати зовнішній інтерпретатор, що використовується. Можна встановити такі параметри:
- Interpreter name- Назва інтерпретатора
- Command line- Командний рядок, що включає повний шлях до інтепретатора і якісь потрібні йому для роботи опції.
- Working directory- робочий каталог інтерпретатора - каталог, щодо якого він обчислюватиме шляхи до файлів.
- Error Regexp- Регулярне вираження для розбору помилок. Інтерпретатор видає повідомлення про помилки у якомусь своєму форматі, SchemeScriptповинен знати, як з цього рядка з помилками отримати інформацію про місце знаходження помилки у вихідному коді. Наприклад, для Kawaдане регулярне вираз наступне: [\t ]+at [^(]+\(((.+):(+))\).

На малюнку вище показано запущений в консолі зовнішній інтерпретатор chez-scheme.

Сторінка Remote Interpreterмістить налаштування підключення до віддаленого інтепретатора - інтерпретатора, запущеного як сервер і слухає певний порт. Відповідно, ця сторінка дозволяє задати ім'я хоста та порт, на якому цей віддалений інтерпретатор працює.

Сторінка Lexical extensionsслужить для управління лексичними розширеннями Scheme. Містить два пункти:
- Treat brackets ( or ()) як parentheses- чи обробляти фігурні та квадратні дужки так само як і круглі. Тобто. чи підсвічувати пару і чи контролювати парність дужок.
- Accept dash (#) as identifier part- чи дозволяти використовувати символ ґрат як частина імені ідентифікатора (як я зрозумів - працює не для всіх інтерпретаторів Scheme).

Остання сторінка - Syntax- дозволяє гнучко керувати обробкою синтаксису мови - додавати та видаляти конструкції з груп, що впливає на підсвічування синтаксису під час редагування. На цій сторінці визначено 5 груп:
- Define- визначення, що містять ключові слова, з яких починаються визначення, наприклад - define.
- Special names- спеціальні іменовані параметри, такі як #!keyабо #!rest.
- Special forms- спеціальні форми, такі як if, and, letі т.д. По суті – основна частина ключових слів мови програмування.
- Mutator- Мутатори, тобто. функції, що змінюють стан. Підсвічуються інакше, ніж функції, що не змінюють стану.
- Constant- Константи, такі як #!eof, #!nulта ін. Можна додати так само #tі #f.

До кожної групи можна додавати свої елементи, а також видаляти існуючі. Це дуже зручно при розробці власного DSLна базі Schemeта роботи з ним у редакторі. Крім явного додавання варіантів, у кожній групі можна вказати регулярне вираз, що відповідає її членам.

Ось що буде, якщо додати до групи Defineключове слово pavel:

Висновок

Ми розглянули багатий можливостями і гнучкий інструмент для розробки мовою програмування Schemeу середовищі Eclipse. Даний інструмент дозволяє редагувати вихідний код, взаємодіяти з широким набором інтепретаторів, у тому числі вбудованими та віддаленими. Якщо порівнювати можливості даного плагіна з інструментарієм для розробки на Scheme, наприклад, під Emacs, то вони цілком співставні (за винятком відсутності таких дрібниць, як заміна ключового слова lambdaна символ грецької букви лямбди). Будь-який програміст, який не хоче освоювати Emacsможе використовувати Eclipseдля знайомства з функціональним програмуванням чи мовою Scheme, а також для вирішення завдань та вправ з SICP. Також можливо когось зацікавить тема розробки на Schemeпід JVMз використанням Kawa.

Хочеться сказати дякую автору SchemeScript - Dominique Boucher, що безкоштовно розробляє цю утиліту. Варто зазначити, що плагін SchemeScriptє проектом з відкритим вихідним кодом і будь-який програміст може допомогти у його розвитку, додавши можливості, які йому потрібні.

З.И. Виникла думка, що ту ж Schemeважко вивчати, бо не цікаво – немає цікавих завдань. Звичайні математичні якісь обчислення нецікаві, а навіть для простої роботи з графікою, наприклад, потрібна платформа та бібліотеки. Цікавіше вивчати мову, прикладаючи її до якоїсь предметної галузі. Так ось, SchemeScript + Kawa + Eclipseможуть використовуватися як платформа для навчання. Подивіться приклади з SchemeScript(у jar-файлі каталог examples), там є досить цікаві.

Як завжди ви можете залишити свої коментарі або поставити запитання Суворому челябінському програмісту.

Сподобалося повідомлення -

Вступ

При розробці Scheme акцент був зроблений на елегантність та простоту мови. Філософія мови підкреслено мінімалістську. Його мета - не звалювати в купу різні корисні конструкції та засоби, а навпаки - видалити слабкості та обмеження, що викликають необхідність додавання до мови нових можливостей. В результаті Scheme містить мінімум примітивних конструкцій і дозволяє висловити все, що завгодно шляхом надбудови над ними. Як приклад можна вказати, що мова використовує 2 механізми організації циклів:

  1. "залишкова" або "хвостова" рекурсія (англ. tail recursion)
  2. ітеративний підхід (у якому використовуються тимчасові змінні задля збереження проміжного результату).

Scheme був першим діалектом Лиспа, що застосовує виключно статичні (а не динамічні) області видимості змінних, що гарантує оптимізацію хвостової рекурсії і підтримує дані булевського типу (#t і #f замість традиційно незграбних T і NIL). Він також був однією з перших мов, що безпосередньо підтримують продовження(англ. continuations). Починаючи зі специфікації R^5RS, мова придбала виключно потужний і зручний засіб для запису макросів на основі шаблонів синтаксичного перетворення з дотриманням гігієни (англ. hygienic_macro). У Scheme також реалізовано «складання сміття» (англ. garbage collection), тобто автоматичне звільнення пам'яті від об'єктів, що не використовуються.

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

Як курйоз, можна відзначити, що початкова назва мови Schemer була змінена на даний момент через обмеження на довжину імен файлів в ITS.

Приклади

Прості математичні операції

(+ 2 (* 2 2 ) ) (+ 1 2 3 4 )

Виклик кожної операції (або функції) є списком, в якому символ операції (який, по суті, є ім'ям функції) завжди займає початкову позицію.

Предикати типу

(number? 5) (number? "foo") (string? "foo")

За згодою, імена всіх предикатів закінчуються символом? .

Перевірки на рівність

(eq? "foo" "bar") (eq? 5 (+ 2 3)) (eq? (eq? 2 3) (eq? 3 4))

Визначення макросів для традиційних операцій

(define-syntax push! (syntax-rules () ((push! x l ) (set! l (cons x l ) ) ) ) ) (define-syntax pop! ((x (car l)))) (set! l (cdr l)) x)))))

Визначення функцій

;;; факторіал у (неефективному) рекурсивному стилі(define (fact x) (if (< x 3 ) x (* (fact (- x 1 ) ) x) ) ) ;;; функція Фібоначчі – вимагає подвійної рекурсії(define (fib n) (cond ((= n 0 ) 0 ) ((= n 1 ) 1 ) (else (+ (fib (- n 1 ) )) (fib (- n 2 ) ) ) ) ) ;;; сума елементів списку у характерному для Scheme стилі ;;; (допоміжна функція loop виражає цикл за допомогою ;;; хвостової рекурсії та змінної-акумулятора)(define (sum-list x) (let loop ((x x) (n 0 ) ) (if (null? x) n (loop (cdr x) (+ (car x) n) ) ) ) ) (fib 10) (sum "(6 6 6 100))

Визначення функції має відповідати наступному прототипу:

(define ім'я_функції (lambda (список_аргументів) (реалізація_функції) ) ) ,

хоча на практиці частіше використовують скорочену форму:

(define (ім'я_функції аргументи) (реалізація_функції) ) .

Ввід вивід

(write (+ (read) (read)))

Посилання

Російськомовні посилання

Англомовні посилання

Підручники англійською

  • Відео-лекції "Structure and Interpretation of Computer Programs", Harold Abelson та Gerald Jay Sussman
  • Scheme Programming Language, R. Kent Dybvig

Wikimedia Foundation. 2010 .

Дивитись що таке "Scheme (мова програмування)" в інших словниках:

    Мова програмування - формальна знакова система, призначена для запису комп'ютерних програм. Мова програмування визначає набір лексичних, синтаксичних і семантичних правил, що задають зовнішній вигляд програми та дії.