Эта страница описывает, как создавать привязки и как работает лексическая область видимости на входной поверхности Lispex v1. Семантика выполнения вне объёма; используются только стандартные формы.
Привязки на верхнем уровне: define
Используйте define, чтобы связать идентификатор на верхнем уровне.
(define x 10)
(define y (+ x 5)) ; y ⇒ 15
Зарезервированные слова связывать нельзя.
Лексическая область видимости
Lispex использует лексическую область видимости: границы определяются структурой программы.
Правило: код может смотреть «наружу» за переменными, но не «внутрь».
(define global-val 100)
(let ((outer 3))
(let ((inner 4))
(+ global-val (* outer inner)))) ; ⇒ 112
;; Здесь `inner` недоступна; видна только `global-val`.
Создание новых областей
Обычно области создают через формы let и вызовы функций.
1. Локальные привязки с let
(let ...) создаёт локальные привязки, видимые только в теле.
(define x 10)
(let ((x 20) (y 5))
(+ x y)) ; ⇒ 25
x ; ⇒ 10 (внешняя привязка)
let* связывает по очереди; letrec позволяет локальную (взаимную) рекурсию.
;; let* последовательность
(let* ((a 1)
(b (+ a 2))) ; видит a = 1
(+ a b)) ; ⇒ 4
;; letrec локальная рекурсия
(letrec ((loop (lambda (xs acc)
(if (null? xs) acc
(loop (cdr xs) (+ acc (car xs)))))))
(loop (list 1 2 3) 0)) ; ⇒ 6
2. Вызовы функций
Вызов функции создаёт свежую область для параметров и локальных значений.
(define x 100)
(define (my-func param)
(let ((local 10))
(+ x param local)))
(my-func 50) ; ⇒ 160
Изменение выполняется set! над существующей привязкой:
(define n 1)
(set! n (+ n 1)) ; n ⇒ 2
Функции видят привязки из окружения определения (лексическая область); подробнее см. Функции и замыкания.