Код:
Пример использования:
Вывод на печать:
UNIT DumpStack.ms.dict USES io.ms.dict ; PROCEDURE DumpStackTo ^ IN aLambda %REMARK 'Вычисляемое значение' ^ IN aOutput %REMARK 'Устройство вывода' %SUMMARY 'Печатает состояние стека после вычисления выражения aLambda' ; INTEGER VAR l_StackLevel %REMARK 'Уровень стека' StackLevel >>> l_StackLevel aLambda DO %REMARK 'Вычисляем выражение aLambda. Оно может положить на стек "сколько угодно" значений' StackLevel l_StackLevel - >>> l_StackLevel %REMARK 'Вычисляем приращение стека' l_StackLevel >= 0 ?ASSURE 'Приращение стека не может быть отрицательным' while ( l_StackLevel > 0 ) %REMARK 'Цикл по значениям в стеке' begin Dec l_StackLevel aOutput DO %REMARK 'Печатаем значение со стека' end // while ( l_StackLevel > 0 ) ; // DumpStackTo PROCEDURE DumpStack ^ IN aLambda %REMARK 'Вычисляемое значение' DumpStackTo ( aLambda DO ) Log ; // DumpStack
Пример использования:
UNIT DogAndBracket.ms.dict
USES
axiom:Tl3TokenType
axiom_push.ms.dict
core.ms.dict
io.ms.dict
macro.ms.dict
NoCapsLock.ms.dict
params.ms.dict
arrays.ms.dict
Testing.ms.dict
;
Procedure DogAndBracket
String in aBracketOpen
String in aBracketClose
INTERFACE var l_Parser
Ctx:Parser >>> l_Parser
ARRAY var l_A
l_A := []
l_Parser pop:Parser:NextToken
while true
begin
String var l_Token
l_Parser pop:Parser:TokenLongString >>> l_Token
TOKEN_TYPE var l_TokenType
l_Parser pop:Parser:TokenType >>> l_TokenType
if ( l_TokenType = Tl3TokenType::l3_ttSymbol ) then
begin
( l_Token = NameOf ( ) ?Fail 'Вложенные скобки пока не поддерживаются'
( l_Token = NameOf [ ) ?Fail 'Вложенные скобки пока не поддерживаются'
if ( l_Token = aBracketClose ) then
begin
aBracketOpen Ctx:Parser:PushSymbol
l_A .slice> 2 .for>
begin
TOKEN in aSymbol
TOKEN_TYPE in aTokenType
axiom:PushSymbol @
aSymbol aTokenType axiom:Push
end
l_Token Ctx:Parser:PushSymbol
break
end //l_Token = aBracketClose
end // l_TokenType = Tl3TokenType::l3_ttSymbol
if ( l_TokenType = Tl3TokenType::l3_ttInteger ) then
begin
l_Parser pop:Parser:TokenInt >>>[] l_A
end // l_TokenType = Tl3TokenType::l3_ttInteger
else
begin
l_Token >>>[] l_A
end // l_TokenType = Tl3TokenType::l3_ttInteger
l_TokenType >>>[] l_A
l_Parser pop:Parser:NextToken
end // while true
; // DogAndBracket
USES
DumpStack.ms.dict
;
MACRO @(
%SUMMARY '
Компилирует СПИСОК адресов слов.
Аналог ( @ X1 @ X2 .. @ XN )
'
;
NameOf (
NameOf )
DogAndBracket
; // @(
TestsFor @(
Test T1 DumpStack @( 1 2 3 4 5 6 1 2 + '123' ) ;
; // TestsFor @(
MACRO @[
%SUMMARY '
Компилирует МАССИВ адресов слов.
Аналог [ @ X1 @ X2 .. @ XN ]
'
;
NameOf [
NameOf ]
DogAndBracket
; // @[
TestsFor @[
Test T1 DumpStack @[ 1 2 3 4 5 6 1 2 + '123' ] ;
; // TestsFor @[
PROGRAM DogAndBracket.ms.script USES DogAndBracket.ms.dict Testing.ms.dict ; Test&Dump DogAndBracketTest RunTests.in.array @[ @( @[ ] %REMARK 'Запускаем тесты к указанным скриптовым словам' ; // DogAndBracketTest DogAndBracketTest
Вывод на печать:
VOID TestWithDump DogAndBracketTest
DogAndBracketTest
DumpElement
'@('
@
Tests:@(
DoRunTestsFor
'@['
@
Tests:@[
DoRunTestsFor
; // VOID TestWithDump DogAndBracketTest
Testing: @(
T1
123
+
2
1
6
5
4
3
2
1
Testing end: @(
------------------
Testing: @[
T1
[ 1 2 3 4 5 6 1 2 + 123 ]
Testing end: @[
------------------
Комментариев нет:
Отправить комментарий