3.2. ACCESS: ПРЯМОЙ ДОСТУП К ВЫРАЖЕНИЯМ

$func LENGTH e.Exp = s.ExpLen;

$func? LEFT s.Left s.Len e.Exp = e.SubExp;

$func? RIGHT s.Right s.Len e.Exp = e.SubExp;

$func? MIDDLE s.Left s.Right e.Exp = e.SubExp;

$func? L s.Left e.Exp = t.SubExp;

$func? R s.Right e.Exp = t.SubExp;

Эти функции используются для прямого доступа к частям выражений. Их аргументы s.Left, s.Right и s.Len должны быть неотрицательными целыми числами. e.Exp может быть произвольным объектным выражением.

Если s.Left, s.Right или s.Len не являются неотрицательными целыми числами, результатом функций является ошибка $error(Fname "Invalid argument"), где Fname - имя функции.


LENGTH выдает длину выражения e.Exp, измеренную в термах. А именно, если объектное выражение Oe имеет вид Ot1 Ot2 ... OtN, то N - его длина.

Например:

<LENGTH > => 0

<LENGTH A B C> => 3

<LENGTH (A B) C (D E)> => 3


LEFT отбрасывает от e.Exp первые s.Left термов, а затем от того, что останется, берет первые s.Len термов и выдает полученное выражение в качестве результата.


RIGHT отбрасывает от e.Exp последние s.Right термов, а затем от того, что останется, берет последние s.Len термов и выдает полученное выражение в качестве результата.


MIDDLE отбрасывает от e.Exp первые s.Left и последние s.Right термов  и выдает полученное выражение в качестве результата.


L отбрасывает от e.Exp первые s.Left   термов  и выдает первый терм полученного выражения в качестве результата.


R отбрасывает от e.Exp последние s.Right термов   и выдает последний терм полученного выражения в качестве результата.


Если e.Exp имеет недостаточно большую длину, чтобы можно было выполнить требуемую операцию, результатом работы любой из вышеперечисленных функций является $fail(0).

Например:

<MIDDLE 2 3 A B C D E F> => C

<MIDDLE 2 3 A B C D> => $fail(0)

<MIDDLE 0 0 A B C> => A B C

<LEFT 2 3 A B C D E F> => C D E

<LEFT 2 3 A B C D> => $fail(0)

<LEFT 0 0 A B C> =>

<RIGHT 2 3 A B C D E F> => B C D

<RIGHT 2 3 A B C D> => $fail(0)

<RIGHT 0 0 A B C> =>

<L 2 A B C D E F> => C

<L 2 A B> => $fail(0)

<R 2 A B C D E F> => D

<R 2 A B> => $fail(0)

Операции MIDDLE, LEFT и RIGHT можно изобразить в виде следующей схемы:

s.Left s.Right

+-------+-------+-------+

| |XXXXXXX| | <MIDDLE s.Left s.Right e.Exp>

+-------+-------+-------+

s.Left s.Len

+-------+-------+-------+

| |XXXXXXX| | <LEFT s.Left s.Len e.Exp>

+-------+-------+-------+

s.Len s.Right

+-------+-------+-------+

| |XXXXXXX| | <RIGHT s.Right s.Len e.Exp>

+-------+-------+-------+