Переменные и Область видимости: Имя и Контекст

В Лиспекс переменная — это не просто хранилище, а метка для абстрактной мысли. Область видимости — это невидимая стена, определяющая контекст, в котором это имя имеет значение.

Эта страница описывает, как создавать привязки и как работает лексическая область видимости на входной поверхности 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

Функции видят привязки из окружения определения (лексическая область); подробнее см. Функции и замыкания.