Найдите пример нужной записи, прочитайте результат и перейдите по ссылке к полным правилам. Карточки служат справочником во время работы над программой.
Запускайте полный пример каждой карточки отдельно в Песочнице. Под примером указано значение, которое она показывает.
Литералы и комментарии
значение ; комментарий(list 42 #t "tea" #\T 'ready)
; остаток строки игнорируетсяРезультат
(42 #t "tea" #\T ready)Числа, логические значения, строки и отдельные символы текста можно записать напрямую.
Апостроф в 'ready делает ready значением типа «символ».
Точка с запятой начинает комментарий до конца строки.
Вызовы и вложенность
(процедура аргумент ...)(+ 10 (* 2 3))Результат
16Внутренний вызов (* 2 3) возвращает 6, поэтому внешний складывает 10 и 6.
Первое выражение в вызове выбирает процедуру.
Это выражение и аргументы вычисляются слева направо.
Имена и локальные значения
define · let · let* · letrec(let ((ширина-обреза 20) (вылет 3))
(+ ширина-обреза вылет))Результат
23let даёт значениям локальные имена. Здесь ширина-обреза равно 20, а вылет равно 3.
Начальные выражения используют внешнюю область видимости, поэтому не могут обращаться к новым именам друг друга.
Для имени верхнего уровня используйте define.
Форма let* нужна, когда следующее локальное значение использует предыдущее имя, а letrec нужен для рекурсивных локальных определений.
Именованные процедуры и lambda
(define (имя x) тело) · (lambda (x) тело)(define (double n) (* n 2))
(double 6)Результат
12define задаёт имя процедуры и её аргументы. Здесь double умножает аргумент на 2.
Процедура сама является значением. Создать её без имени позволяет lambda.
Условия
if · cond · case · and · or(if (< 1 2) 'next-page 'keep)Результат
next-pageif выбирает 'next-page, поскольку одна оставшаяся строка меньше двух.
cond проверяет условия по порядку, а case выбирает ветвь по совпадению значения.
and и or останавливаются, когда результат известен. Только #f считается ложным.
Цитированные данные и списки
'данные · (list значение ...)(list 'decision 'allow)Результат
(decision allow)Апостроф сохраняет данные без вычисления. Здесь 'decision и 'allow имеют тип «символ».
list вычисляет аргументы и помещает их значения в новый список.
Строки, векторы и байты
(list (string-length "Lispex")
(vector-ref #(red green blue) 1))Результат
(6 green)string-length считает символы текста в "Lispex".
vector-ref выбирает элемент по индексу, начиная с нуля, поэтому индекс 1 даёт green.
Строки хранят текст Unicode. Векторы содержат упорядоченные элементы и допускают изменение в текущем профиле языка.
Байтовые векторы хранят значения от 0 до 255 и не допускают изменения.
Обработка списков и рекурсия
рекурсия · map · filter · fold · apply(map (lambda (n) (* n 10)) '(1 2 3))Результат
(10 20 30)map вызывает процедуру для каждого элемента списка и возвращает список результатов.
filter отбирает элементы, а свёртки объединяют их в накапливаемое значение.
apply вызывает процедуру с аргументами из списка.
Рекурсивная процедура вызывает себя. Хвостовые вызовы позволяют повторять рекурсивные вызовы без роста стека.
Узнайте подробности
| Вопрос | Куда перейти |
|---|---|
| Как процедуры совместно используют меняющееся значение? | Связывания и изменение и Замыкания |
Почему 1/3 точное, а (/ 1.0 3) нет? | Точные и приближённые числа |
| Как вернуть два результата? | Множественные значения |
| Какая рекурсия использует постоянный стек? | Правильные хвостовые вызовы |
| Когда нужно аварийно покинуть вычисление? | Продолжения и dynamic-wind |
| Как останавливаются бесконечная работа и огромный вывод? | Детерминизм и ресурсы |
Точные допустимые токены и виды форм описаны в Грамматике чтения и Основных формах. Для пошагового прохождения материала вернитесь к Пути обучения.