Язык программирования Лисп (1086318), страница 4
Текст из файла (страница 4)
Функция генерации уникальных атомов, при каждом обращении к ней вычисляет (образует) новый атом-идентификатор. Этот идентификатор получается склеиванием специального префикса и очередного целого числа. Префикс и целое число, от которого начинается нумерация генерируемых атомов, могут быть установлены заранее, как например, в языке MuLisp:
(setq *gensym-prefix* 'S) (setq *gensym-count* 2).
После этого функция gensym будет последовательно выдавать атомы
S2, S3, S4, ... .
Блочная и связанные с ней функции
(prog (v1 v2 ... vn) e1 e2 ... ek) (n≥0, k≥1)
Эту функцию называют "блочной", поскольку ее вычисление напоминает выполнение блоков в других языках программирования. Вычисление функции начинается с того, что вводятся локальные переменные vi, перечисленные в ее первом аргументе, и всем им присваивается в качестве начального значения пустой список (). После этого функция последовательно вычисляет остальные свои аргументы - формы ei. Вычислив последнюю из них, функция prog заканчивает работу со значением этой формы, уничтожив при этом свои локальные переменные.
Вычисленные значения всех форм ei, кроме последней, нигде не запоминаются, поэтому имеет смысл использовать в качестве них только функции с побочным эффектом. Некоторые из этих функций перечислены ниже.
В качестве ei может быть записан и атом-идентификатор, в этом случае он не вычисляется, и трактуется как метка, на которую будет производиться переход внутри этого блока (функцией go).
(setq v e)
Это аналог оператора присваивания. В качестве аргумента v должно быть задано имя переменной, существующей в данный момент. Функция присваивает этой переменной новое значение - значение аргумента e. Это же значение является значением и самой функции setq, хотя оно, как правило, не используется.
(pop v1 v2)
Обоими аргументами должны быть имена переменных, существующих в данный момент, причем переменная v2 должна иметь значение и им должен быть непустой список. Функция "расщепляет" этот список на две части - на его первый элемент, который присваивается переменной v1, и на его "хвост" (без первого элемента), который становится новым значением переменной v2. Значением самой функции является...
(push е v)
В качестве второго аргумента этой функции должно быть задано имя переменной, в качестве первого - произвольная форма. Функция вычисляет эту форму и строит новый список, первый элемент которого - вычисленное значение, а хвост - список, являющийся значением переменной v. Результирующий список присваивается в качестве нового значения переменной v (он также является значением самой функции push).
(return e)
Это функция досрочного выхода из блока, она может использоваться только внутри блочной функции prog, поскольку завершает вычисление ближайшей объемлющей блочной функции, объявляя ее значением значение аргумента e.
(go e)
Это функция перехода по метке. В качестве аргумента функции go должен быть задан идентификатор - одна из меток ближайшей объемлющей блочной функции. Функция go полностью завершает вычисление той формы этой блочной функции, в которую она входит (на любом уровне), и осуществляет переход для вычисления формы, следующей за этой меткой.















