Scheme

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


1. Введення

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

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

Scheme починався з намагання зрозуміти модель акторів Карла Хьюїтта, для чого Стіл і Суссман написали "крихітний інтерпретатор Ліспу ", а потім" додали механізм створення акторів і посилки повідомлень ". Scheme був першим діалектом Ліспу, що застосовують виключно статичні (а не динамічні) області видимості змінних, що гарантує оптимізацію хвостовій рекурсії і підтримуючим дані Булевського типу (# t і # f замість традиційно незграбних T та NIL). Він також був одним з перших мов, безпосередньо підтримуючих продовження. Починаючи зі специфікації R ^ 5RS, мова набула виключно потужний і зручний засіб для запису макросів на основі шаблонів синтаксичного перетворення з "дотриманням гігієни" ( англ. hygienic macro ). У Scheme також реалізована " збірка сміття ", тобто автоматичне звільнення пам'яті від невикористовуваних більше об'єктів.

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

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


2. Приклади

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

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

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

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

 (  number?  5  )  (  number?  "Foo"  )  (  string?  "Foo"  ) 

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

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

 (  equal?  "Foo"  "Bar"  )  (  eqv?  5  (  +  2  3  )  )  (  eq?  'A' A  ) 

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

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

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

 ;; Факторіал в (неефективному) рекурсивному стилі  (  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  (  (  xx  )  (  n  0  )  )  (  if  (  null?  x  )  n  (  loop  (  cdr  x  )  (  +  (  car  x  )  n  )  )  )  )  )  (  fact  14  )  (  fib  10  )  (  sum  -  list  '  (  6  8  100  )  )  (  sum  -  list  (  map  fib '  (  1  2  3  4  )  )  ) 

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

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

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

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

2.6. Введення / Висновок

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

3. Основні реалізації


4. Література. Підручники