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