Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Spec_Mov_3k_4k_Lect.doc
Скачиваний:
0
Добавлен:
01.03.2025
Размер:
1.46 Mб
Скачать

Вычисление s-выражений

Все объекты данных представляют сами себя за исключением списков и символов. Отдельные символы трактуются как переменные и для них ищется соответствующее значение в контексте вычислений (формируемом с помощью set, setq, psetq и пр.). Выражения-списки вычисляются иначе:

  • анализируется 1-й элемент и это д.б. символ, которому сопоставлена функция или спецформа, или 1-й элемент является лямбда-выражением или именем макрокоманды,

  • для функций или лямбда-выражений выражения аргументов вычисляются сразу и затем выполняется аппликация функции к аргументам,

  • для спецформ выражения аргументов не вычисляются и они воспринимаются спецформой так, как они есть (внутри спецформ к отдельным аргументам могут применяться функция eval и применяющие функционалы),

  • для макрокоманд аргументы не вычисляются, формируется некоторое выражение, являющееся результатом применения функций и спецформ, содержащихся в теле макрокоманды, затем сформированное выражение вычисляется.

Пример

В примере демонстрируется различная трактовка интерпретатором свойств символов, определяемых с помощью форм setq и defun, что может восприниматься программистом как раздельный контекст для функций и для переменных.

>(defun f(x y)(+ y x))

f

>(setq f1 (lambda(y x)(* y x)))

#(closure: #485302ca>

>(apply ‘f1 ‘(5 4))

error: unbound function – f1

1>(apply f1 ‘(5 4))

20

1>(apply ‘f ‘(5 4))

9

1>(apply f ‘(5 4))

error: unbound variable – f

2>

Функции и формы

В описании языка различаются встроенные функции и функции, определяемые программистом с помощью спецформы defun (т.н. subrs). Для тех и других параметры в выражениях аппликации вычисляются сразу и передаются по значению. От них существенно отличаются спецформы (т.н. fsubrs), такие как quote, set, setq, prog, do, do* и пр., вычисление выражений аргументов для которых задерживается и количество параметров, в большинстве случаев, не фиксировано.

Типы данных

По сравнению с базовым Лиспом множество типов данных в Xlisp расширено и включает:

1) списки, 2) символы, 3) строки, 4) целые, 5) вещественные, 6) отдельные литеры, 7) объекты, 8) массивы, 9) потоки, 10) subrs или встроенные функции, 11) fsubrs или спецформы (типа if, setq, prog, defun и т.п.), 12) замыкания (внутренние представления функций, определяемых программистом).

Макросы ввода

Специальная внутренняя таблица Интерпретатора Лиспа readtable сопоставляет некоторым вводимым символам макрокоманды (макросы) ввода. Такие символы можно рассматривать как конструкторы данных:

‘выражение = (quote выражение)

#’ выражение = (function выражение)

#( выражение, выражение …) = массив

#xnn…n = 16-ричное число

#0nn…n = 8-ричное число

#bnn…n = 2-е число

#\xxx = символ, где xxx – ASCII-код символа

#|…..| = документируемый комментарий

#:символьный атом = атом, не транслируемый во внутреннюю форму (не уникальный)

`выражение (выражение с обратным апострофом), ,выражение (выражение с запятой), ,@выражение (выражение с запятой и символом @) = эти выражения обычно используются в макрокомандах

“…” = строка литер

Пример

Выражение #( выражение, выражение …) действительно создает массив, а не задержанное выражение.

>(setq y #(+ 3 4))

#(+ 3 4)

>y

#(+ 3 4)

>(eval y)

#(+ 3 4)

>(setq x ‘(+ 3 4))

(+ 3 4)

>x

(+ 3 4)

>(eval x)

7

Обратный апостроф блокирует вычисление выражения, но внутри такого выражения можно локально отменить блокировку при помощи запятой (т.н. замещающая отмена). Пара символов «,@» означает присоединяющую отмену блокировки, когда внешние скобки списочного выражения снимаются.

Пример

>(setq x ‘(new elem))

(new elem)

>’(include ,x in a list)

(include (comma x) in a list)

>`(include ,x in a list)

(include (new elem) in a list)

>`(include ,@x in a list)

(include new elem in a list)

Пара символов «,@» действует как оператор десегментации в языке Planner, размещая элементы некоторого списка внутри другого списка.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]