Также это в некотором смысле - аналог json.
Можно написать:
Elem A Elem B ; // B Elem C ; // C ; // A PROCEDURE .Print IN anElement anElement .Stereotype .Out // - печатаем стереотип элемента anElement .Name .Out // - печатаем имя элемента anElement .MembersIterator .for call.me // - итерируем вложенные элементы и вызываем себя рекурсивно ; // .Print @ A .Print
Будет напечатано:
Elem
A
Elem
B
Elem
C
А можно написать так:
STRING VAR S S := ' Elem A Elem B ; Elem C ; ; ' >>> S // - кладём "код в строку" // Да - строки в кавычках могут содержать в себе и переводы строк тоже S .CompileStringAndDo .Print // - компилируем строку и вызываем для построенного кода функцию .Print
Результат будет тот же.
А можно написать так:
: .ToStack IN anElement anElement // - это кладём на стек anElement .MembersIterator .for call.me // - итерируем вложенные элементы и вызываем себя рекурсивно ; // .ToStack STRING VAR S S := ' Elem A Elem B ; Elem C ; ; ' >>> S // - кладём "код в строку" // Да - строки в кавычках могут содержать в себе и переводы строк тоже ARRAY VAR A [ // - открываем массив S .CompileStringAndDo .ToStack ] // - закрываем массив >>> A // - кладём массив в переменную A A .for .Out // - печатаем массив полностью A .filter ( .Name <> 'B' ) .for .Out // - печатаем из массива элементы имя которых НЕ РАВНО B
Ну и всякие подобные штучки.
А можно без копирования:
PROCEDURE .Unfold IN anElement FUNCTOR IN aLambda anElement aLambda DO // - вызываем функтор aLambda на элементе anElement anElement .MembersIterator .for ( aLambda call.me ) // - итерируем вложенные элементы и вызываем себя рекурсивно ; // .Unfold STRING VAR S S := ' Elem A Elem B ; Elem C ; ; ' >>> S // - кладём "код в строку" // Да - строки в кавычках могут содержать в себе и переводы строк тоже VAR A S .CompileStringAndDo ( >>> A ) // - компилируем код из строки S и кладём результат в переменную A FunctorToIterator // - преобразование функтора в итератор A // - параметр функтора .Unfold // - сам функтор .for .Out // - печатаем массив полностью FunctorToIterator A .Unfold .filter ( .Name <> 'B' ) .for .Out // - печатаем из массива элементы имя которых НЕ РАВНО B
Комментариев нет:
Отправить комментарий