UNIT Out.ms.dict
USES
axiom_push.ms.dict
;
USES
core.ms.dict
;
USES
ElementsRTTI.ms.dict
;
USES
CompileTimeVar.ms.dict
;
USES
SaveVarAndDo.ms.dict
;
CONST cPathSep '\'
FILE CompileTime-VAR g_OutFile nil
%REMARK 'Текущий файл'
STRING CompileTime-VAR g_Indent ''
%REMARK 'Текущий отступ'
CONST cIndentChar ' '
STRING FUNCTION IndentStr
g_Indent >>> Result
; // IndentStr
OBJECT STRING INTEGER ARRAY BOOLEAN TYPE OUTABLE
USES
Chars.ms.dict
;
BOOLEAN CompileTime-VAR g_EnableAutoEOL true
BOOLEAN CompileTime-VAR g_NeedOutLn false
: DoToOut
g_OutFile File:WriteStr
; // DoToOut
VAR g_ToOut
( @ DoToOut >>> g_ToOut )
: ToOut
g_ToOut IsNil ?FAIL 'Не определён файл для вывода'
g_ToOut DO
; // ToOut
PROCEDURE OutLnToFile
\n ToOut
; // OutLnToFile
BOOLEAN FUNCTION .Out?
OUTABLE IN aValue
: .OutToFile
if g_NeedOutLn then
begin
false >>> g_NeedOutLn
OutLnToFile
end // g_NeedOutLn
ToOut
; // .OutToFile
VAR l_WasOut
VAR l_NeedIndent
PROCEDURE .OutValue
OUTABLE IN aValue
RULES
( aValue .IsValueValid ! )
()
( aValue IsArray )
begin
aValue .for> call.me
end // aValue IsArray
DEFAULT
begin
STRING VAR l_Value
aValue ToPrintable >>> l_Value
if ( l_WasOut ! ) then
begin
true >>> l_WasOut
IndentStr .OutToFile
false >>> l_NeedIndent
end // l_WasOut !
if ( l_NeedIndent ) then
begin
false >>> l_NeedIndent
IndentStr .OutToFile
end // l_NeedIndent
if ( l_Value \n == ) then
begin
l_Value .OutToFile
true >>> l_NeedIndent
end // ( l_Value \n == )
else
begin
l_Value .OutToFile
end // ( l_Value \n == )
end // DEFAULT
; // RULES
; // .OutValue
false >>> l_WasOut
false >>> l_NeedIndent
aValue .OutValue
if l_WasOut then
if g_EnableAutoEOL then
OutLnToFile
l_WasOut >>> Result
; // .Out?
: .Out
.Out? DROP
; // .Out
PROCEDURE Indented:
^ IN aLambda
TF g_Indent (
g_Indent cIndentChar Cat >>> g_Indent
aLambda DO
)
; // Indented:
PROCEDURE OutLn
if g_NeedOutLn then
OutLnToFile
true >>> g_NeedOutLn
; // OutLn
PROCEDURE .ProcessOut:
STRING IN aFileName
^ IN aLambda
TF g_OutFile (
TF g_NeedOutLn (
aFileName File:OpenWrite >>> g_OutFile
TRY
aLambda DO
FINALLY
nil >>> g_OutFile
END // TRY..FINALLY
) // TF g_NeedOutLn
) // TF g_OutFile
; // .ProcessOut:
USES
CreateGUID.ms.dict
;
USES
IsNil.ms.dict
;
PROCEDURE .ProcessTmpOut:
STRING IN aFileName
^ IN aLambda
VAR l_OutFileName
VAR l_FileName
aFileName >>> l_FileName
if ( l_FileName sysutils:ExtractFilePath .IsNil ) then
begin
[ sysutils:GetCurrentDir l_FileName ] cPathSep strings:CatSep >>> l_FileName
end // ( l_FileName sysutils:ExtractFilePath .IsNil )
[ 'C:\Temp\' CreateUID '.tmp' ] strings:Cat >>> l_OutFileName
l_OutFileName .ProcessOut: ( aLambda DO )
if (
( l_FileName sysutils:FileExists ! )
OR ( cEmptyStr l_FileName l_OutFileName CompareFiles ! )
) then
begin
$20 l_FileName l_OutFileName CopyFile
end
l_OutFileName DeleteFile DROP
; // .ProcessTmpOut:
PROCEDURE .ProcessIn:
STRING IN aFileName
^ IN aLambda
FILE VAR l_In
nil >>> l_In
TF l_In (
aFileName File:OpenRead >>> l_In
l_In File:ReadLines ( aLambda DO )
) // TF l_In
; // .ProcessIn:
elem_proc OutWordLink
STRING IN aDictFileName
[
'WL' ' '
cQuote 'ME_' Self .UID cQuote
' '
cQuote aDictFileName cQuote
' // ' Self .Name
] .Out
; // OutWordLink
PROCEDURE OutSeq:
^ IN aLambda
'Seq: (' .Out
Indented: (
aLambda DO
) // Indented:
') // Seq:' .Out
; // OutSeq:
PROCEDURE .OutWord:
STRING IN aName
^ IN aLambda
[ ': ' aName ] .Out
Indented: (
aLambda DO
) // Indented:
[ '; // ' aName ] .Out
; // .OutWord:
PROCEDURE .OutMEWord:
STRING IN aName
^ IN aLambda
[ 'ME ' aName ] .Out
Indented: (
aLambda DO
) // Indented:
[ 'ENDME // ' aName ] .Out
; // .OutMEWord:
USES
arrays.ms.dict
;
ARRAY FUNCTION HookOut:
^ IN aLambda
[] >>> Result
TF g_ToOut (
@ ( IN aValue aValue .AddToArray: Result ) >>> g_ToOut
aLambda DO
) // TF g_ToOut
false >>> g_NeedOutLn
; // HookOut:
Заметки о тестировании, программировании и прочий "поток сознания", который жалко писать "в стол"
вторник, 11 октября 2016 г.
#1293. "А ваш язык так может?" №12. Как устроено слово .ProcessOut:
Подписаться на:
Комментарии к сообщению (Atom)
для чего оно?
ОтветитьУдалитьДля вывода значений в текущий вывод.
Удалить