Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Small improvements #102

Merged
merged 2 commits into from
Jun 23, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
2 changes: 1 addition & 1 deletion modules/10-basics/20-forms/description.ru.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

name: Формы
theory: |
Про Lisp-подобные языки говорят, что это языки без синтаксиса. Синтаксис у них конечно есть, но максимально примитивный, фактически состоящий из списков и значений. Кроме того, в лиспах отсутствуют ключевые слова и соответствующие им конструкции. В популярных языках существует множество управляющих конструкций, таких как условия, циклы, возврат, присвоение переменных и многое другое. В лиспоподобных языках таких конструкций нет (это не значит, что на Clojure нельзя реализовать цикл или написать условие!)
Про Lisp-подобные языки говорят, что это языки без синтаксиса. Синтаксис у них конечно есть, но максимально примитивный, фактически состоящий из списков и значений. Кроме того, в лиспах отсутствуют ключевые слова и соответствующие им конструкции. В популярных языках существует множество управляющих конструкций, таких как условия, циклы, возврат, присвоение переменных и многое другое. В Lisp-подобные языках таких конструкций нет (это не значит, что на Clojure нельзя реализовать цикл или написать условие!)

Каким же образом Clojure понимает, с чем сейчас он работает и что нужно делать? Все дело в _формах_. Любая корректная программа на Lisp называется _формой_. Например:

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,3 +37,7 @@ definitions: []
tips:
- |
[Официальная документация](https://clojuredocs.org/clojure.core/fn)
- |
[Про лямбда-выражение](https://ru.wikipedia.org/wiki/%D0%9B%D1%8F%D0%BC%D0%B1%D0%B4%D0%B0-%D0%B2%D1%8B%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5)
- |
[Про лямбда-исчисление](https://ru.wikipedia.org/wiki/%D0%9B%D1%8F%D0%BC%D0%B1%D0%B4%D0%B0-%D0%B8%D1%81%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5)
2 changes: 1 addition & 1 deletion modules/20-logic/50-expressions/description.en.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
name: Логические выражения
theory: |
Во многих языках для того, чтобы внутри вычисляемых выражений использовать логическое ветвление, приходится использовать отдельные специфические варианты конструкции `if` (как это сделано в Python) или же вовсе — использовать отдельные *тернарные операторы*.
Здесь лиспоподобные языки — и Clojure в частности — обладают одним важным преимуществом: в этих языках всё есть выражение. Поэтому отдельные варианты условных конструкций не нужны, вместо этого можно использовать `if`, `case`, `cond` как часть любого другого выражения! Вот парочка примеров:
Здесь Lisp-подобные языки — и Clojure в частности — обладают одним важным преимуществом: в этих языках всё есть выражение. Поэтому отдельные варианты условных конструкций не нужны, вместо этого можно использовать `if`, `case`, `cond` как часть любого другого выражения! Вот парочка примеров:

```clojure
(println (if true "Ok" "Oops")) ; => Ok
Expand Down
2 changes: 1 addition & 1 deletion modules/20-logic/50-expressions/description.ru.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
name: Логические выражения
theory: |
Во многих языках для того, чтобы внутри вычисляемых выражений использовать логическое ветвление, приходится использовать отдельные специфические варианты конструкции `if` (как это сделано в Python) или же вовсе — использовать отдельные *тернарные операторы*.
Здесь лиспоподобные языки — и Clojure в частности — обладают одним важным преимуществом: в этих языках всё есть выражение. Поэтому отдельные варианты условных конструкций не нужны, вместо этого можно использовать `if`, `case`, `cond` как часть любого другого выражения! Вот парочка примеров:
Здесь Lisp-подобные языки — и Clojure в частности — обладают одним важным преимуществом: в этих языках всё есть выражение. Поэтому отдельные варианты условных конструкций не нужны, вместо этого можно использовать `if`, `case`, `cond` как часть любого другого выражения! Вот парочка примеров:

```clojure
(println (if true "Ok" "Oops")) ; => Ok
Expand Down
8 changes: 7 additions & 1 deletion modules/25-lists/10-intro/description.ru.yml
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,13 @@ theory: |
(list 1 (list 2 3) 4) ; '(1 (2 3) 4)
```
Заметьте, что результаты вычисления показываются без упоминания имени функции "list", но зато с одинарной кавычкой перед открывающей скобкой.

Дело в том, что в Clojure можно взять любое выражение в скобках и сказать интерпретатору, "не вычисляй его, а воспринимай как список". Такая операция называется "quotation" или "цитированием", а одинарная кавычка означает начало цитаты. Заканчивается же цитата там, где стоит закрывающая скобка, парная для той, что стоит после кавычки.
Подробнее про цитирование вы узнаете позже. Пока же рекомендуем вам использовать именно функцию `list` — именно потому, что это *функция*, а не специальный синтаксис.

Подробнее про цитирование вы узнаете позже (в модуле про макросы). Пока же рекомендуем вам использовать именно функцию `list` — именно потому, что это *функция*, а не специальный синтаксис.

Если ещё раз посмотреть на примеры выше, то последний может навести на мысль: списки в Clojure *гетерогенные*, то есть любой список может одновременно содержать значения разных типов. В упомянутом примере в одном списке содержатся и числа, и вложенный список.

### Функция-предикат `list?`
Чтобы узнать, является ли какое-то значение списком, используют функцию `list?`. Это распространённый приём — для каждого типа иметь функцию-тест с тем же именем и знаком вопроса в конце! Для строк это `string?`, для целых чисел это `integer?` и так далее.
instructions: |
Expand All @@ -26,3 +30,5 @@ instructions: |
tips:
- |
[Официальная документация](https://clojure.org/guides/learn/sequential_colls#_lists)
- |
[Про цитирование](https://clojuredocs.org/clojure.core/quote)
3 changes: 3 additions & 0 deletions modules/25-lists/20-builtin-loops-map/description.ru.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ name: Встроенные средства обхода списков, map
theory: |
Любой список рано или поздно захочется *обойти* (*traverse*), то есть поработать с отдельными элементами. В процедурных языках используются циклы, но многие языки имеют и декларативные средства работы с коллекциями — `map`, `filter`, `reduce`. А ведь сами эти функции пришли в программирование через LISP!
Clojure тоже предоставляет полный набор таких функций. Ближайшие несколько уроков будут посвящены этим встроенным в Clojure функциям.

### `map`
Итак, `map` в Clojure используется так:

Expand Down Expand Up @@ -45,3 +46,5 @@ instructions: |
tips:
- |
[Официальная документация](https://clojuredocs.org/clojure.core/map)
- |
[Про map, filter, reduce](https://ru.hexlet.io/blog/posts/js-prosto-o-slozhnom-filter-map-reduce)
2 changes: 2 additions & 0 deletions modules/25-lists/30-builtin-filters/description.ru.yml
Original file line number Diff line number Diff line change
Expand Up @@ -27,3 +27,5 @@ instructions: |
tips:
- |
[Официальная документация](https://clojuredocs.org/clojure.core/filter)
- |
[Про map, filter, reduce](https://ru.hexlet.io/blog/posts/js-prosto-o-slozhnom-filter-map-reduce)
2 changes: 2 additions & 0 deletions modules/25-lists/40-reduce/description.ru.yml
Original file line number Diff line number Diff line change
Expand Up @@ -54,3 +54,5 @@ instructions: |
tips:
- |
[Официальная документация](https://clojuredocs.org/clojure.core/reduce)
- |
[Про map, filter, reduce](https://ru.hexlet.io/blog/posts/js-prosto-o-slozhnom-filter-map-reduce)
2 changes: 2 additions & 0 deletions modules/25-lists/60-list-recursion/description.ru.yml
Original file line number Diff line number Diff line change
Expand Up @@ -48,5 +48,7 @@ instructions: |
tips:
- |
[Официальная документация](https://clojuredocs.org/clojure.core/recur)
- |
[И еще официальная документация](https://clojure.org/about/functional_programming#_recursive_looping)
- |
[Описание хвостовой рекурсии](https://ru.wikipedia.org/wiki/%D0%A5%D0%B2%D0%BE%D1%81%D1%82%D0%BE%D0%B2%D0%B0%D1%8F_%D1%80%D0%B5%D0%BA%D1%83%D1%80%D1%81%D0%B8%D1%8F)