Язык программирования scheme pdf
По Scheme учебников посоветуйте мне
Собственно, сабж. Кидайте сюда названия книг по Scheme, которые вам понравились. Можно и на английском.
Благодарю.И заодно компилятор\интерпретатор.
SICP уже советовали?
Спасибо. Какой там интерпретатор используется?
Racket.
ОБЯЗАТЕЛЬНО прочитай user guide: в scheme/racket есть много плюшек, про которые в SICP не говорится.
Sicp и How to Design Programs. Ну а ракет, помойму must use для всех кто пишит на схеме, лучше ничего нету=)
А как в Scheme обстоят дела с разными вкусными библиотеками?
ну вот racket вроде больше всех и заряжен
Емнип, в книге говорится о стандарте R4RS, последная глава вообще про Java.
Что-то мне не по себе.
Я пролистал мельком, увидел нестандартный код (например, define-class).
Надо будет поискать. На первый взгляд, очень годная книга. Как я ее раньше не находил? 🙂
У Комон лиспа проблема что библиотек мало, а у схемы еще меньше((. И еще у него стандартных библиотек тоже мало, т.к. стандарт очень маленький. Но это все не баг а фича, т.к. разрабатывалась схема такой чтоб быть как можно меньше, но мощнее, чтоб если кому то что надо было, мог по быстрому написать.
че то ссыкотно, если мне понадобится какая-нибудь функция типа str*? велосипед строить? или это не так страшно?
str* это что? такая глупость уж точно даже в схеме есть
Совершенно не страшно. По строкам, кстати, целый srfi есть.
это всякие функции типа strstr, strcmp. из C
такая глупость уж точно есть
там собственная реализация ООП.
И еще я слышал, что математику хорошо знать надо. Правда? Что почитать по этому поводу?
У меня бумажная книга 2006 года издательства.
Для SICP хватит школьного курса.
Уже начал изучать. Я в восторге.
По Scheme учебников посоветуйте мне
Может тебе для Форта учебники нужны?
Зачем они тебе для Схемки? Научишься программировать и пойдешь писать на чём-то другом. В здравом уме писать на схемке вряд ли кто будет.
Язык программирования Scheme (Схема)
Кен Дики (перевод Алексея Десятника)
Альтернативный взгляд на мир
Каждый язык программирования представляет собой определенное мировоззрение в понятиях, которые он позволяет (или не позволяет) использовать. Эта серия статей описывает взгляд на мир языка программирования Схема («Схематичное мировоззрение»). Данное мировоззрение содержит множество современных элементов программирования: поддержка различных парадигм программирования, легко сочетаемые, многократно используемые абстракции, возможность создания языка, «заточенного» под определенное применение, четкое различие между переносимыми и непереносимыми частями программы, масштабируемость, начиная от отдельных утилит и заканчивая серьезнейшими программными системами.
Схема начиналась как эксперимент в разработке языка программирования для тестирования некоторых фундаментальных положений в теории разработки программ. Сейчас же она получает расположение со стороны многих известных университетов (таких, как МТИ – Массачусетский Технический Институт) в качестве первого изучаемого языка программирования. Кроме того, Схема используется в промышленности такими компаниями, как DEC, Texas Instruments, Tektronix, Hewlett Packard и Sun.
Что такое Схема?
Схема – это маленький, исключительно «чистый» язык, который (что очень важно!) приятно использовать. Схема разрабатывалась таким образом, чтобы малое число универсальных конструкций можно было легко использовать в разных стилях программирования: функциональном, объектно-ориентированном и императивном. Стандарт языка занимает всего около 50 (!) страниц, включая формальное определение семантики. Схема основывается на формальной модели лямбда-вычислений, так что здесь полно особенностей, удобных для теоретиков; это позволяет достаточно легко построить умные средства разработки программ.
Схема имеет механизм лексических областей видимости, однородные правила вычислений, и однородное понимание типов данных. Схема не имеет понятий указателя, неинициализированных переменных, специальных циклических конструкций или детального управления хранением данных.
На что же похожа Схема? Ну, она сильно смахивает на Лисп. Пусть это вас не пугает: внешний вид Схемы можно изменить (и этим мы займемся в будущем). Что действительно важно, так это те концепции, которые положены в основу Схемы, и возможности их использовать. Итак, давайте сравним Схему и какой-нибудь «классический» язык программирования – скажем, Си. Возможно, вы уже знаете, что Схема использует префиксную запись, в отличие от инфиксной записи Си:
Схема | Си |
(+ 2 3 4) | (2 + 3 + 4) |
( | ((low |
(+ (* 2 3) (* 4 5)) | ((2 * 3) + (4 * 5)) |
(f x y) | f(x, y) |
(define (square x) (* x x)) |
В Схеме все типы данных эквивалентны. Все, что можно сделать с одним типом данных, можно сделать со всеми остальными. Это резко отличается от большинства языков программирования, в которых есть специальные операции для некоторых типов данных, а применение некоторых других типов данных специально ограничено. В большинстве языков, например, числа имеют особые права: они могут быть использованы без присваивания им имен (вообразите, что, например, что в Бейсике каждому число надо было бы назначать имя перед его использованием!). Функции, наоборот, ограничены: они обязаны иметь имя.
В Схеме, функции без имени создаются с помощью ключевого слова lambda:
Возможны семь видов выражений:
(разумеется, в этом списке перечислены далеко не все варианты выражений)
Схема имеет обычный набор типов данных:
Основные моменты:
Числа особенно интересны в Схеме: каждое целое ( integer ) является дробью ( rational ), дробь – действительным числом ( real ), а действительное число – комплексным ( complex ). Числа классифицируются по признаку точности (точное или приблизительное – exact/inexact ):
Философия Схемы
Одна из приятных особенностей Схемы, которая поначалу многих приводит в замешательство – отсутствие ограничений. Схема очень выразительна: программист может «сказать» на этом языке одну мысль (действие) совершенно разными способами. В Схеме программист имеет свободу – и ответственность – «говорить» в точности так, как хочет. Во многих других языках программирования порой приходится искать какие-то «обходные пути», чтобы получить от них требуемое, а в Схеме это просто не нужно.
Смысл всего вышеприведенного: даже простейшие вещи можно сделать совершенно по-разному.
Теперь, когда мы разогрелись, давайте взглянем на старый добрый факториал (напоминаю: факториал – произведение всех целых чисел от 1 до данного числа).
Для начала – рекурсивное определение:
Когда я (Кен Дики) впервые изучал рекурсивные определения наподобие этого, самым сложным было понять, как скрытое состояние функции хранится на стеке. Небольшое преобразование кода делает стек видимым.
Давайте посмотрим, как будет преобразовываться вызов (fact 3) :
Это в свою очередь преобразовывается в
Это – не пример того, как из простых вещей можно легко сделать ужасно сложные. Зачем же мы так сделали? Смысл в том, что мы можем управлять тем, что обычно спрятано на стеке. Это позволяет делать некоторые интересные вещи. Мы можем игнорировать одно «продолжение» и использовать вместо него другое. Мы можем контролировать, например, длительные вычисления. Если они занимают больше времени, чем ожидалось, мы можем сохранить наше продолжение («где мы сейчас») и попробовать другой подход к решению задачи. Если новый вариант еще хуже, мы можем вернуться к сохраненному «продолжению» и продолжить вычисления. Мы, конечно, сможем сохранить и наши попытки сделать лучше на тот случай, если действительно получилось лучше…
Таким образом, использование «продолжений» позволяет строить очень интересные, гибкие управляющие структуры. Давайте теперь посмотрим на факториал с другой стороны. Каждый рекурсивный вызов просто кладет на стек еще один множитель. Но мы можем и не использовать стек, если введем дополнительную переменную-«аккумулятор». Разумеется, перед началом вычислений аккумулятор должен быть равен 1 (так как x*1 = x ).
Внешне эта функция кажется рекурсивной. Однако это не так. В Схеме есть понятие «хвостовой рекурсии», которая делает ненужными обычные циклы. Каждая функция, которая вызывает саму себя в «хвостовой» позиции (т.е. как последнее действие) – это просто цикл.
Итак, мы преобразовали рекурсивную функцию в итеративную, циклическую. Есть формальный (теоретически «правильный») способ такого преобразования; но одна приятная особенность Схемы в том, что эти преобразования просты и наглядны. Правильно работающие программы могут быть написаны быстро, даже если поначалу они могут медленно работать и требовать много памяти. После отладки алгоритма их несложно преобразовать в намного более эффективные – и тоже правильно работающие! Преобразование программ для опытного программиста на Схеме становится второй натурой.
Схема имеет несколько важных преимуществ над другими языками. Ее элегантно простая, однородная структура и тривиальный синтаксис позволяет избегать разных «особых случаев». Ее выразительность позволяет не тратить время на поиск обходных путей: программист может сконцентрироваться на том, что ему нужно сделать, но не на том, как это сделать. Схема поддерживает несколько стилей программирования, включая модное сегодня объектно-ориентированное, – так что программист не должен приспосабливаться под Схему; он может использовать тот стиль или способ решения задач, к которому привык. Формальность Схемы делает доказательство правильности программ намного более простым. Мощные средства абстрагирования позволяют отделить части программы, которые можно повторно использовать, от частей, «заточенных» под конкретную проблему/реализацию языка/операционную систему. Легкость сочетания различных функций и создания на их основе новых конструкций позволяет создавать целые библиотеки хорошо отлаженных, универсальных компонентов.
Иначе говоря, если вы хотите писать сложные, корректные программы, но не хотите тратить на это годы, Схема – то, что нужно для успеха!
Краткий список наиболее известных реализаций Схемы.
Chez Scheme и MacScheme – одни из лучших коммерческих реализаций; однако существует множество бесплатных интерпретаторов и компиляторов Схемы как для учебных целей, так и для серьезной работы.
Одна из лучших систем для Windows и Linux – MzScheme, и построенные на ее основе MrEd (система создания переносимого графического интерфейса пользователя) и DrScheme (пожалуй, самая удобная среда разработки программ из существующих).
Введение в Scheme
Наиболее важным, но в то же время и наиболее незаметным свойством любого инструмента является его влияние на формирование привычек людей, которые имеют обыкновение им пользоваться.
Эдсгер Вайб Дейкстра
Введение
Когда следует использовать Lisp, а когда нет? Этому вопросу посвящены различные статьи в интернете. Я не берусь рассуждать на эту тему, а лишь замечу, где Lisp мне пригодился. По большей части я использовал Lisp в качестве встраиваемого языка. Для управления приложениями через консоль, для создания гибких конфигурационных файлов, для хранения структурированных данных, для передачи данных по сети, для реализации самопального самодельного RPC. На мой взгляд, удобно, когда все перечисленные варианты имеют одинаковый синтаксис да еще могут быть расширены(в плане синтаксиса и функционала) причем на лету.
Я не считаю себя специалистом в мире Lisp и не гарантирую 100% точности изложенного материала. Одна из целей данной серии статей собрать разрозненную информацию относительно разных реализаций Scheme в одном месте и на родном языке. В общем, данный материал не для тех, кто хочет знать зачем, а для тех, кто хочет знать как. Если кому-то тема будет интересна и полезна, пишите, будем уточнять что есть и думать над продолжением.
Начало
Почти каждая статья о Lisp начинается с того, что Lisp один из самых старых языков программирования высокого уровня и общего назначения, который где-то в 1958г был изобретен Джоном Маккарти. Несмотря на древность Lisp мультипарадигмальный язык, позволяющий писать в функциональном, процедурном, объектно-ориентированном стилях. При этом, вся эта мультипарадигмальность доступна через примитивный и единообразный синтаксис, так называемые S-выражения. Для описания Lisp синтаксиса в форме Бэкуса—Наура достаточно всего 7 строк, с оговорками конечно. Так сложилось, что за долгую историю развития над Lisp ломали голову лучшие умы компьютерных наук, шлифуя его словно драгоценный камень. Однако нельзя сказать, что Lisp очень популярен, возможно, тому виной пугающее нагромождение скобок, из-за которого на первый взгляд программа выглядит сложной для восприятия. Но после небольшой практики дискомфорт переходит в восторг от тех возможностей, которые предоставляет данный способ программирования. По крайней мере, так было у меня).
Если быть чуть более точным, Lisp это не то чтобы язык программирования, сколько идея, на базе которой разработаны языки Lisp-семейства. В наши дни существует великое множество Lisp диалектов, а их реализаций еще больше. Что не удивительно, ведь написать интерпретатор лиспа относительно не сложно. Так повернулось колесо истории, что наиболее популярными диалектами стали Common lisp, Scheme и Clojure. Каждый диалект преследует свои, чуть отличные цели. Common Lisp – довольно пожилой промышленный стандарт, имеет в своем арсенале не малое количество библиотек и наработок. Scheme – стремится к минимальности базовых конструкций, через которые может быть выражена вся остальная функциональность, многообразие стилей и подходов программирования. То есть минималистичный интерпретатор и развитая стандартная библиотека. Clojure – свежий взгляд на Lisp в целом, были переосмыслены многие конструкции языка для удобной разработки поверх платформы JAVA в первую очередь. Как пишут на форумах разрабатывать под Clujure куда продуктивнее и интереснее чем на JAVA. Исключительно в целях самообучения я попробовал на вкус разные диалекты и их реализации. Можно бесконечно долго спорить Scheme vs Common Lisp, но для себя я выбор сделал в пользу Scheme за лаконичность, современность и доступность реализаций на различных платформах.
Про Scheme на форумах можно встретить отзывы, будто это исключительно академический язык, который если и можно использовать на практике, то крайне неудобно из-за чрезмерного минимализма. Что-то подсказывало мне, то это не так. И вот, мой дорогой читатель, скажу тебе, что scheme, довольно гибкий язык программирования, при этом не перегружен хитрыми конструкциями и с успехом может конкурировать со многими популярными инструментами. А использовать его в качестве встраиваемого языка одно удовольствие. Относительная простота стандарта Scheme играет на руку, способствуя появлению множества реализаций. Фактически можно выбрать реализацию под любые нужды и разрабатывать полноценные приложения GUI, DB, WEB, используя Scheme в качестве основного языка.
Есть из чего выбрать
Любопытно, но часто наиболее популярные продукты практически не предоставляют выбора, вот тебе версия единственная и неповторимая, а все остальное либо устарело, либо чья-то самоделка.
Scheme, возможно благодаря простоте стандарта имеет довольно много реализаций, либо интерпретаторов, либо компиляторов, либо и то и другое сразу. Причем, имеются компиляторы в другие языки, что в некоторых случаях может оказаться крайне полезно.
В сети можно найти список известных реализаций, например на community.schemewiki.org опубликована таблица.
Name | Link | Type | Platform | Active | R7RS |
---|---|---|---|---|---|
BDC Scheme | carlstrom.com/bdc-scheme | interpreter | Java | no | |
Bigloo | www-sop.inria.fr/mimosa/fp/Bigloo | compiler | many | yes | |
BiT | github.com/melvinzhang/bit-scheme | interpreter | Hardware (microcontrollers) | no | |
BiwaScheme | www.biwascheme.org | interpreter | Javascript | yes | |
Bus Scheme | rubygems.org/gems/bus-scheme | interpreter | Ruby | no | |
Chez Scheme | www.scheme.com | interpreter (free) + compiler (paid) | many | no | |
chibi-scheme | code.google.com/p/chibi-scheme | interpreter | C (library) | yes | yes |
Chicken | www.call-cc.org | interpreter+compiler | many | yes | yes |
CPSCM | www.omnigia.com/scheme/cpscm/home | compiler | Javascript, Common Lisp | no | |
Elk | sam.zoy.org/projects/elk | interpreter | C++ (library) | no | |
Foment | code.google.com/p/foment | interpreter | many | yes | yes |
Gambit | www.iro.umontreal.ca/ gambit | interpreter+compiler | many | yes | |
Gauche | practical-scheme.net/gauche/index.html | interpreter | many | yes | yes |
Guile | www.gnu.org/software/guile | interpreter | many | yes | yes |
Heist | github.com/jcoglan/heist/tree/master | interpreter | Ruby | no | |
HScheme | hscheme.sourceforge.net | interpreter | Haskell | no | |
Husk Scheme | github.com/justinethier/husk-scheme | interpreter | Haskell | yes | yes |
Ikarus Scheme | launchpad.net/ikarus | compiler | many | no | |
Inlab-Scheme | www.inlab.de/scheme/index.html | interpreter | Linux | no | |
IronScheme | www.codeplex.com/IronScheme | interpreter | .Net | yes | |
Jaja | pagesperso-systeme.lip6.fr/Christian.Queinnec/Java/Jaja.html | interpreter | Java | no | |
JScheme | jscheme.sourceforge.net | interpreter | Java | no | |
Kawa | www.gnu.org/software/kawa | interpreter | Java | yes | yes |
KSI | ksi.sourceforge.net | interpreter | C (library) | no | |
KSM | square.umin.ac.jp/ hchang/ksm | interpreter | C (library, Linux-only) | no | |
Larceny | www.larcenists.org | compiler | many | no | yes |
librep | librep.sourceforge.net | interpreter | C (library) | no | |
LispMe | www.lispme.de/lispme/index.html | interpreter | Palm | no | |
Llava | llava.org | interpreter | Java | no | |
Luna | sourceforge.net/projects/luna-scheme | compiler | .Net | no | |
Microscheme | github.com/ryansuchocki/microscheme | compiler | Hardware (Atmel) | yes | |
MIT/GNU Scheme | www.gnu.org/software/mit-scheme | interpreter | many | yes | |
Minor Scheme | www.red-bean.com/trac/minor | compiler | C | no | |
MScheme | mscheme.sourceforge.net | interpreter | Java | no | |
mosh-scheme | code.google.com/p/mosh-scheme | interpreter | many | no | |
NexJ Scheme | nexj-scheme.org | interpreter | Java | no | |
Oaklisp | oaklisp.alioth.debian.org | interpreter | POSIX | no | |
Ocs | github.com/felix-lang/ocs | interpreter | Ocaml | no | |
Owl Lisp | code.google.com/p/owl-lisp | interpreter | POSIX | no | yes |
Picrin | github.com/picrin-scheme/picrin | interpreter | C99 | yes | yes |
Pixie Scheme III | JayReynoldsFreeman.com/My/Pixie_Scheme_III.html | interpreter+compiler | iPad | yes | no |
Pocket Scheme | www.mazama.net/scheme/pscheme.htm | interpreter | Windows CE | no | |
PS3I | pagesperso-systeme.lip6.fr/Christian.Queinnec/VideoC/ps3i.html | interpreter | Java | no | |
Psyche | www.xs4all.nl/ yduppen/site/psyche.html | interpreter | Python | no | |
QScheme | www.sof.ch/dan/qscheme/index-e.html | interpreter | POSIX | no | |
Racket | www.racket-lang.org | interpreter+compiler | many | yes | |
Rhizome/pi | www.kt.rim.or.jp/ qfwfq/rhiz-pi/index-e.html | ? | ? | ||
RScheme | github.com/bitwize/rscheme | ? | ? | ||
Sagittarius | code.google.com/p/sagittarius-scheme | interpreter | many | yes | yes |
Scheme 9 from Empty Space | t3x.org/s9fes | interpreter | C89/POSIX, Plan 9 | yes | |
Scheme48 | s48.org | ? | ? | ||
Scheme-to-C | scheme2c.alioth.debian.org | ? | ? | ||
Schemik | schemik.sourceforge.net | ? | ? | ||
Schemix | www.abstractnonsense.com/schemix | ? | ? | ||
SCM | swissnet.ai.mit.edu/ jaffer/SCM.html | ? | ? | ||
Shoe | nocrew.org/software-shoe.html | ? | ? | ||
SISC | sisc.sourceforge.net | ? | ? | ||
SIOD | people.delphiforums.com/gjc/siod.html | ? | ? | ||
SigScheme | code.google.com/p/sigscheme | ? | ? | ||
Sizzle | www.grabmueller.de/martin/www/sizzle/sizzle.en.html | ? | ? | ||
Stalin | www.ece.purdue.edu/ qobi/software.html | ? | ? | ||
STKlos | stklos.sourceforge.net | ? | ? | ||
SXM | www.malgil.com/sxm | ? | ? | ||
s7 | ccrma.stanford.edu/software/snd/snd/s7.html | interpreter | C | yes | |
TinyScheme | tinyscheme.sourceforge.net | ? | ? | ||
UCB Scheme | www-inst.eecs.berkeley.edu/ scheme | ? | ? | ||
ULisp | www.zogotounga.net/comp/squeak/lispkit.htm | ? | ? | ||
UMB Scheme | www.cs.umb.edu/ wrc/scheme | ? | ? | ||
Unlikely Scheme | marijnhaverbeke.nl/unlikely | ? | ? | ||
Vicare | marcomaggi.github.com/vicare.html | compiler | POSIX/x86 | yes | |
VSCM | sourceforge.net/projects/vscm | ? | ? | ||
Vx-Scheme | colin-smith.net/vx-scheme | ? | ? | ||
Wraith Scheme | JayReynoldsFreeman.com/My/Software.html | interpreter+compiler | Macintosh | Yes | No |
XLISP | www.mv.com/ipusers/xlisper | ? | ? | ||
Ypsilon Scheme | code.google.com/p/ypsilon | interpreter | many | no |
А если хорошенько поискать на GitHub, то становится ясно что вариантов еще больше.
Следование стандарту в различных реализациях позволяет повторно использовать код на разных платформах, в том числе и для Web программирования. Но не нужно забывать, что функционал не входящий в стандарт с высокой вероятностью будет отличаться, что приведет к непортируемости кода.