Cтраница 4
В Лиспе макропрограммирование можно применять разными способами, например так, как это принято в системном программировании. С помощью макросов можно определять близкие решаемой задаче языки более высокого уровня и процессоры ( processor) для них, т.е. интерпретатор и транслятор или конвер-тор. Процессором является программа, реализующая типы данных и действия абстрактного языка в некотором другом языке. Реализованные с помощью макросов новый язык и его процессор называют абстрактной моделью ( abstract model) языка. [46]
В Лиспе подпрограмма может во время выполнения построить новую подпрограмму и вернуть ее в качестве своего результата. Вызывающая программа может затем выполнить эту новую подпрограмму с подходящими аргументами так, как если бы эта подпрограмма всегда существовала. [47]
В Лиспе используется неупорядоченная структура памяти, при которой слова памяти рассматриваются как отдельные объекты, а не как элементы непрерывной области памяти. Слова Лиспа могут соединяться, образуя списки; каждый список становится отдельной частью памяти, и каждый элемент неупорядоченной памяти состоит из слова данных и связующего указателя. Операция присвоения в памяти производится следующим образом: из неупорядоченной памяти или свободного списка выбирается элемент памяти, который присоединяется к существующему списку ( или к другим свободным элементам неупорядоченной памяти) для образования нового списка. Участки списка, которые больше не являются необходимыми, возвращаются в неупорядоченную память или список свободных элементов памяти. Для проведения этой операции требуется сложная процедура перераспределения памяти ( сборка мусора), отнимающая машинное время. [48]
В Лиспе не существует различий между функциями и данными, образующими списки. Способность использования функции в качестве параметров позволяет осуществлять в языке действия над символами, невозможные в большинстве других языков. Лисп - интерактивный язык интерпретирующего типа, в котором для определения операций используются вложенные скобки. Единственное синтаксическое правило состоит в том, чтобы поддерживался баланс числа правых и левых скобок, и если это правило выполняется, может быть оценено значение любого выражения. [49]
В Лиспе функции с самого начала не определялись как отдельный тип данных, а в работе с ними опирались на другие решения подобно сохранению определения функции в виде свойства символа. Отсюда проистекают проблемы, возникающие при использовании функционалов, например связанная с контекстом вычисления фун-арг-проблема. Функции и функционалы в Лиспе не всегда являются полноправными гражданами, иными словами, они не всегда трактуются совершенно равнозначно с другими типами данных. Даже не все Лисп-системы реализуют функционалы в общем виде. [50]
В Лиспе формы представления программы и обрабатываемых ею данных одинаковы. И то и другое представляется списочной структурой, имеющей одинаковую форму. Таким образом программы могут обрабатывать и преобразовывать другие программы и даже самих себя. В процессе трансляции можно введенное и сформированное в результате вычислений выражение данных проинтерпретировать в качестве программы и непосредственно выполнить. [51]
Несколько диалектов Лиспа различаются главным образом особенностями своей программной среды. [52]