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 > => 0
<LENGTH A B C> => 3
<LENGTH (A B) C (D E)> => 3
Если
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>
+-------+-------+-------+