Песочница

Операции со списками

Встроенные функции Lispex для создания, чтения и изменения списков.

Это предыдущая редакция документации. Способы создания и чтения списков описаны в актуальном разделе «Процедуры списков и составных значений».

Эта страница представляет собой справочник по встроенным функциям, которые создают списки или работают с ними в Lispex. Эти функции дополняют функции из справочника по основным функциям.


cons

Создает новый список, добавляя элемент в начало существующего списка. "Cons" это сокращение от "construct".

  • Синтаксис: (cons ELEMENT LIST)
  • Аргументы:
  • ELEMENT: Новый элемент для добавления в начало.
  • LIST: Существующий список, в который будет добавлен элемент.
  • Возвращает: Новый список.
  • Выбрасывает: RuntimeError, если второй аргумент не является списком.

Пример:

LISPEX
(cons 1 (list 2 3 4))
;; Результат: (list 1 2 3 4)

(cons (list "a") (list "b" "c"))
;; Результат: (list (list "a") "b" "c")

append

Объединяет два списка вместе, создавая один новый, единый список.

  • Синтаксис: (append LIST_1 LIST_2)
  • Аргументы:
  • LIST_1: Первый список.
  • LIST_2: Второй список.
  • Возвращает: Новый список, содержащий все элементы из LIST_1, за которыми следуют все элементы из LIST_2.
  • Выбрасывает: RuntimeError, если любой из аргументов не является списком.

Пример:

LISPEX
(append (list 1 2) (list 3 4))
;; Результат: (list 1 2 3 4)

(append (list) (list 1 2))
;; Результат: (list 1 2)

nth

Возвращает элемент по указанному индексу (начиная с нуля) в списке.

  • Синтаксис: (nth LIST INDEX)
  • Аргументы:
  • LIST: Список, из которого нужно получить элемент.
  • INDEX: Целочисленный индекс извлекаемого элемента (начиная с 0).
  • Возвращает: Элемент по указанному индексу.
  • Выбрасывает:
  • RuntimeError, если LIST не является списком или INDEX не является целым числом.
  • RuntimeError, если INDEX находится за пределами допустимого диапазона (меньше 0 или больше либо равен длине списка).

Пример:

LISPEX
(define my-list (list "a" "b" "c"))

(nth my-list 0)
;; Результат: "a"

(nth my-list 2)
;; Результат: "c"

(nth my-list 3)
;; Выбрасывает RuntimeError: Индекс 3 вне допустимого диапазона

member

Ищет в списке элемент, равный заданному объекту, и возвращает подсписок, начинающийся с первого совпадения, или #f, если совпадений нет. memv и memq выполняют тот же поиск, используя тождество eqv? вместо глубокого equal? (в этой версии eqv? и eq? совпадают, поэтому memq ведёт себя как memv).

  • Синтаксис: (member OBJ LIST)
  • Аргументы:
    • OBJ: Искомый объект (сравнивается через equal?; memv/memq используют eqv?).
    • LIST: Список для поиска.
  • Возвращает: Подсписок (хвост), начинающийся с первого совпавшего элемента, или #f, если его нет.
  • Выбрасывает: RuntimeError, если LIST не является правильным списком.

Пример:

LISPEX
(member 2 (list 1 2 3))
;; Результат: (list 2 3)

(member 5 (list 1 2 3))
;; Результат: #f

assoc

Ищет в ассоциативном списке (списке пар) первую пару, ключ которой (её car) равен заданному объекту, и возвращает эту пару, или #f, если совпадений нет. assv и assq выполняют тот же поиск, используя eqv? вместо equal?.

  • Синтаксис: (assoc OBJ ALIST)
  • Аргументы:
    • OBJ: Искомый ключ (сравнивается через equal?; assv/assq используют eqv?).
    • ALIST: Ассоциативный список, каждый элемент которого является парой.
  • Возвращает: Первую пару-элемент, чей car совпадает, или #f, если её нет.
  • Выбрасывает: RuntimeError, если ALIST не является правильным списком пар.

Пример:

LISPEX
(assoc 2 (list (list 1 "one") (list 2 "two")))
;; Результат: (list 2 "two")

(assoc 9 (list (list 1 "one")))
;; Результат: #f

list-tail

Возвращает подсписок, полученный отбрасыванием первых K элементов LST, то есть K-й cdr. Результат разделяет структуру с LST, а не копирует её. Если в LST меньше K элементов, это ошибка.

  • Синтаксис: (list-tail LST K)
  • Аргументы:
    • LST: Список.
    • K: Неотрицательное целое число, не превышающее длину LST.
  • Возвращает: Подсписок после первых K элементов (сам LST, если K равно 0).
  • Выбрасывает: RuntimeError, если K отрицательно или больше длины LST.

Пример:

LISPEX
(list-tail (list 1 2 3 4) 2)
;; Результат: (list 3 4)

list-copy

Возвращает поверхностную копию LST, свежую цепочку пар с теми же элементами. Копия не eq? оригиналу, но её элементы разделяются, а не дублируются. Объект, не являющийся списком, возвращается без изменений.

  • Синтаксис: (list-copy LST)
  • Аргументы:
    • LST: Список (или любой объект).
  • Возвращает: Вновь выделенную копию списка, разделяющую его элементы.

Пример:

LISPEX
(list-copy (list 1 2 3))
;; Результат: (list 1 2 3)