Scheme/Tutorial/1: различия между версиями

Материал из ALT Linux Wiki
Нет описания правки
Строка 28: Строка 28:


Способ 3: ''+ 2 3'' ("сложить два и три").
Способ 3: ''+ 2 3'' ("сложить два и три").
Может быть, не самый лучший с точки зрения науки, зато самый естественный.  "сложить два и три" гораздо понятнее чем "два плюс три".  Это не случайно, ибо это функциональный подход. Функция сложения применяется к двум и трём. В общем, то функция, пожалуй одно из самых основных понятий современного мира.
Может быть, не самый лучший с точки зрения науки, зато самый естественный.  "сложить два и три" гораздо понятнее чем "два плюс три".  Это не случайно, ибо это функциональный подход. Функция сложения применяется к двум и трём. В общем-то функция, пожалуй одно из самых основных понятий современного мира.


Таким языком общается с миром всё многочисленное семейство LISP (и ещё много других функциональных языков программирования)
Таким языком общается с миром всё многочисленное семейство LISP (и ещё много других функциональных языков программирования)

Версия от 08:04, 16 сентября 2011

1. Альфа и Омега

Схема -- это один из старейших диалектов хорошо известного семейства языков LISP. LISP всегда существенно отличался от других языков. И не только несколько непривычным синтаксисом, но и большим изяществом и продуманностью.

Сначала всем кажется, что это ужасный язык с гирляндами круглых скобок, однако при более подробном знакомстве выясняется, что это совсем не проблема и плюсы перевешивают этот единственный минус.

Сразу порекомендую пользоваться нормальным текстовым редактором. Очень хорошо подойдут vim и emacs. А вот mcedit навсегда вас отвадит от этого языка.

Это примерно как с поп-музыкой и чем-то другим. Первая всегда быстро приходит и также быстро уходит, а вторая не сразу придёт, зато никогда потом не покинет ;)

Всё это разглагольствование отнюдь не означает, что все остальные языки по боку. Portable Assembler C ещё никто не смог заменить ;)

Небольшое замечание в сторону Сизифа: там, пожалуй, самая большая коллекция компиляторов и интерпретаторов схемы. Их пусть лучше представит их мантейнер. Я же хочу обратить внимание только на три:

  • guile -- не самый оптимальный по скорости, но зато непревзойдённый по удобству интеграции с C;
  • gambit-c -- очень хороший компилятор, но с бедноватым набором готовых библиотек;
  • scheme48 -- один из лучших интерпретаторов с богатой библиотекой.

2 О порядке слов.

Одно и то же можно рассказать разными способами. Попытаемся рассказать разными способами про операцию сложения двух чисел.

Способ 1: 2 + 3 (или "к двум прибавить три"). Не самый удачный способ с точки зрения математики и языков программирования. Однако нас приучают к нему с детства, так же как и к десятичной системе счисления. Гораздо чаще произносится "два плюс три", но это скорее пословное оглашение записи, строго говоря -- лишённое какого либо смысла, ибо плюсы бывают разными. Да и с точки зрения языков программирования, например того же C, получается несколько неудачно, ибо операция прибавления всё-таки обозначается как +=. А в C++ это вообще может быть оформленно как маловразумительная конструкция operator+().

Таким языком общается с миром большинство популярных языков программирования.

Способ 2: 2 3 + ("два и три сложить"). Очень непривычный, но удобный способ с точки зрения математики. Известен также под названием польская нотация (или польская запись). Математическое удобство превращается в то что компиляторы и интерпретаторы языков программирования, использующую такую нотацию получаются чрезвычайно компактными, что позволяет их "засунуть" в кремний. Таким языком общается с миром Форт и Постскрипт.

Способ 3: + 2 3 ("сложить два и три"). Может быть, не самый лучший с точки зрения науки, зато самый естественный. "сложить два и три" гораздо понятнее чем "два плюс три". Это не случайно, ибо это функциональный подход. Функция сложения применяется к двум и трём. В общем-то функция, пожалуй одно из самых основных понятий современного мира.

Таким языком общается с миром всё многочисленное семейство LISP (и ещё много других функциональных языков программирования)

Итак, когда вы захотите что-то сказать на Scheme, сначала надо назвать функцию, а потом перечислить, к кому её применить.

Например "вычесть из трёх четыре", "перемножить пять шесть и семь".

Теперь немного о формате вызова.

Стандартный, и известный по школе способ записи результата применения функции к своим аргументам - f(x). Ещё часто используется в математике бескобочный вариант - Ax,Fx,... Но LISP идёт своим путём и описывает вызов как (f x). Казалось бы это ужасно, однако если функция много-аргументная, то мы экономим на спец. символах. f(x,y,z)запишется как (f x y z). Собственно такая экономность и регулярность в синтаксисе LISP и отпугивает от него, но как мы увидим дальше, бедность и регулярность синтаксиса -- это ещё и богатство, если бы не она, то не было бы и удобного способа описания интерфейса.

Благодаря такому способу записи интерпретатор выражений получается очень простым и компактным не в пример C++, где развесистые выражения подчас способны свести с ума как разработчика, так и компилятор, да и двусмысленность что в C, что в C++ -- тоже не подарок. К ней же привыкли -- привыкните и к Scheme.

Сразу несколько простейших выражений на Scheme. Комментировать их не буду и так всё понятно:

(+ 1 2)
(- 2 3)
(+ 1 2 3 4 5 6 7)
(* 1 2 3 4 5 6 7 0)
(+ 1 (+ 3 5))
(* 3 (* 5 6))
(+ 1 (- 7 4))
(+ 1 (- 4 (+ 5 6)))

Считайте что одну четверть Scheme уже выучили - это очень маленький язык.