|
Article on other languages:
|
Scheme — это функциональный язык программирования, один из двух наиболее популярных в наши дни диалектов языка Лисп (другой популярный диалект — это Common Lisp). Aвторы языка Scheme — Гай Стил (Guy L. Steele) и Джеральд Сассмен (Gerald Jay Sussman) из Массачусетского технологического института — создали его в середине 1970-х годов.
ВведениеПри разработке Scheme упор был сделан на элегантность и простоту языка. Философия языка подчёркнуто минималистская. Его цель — не сваливать в кучу разные полезные конструкции и средства, а напротив — удалить слабости и ограничения, вызывающие необходимость добавления в язык новых возможностей. В результате, Scheme содержит минимум примитивных конструкций и позволяет выразить все, что угодно путём надстройки над ними. В качестве примера можно указать, что язык использует 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)) Определение макросов для традиционных операций 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)))) Определение функций;; факториал в (неэффективном) рекурсивном стиле (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))))) (fact 14) (fib 10) (sum '(6 6 6 100)) (sum (map fib '(1 2 3 4))) Определение функции должно соответствовать следующему прототипу: (define имя_функции (lambda (список_аргументов) (реализация_функции))), хотя на практике чаще используют сокращённую форму: (define (имя_функции аргументы) (реализация_функции)). Ввод / Вывод(write (+ (read) (read))) СсылкиРусскоязычные ссылки
Англоязычные ссылки
Учебники на английском
|
|||||||||||||||||||||||||||||||||||||||||||||||
This article is from Wikipedia. All text is available under the terms of the GNU Free Documentation License.
Mercedes Car
This site monitored by SitePinger.net