Scheme/Tutorial/1
Материал из ALT Linux Wiki
(→2 О порядке слов.) |
м (oops, fix link) |
||
(1 промежуточная версия не показана) | |||
Строка 1: | Строка 1: | ||
=== 1. Альфа и Омега === | === 1. Альфа и Омега === | ||
- | + | Схема — это один из старейших диалектов хорошо известного семейства языков LISP. LISP всегда существенно отличался от других языков. И не только несколько непривычным синтаксисом, но и большим изяществом и продуманностью. | |
Сначала всем кажется, что это ужасный язык с гирляндами круглых скобок, однако при более подробном знакомстве выясняется, что это совсем не проблема и плюсы перевешивают этот единственный минус. | Сначала всем кажется, что это ужасный язык с гирляндами круглых скобок, однако при более подробном знакомстве выясняется, что это совсем не проблема и плюсы перевешивают этот единственный минус. | ||
Строка 6: | Строка 6: | ||
Сразу порекомендую пользоваться нормальным текстовым редактором. Очень хорошо подойдут vim и emacs. А вот mcedit навсегда вас отвадит от этого языка. | Сразу порекомендую пользоваться нормальным текстовым редактором. Очень хорошо подойдут vim и emacs. А вот mcedit навсегда вас отвадит от этого языка. | ||
- | Это примерно как с поп-музыкой и чем-то другим. Первая всегда быстро приходит и | + | Это примерно как с поп-музыкой и чем-то другим. Первая всегда быстро приходит и так же быстро уходит, а вторая не сразу придёт, зато никогда потом не покинет ;) |
- | Всё это разглагольствование отнюдь не означает, что все остальные языки | + | Всё это разглагольствование отнюдь не означает, что все остальные языки побоку. Portable Assembler — C — ещё никто не смог заменить ;) |
Небольшое замечание в сторону Сизифа: там, пожалуй, самая большая коллекция компиляторов и интерпретаторов схемы. Их пусть лучше представит их мантейнер. Я же хочу обратить внимание только на три: | Небольшое замечание в сторону Сизифа: там, пожалуй, самая большая коллекция компиляторов и интерпретаторов схемы. Их пусть лучше представит их мантейнер. Я же хочу обратить внимание только на три: | ||
- | * '''guile''' | + | * '''guile''' — не самый оптимальный по скорости, но зато непревзойдённый по удобству интеграции с C; |
- | * '''gambit-c''' | + | * '''gambit-c''' — очень хороший компилятор, но с бедноватым набором готовых библиотек; |
- | * '''scheme48''' | + | * '''scheme48''' — один из лучших интерпретаторов с богатой библиотекой. |
=== 2 О порядке слов. === | === 2 О порядке слов. === | ||
Строка 19: | Строка 19: | ||
Одно и то же можно рассказать разными способами. Попытаемся рассказать разными способами про операцию сложения двух чисел. | Одно и то же можно рассказать разными способами. Попытаемся рассказать разными способами про операцию сложения двух чисел. | ||
- | Способ 1: ''2 + 3'' (или | + | Способ 1: ''2 + 3'' (или «к двум прибавить три»). |
- | Не самый удачный способ с точки зрения математики и языков программирования. Однако нас приучают к нему с детства, | + | Не самый удачный способ с точки зрения математики и языков программирования. Однако нас приучают к нему с детства, также как и к десятичной системе счисления. Гораздо чаще произносится «два плюс три», но это скорее пословное оглашение записи, строго говоря — лишённое какого либо смысла, ибо плюсы бывают разными. Да и с точки зрения языков программирования, например того же C, получается несколько неудачно, ибо операция прибавления всё-таки обозначается как +=. А в C++ это вообще может быть оформленно как маловразумительная конструкция operator+(). |
Таким языком общается с миром большинство популярных языков программирования. | Таким языком общается с миром большинство популярных языков программирования. | ||
- | Способ 2: ''2 3 +'' ( | + | Способ 2: ''2 3 +'' («два и три сложить»). |
- | Очень непривычный, но удобный способ с точки зрения математики. Известен также под названием польская нотация (или польская запись). | + | Очень непривычный, но удобный способ с точки зрения математики. Известен также под названием ''польская нотация'' (или польская запись). Математическое удобство превращается в то, что компиляторы и интерпретаторы языков программирования, использующую такую нотацию, получаются чрезвычайно компактными, что позволяет их «засунуть» в кремний. Таким языком общается с миром Форт и Постскрипт. |
- | Способ 3: ''+ 2 3'' ( | + | Способ 3: ''+ 2 3'' («сложить два и три»). |
- | Может быть, не самый лучший с точки зрения науки, зато самый естественный | + | Может быть, не самый лучший с точки зрения науки, зато самый естественный: «сложить два и три» гораздо понятнее чем «два плюс три». Это не случайно, ибо это функциональный подход. Функция сложения применяется к двум и трём. В общем-то функция — пожалуй, одно из самых основных понятий современного мира. |
Таким языком общается с миром всё многочисленное семейство LISP (и ещё много других функциональных языков программирования) | Таким языком общается с миром всё многочисленное семейство LISP (и ещё много других функциональных языков программирования) | ||
Строка 34: | Строка 34: | ||
Итак, когда вы захотите что-то сказать на Scheme, сначала надо назвать функцию, а потом перечислить, к кому её применить. | Итак, когда вы захотите что-то сказать на Scheme, сначала надо назвать функцию, а потом перечислить, к кому её применить. | ||
- | Например | + | Например, «вычесть из трёх четыре», «перемножить пять шесть и семь». |
Теперь немного о формате вызова. | Теперь немного о формате вызова. | ||
- | Стандартный | + | Стандартный и известный по школе способ записи результата применения функции к своим аргументам — <tt>f(x)</tt>. Ещё часто используется в математике бесскобочный вариант — <tt>Ax,Fx,...</tt> |
- | Но LISP идёт своим путём и описывает вызов как <tt>(f x)</tt>. | + | Но LISP идёт своим путём и описывает вызов как <tt>(f x)</tt>. Казалось бы, это ужасно, однако если функция многоаргументная, то мы экономим на спецсимволах. <tt>f(x,y,z)</tt>запишется как <tt>(f x y z)</tt>. |
- | Собственно такая экономность и регулярность в синтаксисе LISP и отпугивает от | + | Собственно такая экономность и регулярность в синтаксисе LISP и отпугивает от него — но, как мы увидим дальше, бедность и регулярность синтаксиса — это ещё и богатство: если бы не она, то не было бы и удобного способа описания интерфейса. |
- | Благодаря такому способу записи интерпретатор выражений получается очень простым и | + | Благодаря такому способу записи интерпретатор выражений получается очень простым и компактным — не в пример C++, где развесистые выражения подчас способны свести с ума как разработчика, так и компилятор; да и двусмысленность что в C, что в C++ — тоже не подарок. К ней же привыкли — привыкнете и к Scheme. |
- | Сразу несколько простейших выражений на Scheme. Комментировать их не буду и так всё понятно: | + | Сразу несколько простейших выражений на Scheme. Комментировать их не буду, и так всё понятно: |
<pre>(+ 1 2) | <pre>(+ 1 2) | ||
Строка 55: | Строка 55: | ||
(+ 1 (- 4 (+ 5 6)))</pre> | (+ 1 (- 4 (+ 5 6)))</pre> | ||
- | Считайте что одну четверть Scheme уже | + | Считайте, что одну четверть Scheme уже выучили — это очень маленький язык. |
+ | '''[[Scheme/Tutorial/2|далее>>]]''' | ||
{{Category navigation|title=Scheme|category=Scheme|sortkey=Tutorial}} | {{Category navigation|title=Scheme|category=Scheme|sortkey=Tutorial}} |
Текущая версия на 08:10, 11 мая 2012
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 уже выучили — это очень маленький язык.