суббота, 24 июня 2017 г.

Ещё про скрипты


Также это в некотором смысле - аналог 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

Комментариев нет:

Отправить комментарий