pax_global_header 0000666 0000000 0000000 00000000064 11001151713 0014500 g ustar 00root root 0000000 0000000 52 comment=53b7b7cf29b3dc201910ca22236038062526e03c docs-scheme_article1-0.1/ 0000755 0000000 0000000 00000000000 11001151713 0015314 5 ustar 00root root 0000000 0000000 docs-scheme_article1-0.1/.gear-rules 0000644 0000000 0000000 00000000053 11001151713 0017361 0 ustar 00root root 0000000 0000000 tar: . name=docs-scheme_article1-@version@ docs-scheme_article1-0.1/License 0000644 0000000 0000000 00000000436 11001151713 0016624 0 ustar 00root root 0000000 0000000 Данный документ распространяется на условиях свободной лицензии FDL (Free Documentation License) версии 1.1 или любой более поздней версии. Данный документ не содержит текста, помещаемого на первой или последней странице обложки. Данный документ не содержит неизменяемого текста. docs-scheme_article1-0.1/doc/ 0000755 0000000 0000000 00000000000 11001151713 0016061 5 ustar 00root root 0000000 0000000 docs-scheme_article1-0.1/doc/index.html 0000644 0000000 0000000 00000025161 11001151713 0020063 0 ustar 00root root 0000000 0000000
Вы хорошо знаете русский, возможно, неплохо уже говорите по-английски, в школе вас научили несколько необычному языку математики.
Предлагаю вам выучить ещё один — LISP. Точнее, один из его самых интересных диалектов — Scheme (правильно произносится название как «ским», однако можно говорить и проще — «схема»)
Начнём с того, что ознакомимся с несколько необычным порядком слов этого языка: «действие объект объект ...». Хотя почему необычным? Вот несколько фраз на русском языке, организованных по тому же принципу:
«Сумма трёх и пяти»
«Произведение пяти, шести и семи»
Каждая законченная фраза на этом языке должна быть окружена парой круглых скобок.
Запишем сказанное выше на Scheme:
Можно записать выражения и посложнее:
(+ 2 3 (+ 5 6) ) - «Сумма двух, трёх и суммы пяти и шести."
Просто, не правда ли?
Давайте двигаться дальше. Фраза "(* 3 5)" — хороша, а "(* width height)" лучше.
Выражение "(* 2 3.1415926 5)" — интригующе, а
"(* 2 pi radius)" гораздо более осмысленно. Здесь width,
height —
переменные, а 3,5 — их текущее значение.
Переменная задаётся следующей конструкцией языка:
Пример:
Прочитаем записанное по русски: «Положим ширина — это три, высота — это 7, подсчитаем произведение двух и суммы ширины и высоты (например, периметр прямоугольника)». Результат такого вычисления в нашем случае будет 20.
Продолжим совершенствовать конструкции. Допустим, нам требуется подсчитать сумму квадратов двух чисел. Это можно сделать например так:
Не правда ли, что-то режет глаз? Cлишком громоздко — так мы никогда не говорим. Если бы у нас был в языке глагол который, означал бы «квадрат числа», то последнее выражение звучало бы:
Согласитесь, что так гораздо лучше.
Есть задача — есть её решение. Мы можем объявить новое слово-функцию, назвать её square. Функция будет принимать в качестве параметра число и возвращать его квадрат. Делается это следующим образом:
Общий формат:
Функция возвращает последнее вычисленное значение. Это означает, что следующая функция square2:
вернёт тот же результат, что и square, только попутно сделает ещё одно ненужное дело — удвоение числа.
Перепишем пример с суммой квадратов чисел заново:
Нам не хватало слов в языке — мы их добавили. Вообще, когда вы пишете программу на LISP, вы описываете не алгоритм, а сначала создаёте язык, а потом на нём формулируете исходную задачу. Несколько точнее — вы «подгоняете» данный вам Scheme язык до тех пор, пока он не станет совпадать с языком, на котором задача формулируется легко.
Сразу пример. Пусть перед нами стоит задача сделать программу, которая спрашивает имя пользователя, а потом выводит ему приветствие.
Scheme предоставляет нам несколько готовых «глаголов»:
Мы бы хотели иметь такие «глаголы»:
На таком языке наша задача выглядела бы следующим образом:
Дело за малым — определить hello и username. Нет проблем. Вот полный текст программы.
LISP — полноценный функциональный язык, а поэтому функции — полноправные члены этого языка, независимо от того, определили вы их сами, или они уже были в языке «готовые». В частности, их можно передавать в качестве параметров в другие функции, а там уже делать с ними всё, что потребуется.
Например, функцию «модуль числа», можно определить так:
«Если аргумент положителен — возвращается x, иначе минус x». А можно и так:
«Если аргумент положителен, то плюс, иначе минус x». Здесь в результате исполнения выражения if возвращается функция + или -, которая затем применяется к аргументу x. Кстати, обратите внимание на новую конструкцию if — полагаю, что её назначение вам сразу ясно. Сначала проверяется первый аргумент, если он истинен, то исполняется второй аргумент, иначе третий. Общий формат следующий:
В теории всё хорошо, а где немного попрактиковаться? В мире можно найти много прекрасно разработанных сред для работы со Scheme. К сожалению, большинство документации по Scheme на английском языке, но можно найти и отличные введения на русском — язык-то простой.
Вот названия нескольких самых распространённых реализаций:
Plt Scheme(http://www.plt-scheme.org/) — одна из самых полных реализаций, включает в себя удобную обучающую среду Dr.Scheme. Есть версии для платформ Windows,Linux, Mac OS.
Bigloo (http://www-sop.inria.fr/mimosa/fp/Bigloo/) — тоже достаточно полная реализация. Доступна для платформ Windows, Linux.
LispMe (http://www.lispme.de/index.html) — версия для карманных компьютеров с операционной системой Palm OS.
Также ещё посмотрите Gambit-C (http://www.iro.umontreal.ca/~gambit/) — один из самых быстрых компиляторов Scheme.
Все перечисленные реализации Scheme — \то интерпретаторы. Запускате интерпретатор — и можно вести с ним диалог на Scheme: в ответ на его приглашение вводите конструкции на Scheme, а он будет возвращать результаты вычислений.
Попробуйте «проиграть» все вышеперечисленные примеры. Думаю, вам понравится!
Простота Scheme обманчива. На самом деле — это один из самых мощных на сегодняшний день языков программирования. На основе этого языка можно изучить все известные стили и методы программирования. С частью этих приёмов мы познакомимся с вами в следующих статьях этой серии.
docs-scheme_article1-0.1/docinfo 0000644 0000000 0000000 00000000620 11001151713 0016656 0 ustar 00root root 0000000 0000000 Updated: no Supported: yes Language: ru License: FDL Format: html Url: http://heap.altlinux.ru/kirill/scheme_article_1/ Abstract: Вводная статья про язык scheme, ориентированная на школьников (старшеклассников). Author: Станислав Иевлев Version: 0.1 Title: Знакомьтесь -- язык Scheme Section: Научно-популярный Section: Декларация Section: Персональное Section: Программы Section: Многоплатформенный docs-scheme_article1-0.1/docs-scheme_article1.spec 0000644 0000000 0000000 00000002415 11001151713 0022150 0 ustar 00root root 0000000 0000000 # Generated File. %setup_docs_module scheme_article1 ru Name: %packagename Version: 0.1 Release: alt2 Summary: Scheme -- your new language Summary(ru_RU.KOI8-R): Знакомьтесь -- язык Scheme License: %fdl Url: http://heap.altlinux.ru/kirill/scheme_article_1/ Buildarch: noarch Requires: docs-utils BuildRequires(pre): rpm-build-docs-experimental >= 0.3 BuildRequires(pre): rpm-build-licenses >= 0.6 # replace docs-scheme_article_1-kirill Provides: docs-scheme_article_1-kirill Obsoletes: docs-scheme_article_1-kirill Source: %name-%version.tar %description Introductary article into Scheme programming language. %description -l ru_RU.KOI8-R Вводная статья про язык scheme, ориентированная на школьников (старшеклассников). %prep %setup %build %docs_module_build "html" "index.html" %install %docs_module_install %post %docs_module_postin %postun %docs_module_postun %files %docs_module_files %changelog * Tue Apr 15 2008 Artem Zolochevskiy