Cтраница 3
Списки Лиспа - это простые структуры с одной связью, как изображено на рис. 14.3. Каждый элемент списка содержит указатель на элемент данных и указатель на следующий элемент списка. Последний элемент списка указывает на специальный атом NIL. Два указателя, содержащиеся в элементе списка, называются CAR-указателем и CDR-указателем. CDR указывает на последующий элемент списка, a CAR - на элемент данных. Происхождение терминов CAR и CDR обусловлено аппаратной организацией первой вычислительной машины, на которой был реализован Лисп, однако они настолько укоренились в жаргоне Лиспа, что их используют до сих пор. [31]
В Лиспе главная программа состоит из простой последовательности вызовов функций; каждый вызов представляет собой имя функции, за которым следует список фактических параметров. [32]
В Лиспе имеются операции над множествами. [33]
![]() |
Примитивы Лиспа. [34] |
В Лиспе существует идентичный механизм, только функция вводится с помощью специального атома LAMBDA, а не с помощью ключевого слова ( lambda), как в Норе. Лямбда-выражение языка Лисп является S-выражением из трех компонентов: первый компонент - это атом LAMBDA, второй - это список имен формальных параметров функции, и третий - это тело функции. [35]
В Лиспе, например, процедуры могут служить в качестве данных, подставляемых на место аргументов. В результате они могут вернуться в качестве значений функций, запоминаемых снова в качестве данных. [36]
В Лиспе имена символов, переменных, списков, функций и других объектов не закреплены предварительно за какими-нибудь типами данных. Типы в общем не связаны с именами объектов данных, а сопровождают сами объекты. [37]
В Лиспе все действия возвращают некоторое значение. Значение имеется даже у таких действий, основное предназначение которых заключается в осуществлении побочного эффекта, таких, например, как связывание символа или вывод результатов на печать. Функции, обладающие побочным эффектом, в Лиспе называют псевдофункциями. [38]
В Лиспе все-таки можно с помощью псевдофункций, меняющих структуры, использовать формальные параметры таким же образом, как это происходит при передаче параметров по ссылке. Побочные эффекты их использования отражаются на значениях всех переменных, ссылающихся на некоторый элемент данных. [39]
В Лиспе все-таки есть и специальные функции, при помощи которых на структуры уже существующих выражений можно непосредственно влиять так же, как, например, в Паскале. Это осуществляют функции, которые, как хирург, оперируют на внутренней структуре выражении. [40]
В Лиспе допускается большое число ссылок на каждый список после его создания - через идентификаторы или через указатели, хранящиеся в других списках, подсписком которых он может быть. Могут также существовать пути доступа к отдельным частям этого списка. Допускается создание и уничтожение таких путей доступа по желанию во время выполнения программы. Последний путь доступа к некоторому списку может быть разрушен в любой момент, но в общем случае не существует простого способа для определения этого момента. Поскольку трудно определить, когда конкретный список становится мусором, во время разрушения пути доступа не делается никакой утилизации памяти. Более того, могут порождаться другие структуры, становящиеся затем мусором, и они могут продолжать существовать в памяти, даже если они недоступны. [41]
В Лиспе используется как явный, так и неявный способы определения. [42]
В Лиспе в отношениях между программой и данными достигнут некоторый компромисс. Форма представления программы и данных едина, и программу можно свободно трактовать как данные так же, как данные можно интерпретировать и применять как программу. У языковых конструкций есть две интерпретации, зависящие от их использования. Использование и интерпретацию выражений определяет программист. Средства и механизмы, необходимые для вызова интерпретатора и применения объектов ( EVAL, APPLY, FUNCALL, QUOTE, FUNCTION и так далее), так же как и средства, используемые для предотвращения вычислений, находятся в распоряжении программиста. Преобразования программы в данные и данных в программу определяются программистом. [43]
В Лиспе наряду с традиционными статическими формами предложений используется структурный динамический механизм переходов CATCH-THROW, который позволяет передать управление из одного статического окружения в другое. [44]
В Лиспе первоначально не было таких более современных форм структурного программирования. Фразовое программирование в стиле Алгола и Фортрана хорошо подходит и для Лиспа. И если некоторая форма отсутствует или если изобретена какая-нибудь новая форма, то ее можно легко добавить в язык в виде макроса. [45]