рд╕реНрдЯреИрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдХрд╛рд░рдг ... рдХреЙрд▓ рд╕реНрдЯреИрдХ

рдПрдХ рдмрд╛рд░ рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рд╡рд┐рдЪрд╛рд░ рдЖрдпрд╛: рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдХреЙрд▓ рд╕реНрдЯреИрдХ рдФрд░ рд╕реНрдЯреИрдХ рд╣реИред рдХреНрдпрд╛ рдбреЗрдЯрд╛ рд╕реНрдЯреЛрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЙрд▓ рд╕реНрдЯреИрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ?
рдереЛрдбрд╝рд╛ рд╡рд┐рдЪрд╛рд░ рдХреЗ рд╕рд╛рде, рдореБрдЭреЗ рдПрд╣рд╕рд╛рд╕ рд╣реБрдЖ рдХрд┐ рдпрд╣ рд╕рдВрднрд╡ рд╣реИ, рд▓реЗрдХрд┐рди рд╕реАрдорд╛рдУрдВ рдХреЗ рд╕рд╛рде: рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЖрдкрдХреЛ рдореВрд▓реНрдпреЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЙрд▓рдмреИрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ (рдЖрдЦрд┐рд░рдХрд╛рд░, рдЬрдм рддрдХ рдХрд┐ рдореВрд▓реНрдп рд╕реНрдЯреИрдХ рдкрд░ рд╣реИ, рдЖрдк рдЙрд╕ рдХреЙрд▓ рдХреЛ рдирд╣реАрдВ рдЫреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рд╣рдордиреЗ рдЗрд╕реЗ рдмрдЪрд╛рдпрд╛ рд╣реИ)ред рджреВрд╕рд░реЗ, рдПрдХреНрд╕реЗрд╕ рдХрд╛ рд╕рдЦреНрддреА рд╕реЗ рд▓рд┐рдлреЛ рд╣реИред
рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди - рдХрдЯреМрддреА рдХреЗ рддрд╣рддред

рдПрдХ рднрд╛рд╖рд╛ рдХреЗ рд░реВрдк рдореЗрдВ, рдореИрдВрдиреЗ рдирд┐рдорд░реНрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ - рдПрдХ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рд╢реИрд▓реА рдХреЗ рдкрд░рд┐рдЪрд┐рдд .NET + рд╕реБрд╡рд┐рдзрд╛ред

рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕реНрд╡рдпрдВ рдмрд╛рд╣реНрдп рд░реВрдк рд╕реЗ рд╕рд░рд▓ рд╣реИ:
variant StackAction[T]{ | Push{ value : T; next : void -> StackAction[T]; } | Pop { next : T -> StackAction[T]; } } module StackStack{ public Enter[T](current : StackAction[T].Push) : StackAction[T]{ def processNext(next : StackAction[T]): StackAction[T]{ match(next){ | push is StackAction[T].Push => processNext(Enter(push)); | pop is StackAction[T].Pop => pop.next(current.value); } } processNext(current.next()); } } 


рдирд┐рдорд░реНрд▓ рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╕реЗ рдЕрдкрд░рд┐рдЪрд┐рдд рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП:
рд╡реИрд░рд┐рдПрдВрдЯ StackAction [T] рдПрдХ рд╡реИрд░рд┐рдПрдВрдЯ рдЬреЗрдиреЗрд░рд┐рдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рд╡реИрд░рд┐рдПрдмрд▓ рдкреБрд╢ рдпрд╛ рдкреЙрдк рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрджрд┐ рдореВрд▓реНрдп рдкреБрд╢ рд╣реИ, рддреЛ рд╡реИрд▓реНрдпреВ рдлрд╝реАрд▓реНрдбреНрд╕ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП (рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдорд╛рди рдЬрд┐рд╕реЗ рд╣рдо рд╕реНрдЯреИрдХ рдкрд░ рд░рдЦрддреЗ рд╣реИрдВ), рдФрд░ рдЕрдЧрд▓рд╛ рдПрдХ рдХреЙрд▓рдмреИрдХ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдорд╛рдкрджрдВрдбреЛрдВ рдХреА рдПрдХ рдЦрд╛рд▓реА рд╕реВрдЪреА рд╣реЛрддреА рд╣реИ рдЬреЛ рдЕрдЧрд▓рд╛ рд╕реНрдЯреИрдХрдПрдХреНрд╢рди рд▓реМрдЯрд╛рддреА рд╣реИред рдФрд░ рдЕрдЧрд░ рдкреЙрдк, рддреЛ рдЗрд╕реЗ рдХреЙрд▓рдмреИрдХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдПрдХ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реНрдЯреИрдХ рдХреЗ рд╢реАрд░реНрд╖ рд╕реЗ рдорд╛рди, рдФрд░ рдЕрдЧрд▓реЗ рд╕реНрдЯреИрдХреЗрд╢рди рдХреЛ рднреА рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдлрд╝рдВрдХреНрд╢рди рдлрд╝рдВрдХреНрд╢рди рд╕реНрдЯреИрдХ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рдмрд╣реБрдд рддрд░реНрдХ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрдВрджрд░, рдПрдХ рд╕реНрдерд╛рдиреАрдп рдкреНрд░рдХреНрд░рд┐рдпрд╛рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдлрд╝рдВрдХреНрд╢рди рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдПрдХ рдмрдВрдж рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд░реНрддрдорд╛рди рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИред рдкреНрд░реЛрд╕реЗрд╕рдиреЗрдХреНрд╕реНрдЯ рдХреА рдмреЙрдбреА рдореЗрдВ рдПрдХ рдореИрдЪ рдмреНрд▓реЙрдХ (рдкреИрдЯрд░реНрди рдореИрдЪрд┐рдВрдЧ) рд╣реЛрддрд╛ рд╣реИред рдкреБрд╢ рдФрд░ рдкреЙрдк рдЕрдЧрд▓реЗ рдХрд╛ рдкрд░реНрдпрд╛рдпрд╡рд╛рдЪреА рд╢рдмреНрдж рд╣реИ, рдЬрд┐рд╕рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкреНрд░рдХрд╛рд░ рдореВрд▓реНрдп рд▓реЗрддрд╛ рд╣реИред

рдирддреАрдЬрддрди, рдПрдВрдЯрд░: рд▓реЙрдЬрд┐рдХ рдХрд╛ рддрд░реНрдХ current.next рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рд╣реИ рдФрд░ рд░рд┐рдЯрд░реНрди рд╡реИрд▓реНрдпреВ рдХреЛ рдкреНрд░реЛрд╕реЗрд╕рдирдХреН рдкрд╛рд╕ рдореЗрдВ рднреЗрдЬрдирд╛ рд╣реИ, рдкреНрд░реЛрд╕реЗрдХреНрдЯ рд╕реЗ рд░рд┐рдЯрд░реНрди рдорд╛рди рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред (рдирд┐рдорд░рд▓ рдореЗрдВ рдХреЛрдИ рд░рд┐рдЯрд░реНрди рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдирд╣реАрдВ рд╣реИ , рдФрд░ рдлрд╝рдВрдХреНрд╢рди рдЕрдВрддрд┐рдо рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╕реЗ рдорд╛рди рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рдФрд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╢рд╛рдЦрд╛ рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ)
processNext рдЗрд╕рдХреЗ рдкрд╛рд╕ рджрд┐рдП рдЧрдП рдорд╛рди рдХреА рдЬрд╛рдБрдЪ рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдкреБрд╢ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╡рд╣ рдЗрд╕ рдореВрд▓реНрдп рдХреЗ рд╕рд╛рде Enter рджрд░реНрдЬ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЦреБрдж Enter рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЗ рд╕рд╛рдеред рдпрд╣ рдПрдХ рд▓реВрдк рдореЗрдВ рдкрд░рд┐рдгрд╛рдо рдХрд░рддрд╛ рд╣реИ - рдЬрдм рддрдХ рдХреЙрд▓рдмреИрдХ рдкреЙрдк рд╡рд╛рдкрд╕ рдирд╣реАрдВ рдЖрддрд╛ рд╣реИ, рддрдм рддрдХ рдореМрдЬреВрджрд╛ рдХреЙрд▓ рд╕реЗ рдПрдВрдЯрд░ рдореЗрдВ рдХреЛрдИ рдирд┐рдХрд╛рд╕ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рдпрджрд┐ рдЕрдЧрд▓рд╛ рдХрд╛ рдореВрд▓реНрдп рдкреЙрдк рд╣реИ, рддреЛ current.value рдХрд╛ рд╡рд░реНрддрдорд╛рди рдореВрд▓реНрдп рдХреЙрд▓рдмреИрдХ рд╕реЗ рдмрдВрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдЬрдмрдХрд┐ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдЕрдиреБрдХреВрд▓ рд╣реА рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХрдИ рдмрд╛рд░ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рд╣реЛ рд╕рдХрддреА рд╣реИ)ред

рдирддреАрдЬрддрди, рд╣рдореЗрдВ рдПрдХ рдФрд░ рдХрдореА рдорд┐рд▓рддреА рд╣реИ: рдпрджрд┐ рдкреЙрдк рд╕реНрдЯреИрдХ рд╕реЗ рдЕрдВрддрд┐рдо рдорд╛рди рд▓реЗрддрд╛ рд╣реИ рдФрд░ рд╕реНрдЯреИрдХ рдЦрд╛рд▓реА рд╣реИ, рддреЛ рджрд░реНрдЬ рдХрд░реЗрдВ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛрдб рдореЗрдВ рд╡рд╣ рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рдПрдЧрд╛ рдЬреЛ рдЕрдВрддрд┐рдо рдкреЙрдк рд╡рд╛рдкрд╕ рдЖ рдЧрдпрд╛ред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╕реНрдЯреИрдХ рдХреЗ рдирд┐рдЪрд▓реЗ рдореВрд▓реНрдп рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдПрдХ рдЕрд▓рдЧ рдЪрдХреНрд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдЙрдкрдпреЛрдЧ рдХреЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ, рд╣рдо рд░рд┐рд╡рд░реНрд╕ рдкреЛрд▓рд┐рд╢ рдиреЛрдЯреЗрд╢рди рдореЗрдВ рдПрдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреА рдЧрдгрдирд╛ рд▓реЗрддреЗ рд╣реИрдВред

 def items = "7 2 3 * -".Split(array[' ']); mutable currentPosition = 0; def processNextToken(){ def action(operation : double * double -> double){ StackAction.Pop(fun(y){ StackAction.Pop(fun(x){ StackAction.Push(operation(x, y), processNextToken); }); }); } if(currentPosition >= items.Length){ StackAction.Pop(fun(x){ StackAction.Push(x, fun(){throw Exception("Bad input, not enough operations.")}); }); }else{ currentPosition++; mutable value : double; match(items[currentPosition-1]){ | strVal when (Double.TryParse(strVal, out value)) => StackAction.Push(value, processNextToken); | "+" => action(_ + _); | "-" => action(_ - _); | "/" => action(_ / _); | "*" => action(_ * _); | token => throw Exception($"bad token $token"); } } } def calc(current : StackAction[double]){ match(current){ | StackAction.Push (_, next) when (next == processNextToken) => calc(StackStack.Enter(current :> StackAction[double].Push)); | StackAction.Push (res, _) => WriteLine($"Result = $res"); | StackAction.Pop => throw Exception("Bad input, not enough arguments."); } } calc(processNextToken()); 


рдЕрдВрдд рд╕реЗ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╡рд┐рд╡рд░рдг:
рдХреИрд▓реНрдХ рд╕реНрдЯреИрдХ рдХреЗ рдиреАрдЪреЗ рдХреЗ рддрддреНрд╡ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рддрд░реНрдХ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ: рдпрджрд┐ рдкреБрд╢ рдкреНрд░рдХреНрд░рд┐рдпрд╛-рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рд╕рд╛рде рдмрд╛рд╣рд░ рдЧрд┐рд░ рдЧрдпрд╛ рддреЛрдХреЙрдЯреЗрди рдХреЙрд▓рдмреИрдХ рдХрд░рддрд╛ рд╣реИ, рд╣рдо рдлрд┐рд░ рд╕реЗ рдХреИрд▓реНрдХ рдХрд╣рддреЗ рд╣реИрдВ, рдпрджрд┐ рдкреБрд╢ рдПрдХ рдФрд░ рдХреЙрд▓рдмреИрдХ (рдордЬреЗрджрд╛рд░) (рдЕрдкрд╡рд╛рдж рдлреЗрдВрдХ ("рдмреБрд░рд╛ рдЗрдирдкреБрдЯ, рдкрд░реНрдпрд╛рдкреНрдд рд╕рдВрдЪрд╛рд▓рди рдирд╣реАрдВ") рдХреЗ рд╕рд╛рде рдЧрд┐рд░ рдЧрдпрд╛, рддреЛ рдкреВрд░рд╛ рд░рд┐рдХреЙрд░реНрдб рд╕рдВрд╕рд╛рдзрд┐рдд рд╣реИред рдФрд░ рдлрд╝рдВрдХреНрд╢рди рдиреЗ рдЕрдВрддрд┐рдо рдкрд░рд┐рдгрд╛рдо рд▓реМрдЯрд╛ рджрд┐рдпрд╛ред рдпрджрд┐ рдкреЙрдк рдмрд╛рд╣рд░ рдЧрд┐рд░ рдЧрдпрд╛, рддреЛ рдЕрдВрддрд┐рдо рдХрд╛рд░реНрд░рд╡рд╛рдИ рдореЗрдВ рдкрд░реНрдпрд╛рдкреНрдд рддрд░реНрдХ рдирд╣реАрдВ рдереЗред

processNextToken рдХреНрд░рдо рдореЗрдВ рдЯреЛрдХрди рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рд░рд┐рдХреЙрд░реНрдб рдХрд╛ рдЕрдВрдд рдкрд╣реБрдБрдЪ рдЧрдпрд╛ рд╣реИ, рддреЛ рд╕реНрдЯреИрдХ рд╕реЗ рдЕрдВрддрд┐рдо рдорд╛рди рд▓реЗрдВ рдФрд░ рдЗрд╕реЗ рдХреИрд▓реНрдХ рдкрд░ рд▓реМрдЯрд╛ рджреЗрдВред рдпрджрд┐ рд╕реНрдЯреИрдХ рдкрд░ 1 рд╕реЗ рдЕрдзрд┐рдХ рдорд╛рди рд╣реИ, рддреЛ рдЕрдирд╛рдо рдлрд╝рдВрдХреНрд╢рди рдордЬрд╝рд╛ () {рдереНрд░реЛ рдПрдХреНрд╕рд╕реЗрдкреНрд╢рди ("рдЦрд░рд╛рдм рдЗрдирдкреБрдЯ, рдкрд░реНрдпрд╛рдкреНрдд рд╕рдВрдЪрд╛рд▓рди рдирд╣реАрдВред")} рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛ред рдпрджрд┐ рдЕрдзрд┐рдХ рдЯреЛрдХрди рд╣реИрдВ, рддреЛ рд╡рд░реНрддрдорд╛рди рдХреЛ рд▓реЗрдВред рд╣рдо рд╕реНрдЯреИрдХ рдкрд░ рдПрдХ рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рд╢рд╛рдмреНрджрд┐рдХ рдбрд╛рд▓рддреЗ рд╣реИрдВ, рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреЗ рд▓рд┐рдП рдЬрд┐рд╕реЗ рд╣рдо рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХрд╣рддреЗ рд╣реИрдВред рд░рд┐рдХреЙрд░реНрдбреНрд╕ _ + _ - рд╡рд┐рд╢реЗрд╖ рдореИрдЬрд┐рдХ рдиреЗрдорд╛рд░рд▓ - рдЖрдВрд╢рд┐рдХ рдирд┐рд╖реНрдкрд╛рджрдиред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рдЕрдВрдХрдЧрдгрд┐рддреАрдп рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЛ рджреЛ рддрд░реНрдХреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рдмрджрд▓ рджреЗрддрд╛ рд╣реИред

рд╕реНрдЯреИрдХ рд╕реЗ рдХрд╛рд░реНрд░рд╡рд╛рдИ 2 рдорд╛рди рд▓реЗрддреА рд╣реИ, рдЗрд╕рдХреЗ рдкрд╛рд╕ рджрд┐рдП рдЧрдП рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдФрд░ рд╕реНрдЯреИрдХ рдкрд░ рдкрд░рд┐рдгрд╛рдо рдбрд╛рд▓рддрд╛ рд╣реИред

рдмрд╣реБрдд рдЙрд▓рдЭрди рд╕рд╣реА рд╣реИ? рдЖрдк рд╕рд╛рдорд╛рдиреНрдп рд╕реНрдЯреИрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд╕рд╛рде рдПрдХ рд╡рд░реНрдЧ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдпрджрд┐ рдЖрдк рдПрдХ рд╕реНрдЯреИрдХ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдореВрд▓реНрдпреЛрдВ рдХреЛ рджреВрд╕рд░реЗ рдзрд╛рдЧреЗ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИред

 enum Action{ | Push | Pop } public class StackEmptyException : Exception{ public this(message : string){ base(message); } } public class ThreadStack[T] : IDisposable{ class Resident{ public mutable volatile action : Action; public mutable volatile value : T; public mutable volatile exception : Exception; public syncIn = AutoResetEvent(false); public syncOut = AutoResetEvent(false); public start() : void{ exception = null; try{ mutable current = next(); while(true){ match(current){ | act is StackAction[T].Push => current = StackStack.Enter(act : StackAction[T].Push); | StackAction.Pop => throw StackEmptyException("Stack is empty"); } } }catch{ | e => {exception = e; _ = syncOut.Set();} } } next() : StackAction[T]{ _ = syncOut.Set(); _ = syncIn.WaitOne(); match(action){ | Push => StackAction.Push(value, next); | Pop => StackAction.Pop(fun(x){ value = x; next();}); } } } private resident : Resident = Resident(); private thread : Thread; public this(){ thread = Thread(ThreadStart(resident.start)); thread.Start(); } public Dispose() : void implements IDisposable.Dispose { try{ thread.Abort(); _ = resident.syncIn.Set(); thread.Join(); (resident.syncIn : IDisposable).Dispose(); (resident.syncOut : IDisposable).Dispose(); }finally{} } private checkException() : void{ when(resident.exception != null) { throw resident.exception; } } private exec() : void{ _ = resident.syncIn.Set(); _ = resident.syncOut.WaitOne(); checkException(); } public Push(val : T) : void{ resident.value = val; resident.action = Action.Push; exec(); } public Pop() : T{ resident.action = Action.Pop; exec(); resident.value; } } 


рдФрд░ рдпрджреНрдпрдкрд┐ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдХреЛрдб рд╣реИ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕реНрдкрд╖реНрдЯ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ C # рдЬрд╛рдирддреЗ рд╣реИрдВред рдХреЗрд╡рд▓ рдПрдХ рдЪреАрдЬ: "_ =" рдирд┐рд░реНрдорд╛рдг рд╕рдВрдХрд▓рдХ рдХреЛ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рд╣рдо рд╡рд╛рдкрд╕реА рдореВрд▓реНрдп рдХреА рдЙрдкреЗрдХреНрд╖рд╛ рдХрд░рддреЗ рд╣реИрдВред

рдФрд░ рдпрд╣рд╛рдБ рдПрдХ рд╣реА рд░рд┐рд╡рд░реНрд╕ рдкреЛрд▓рд┐рд╢ рдиреЛрдЯреЗрд╢рди рд╣реИ:
 def items = "7 2 3 * -".Split(array[' ']); mutable currentPosition = 0; mutable stack : ThreadStack[double]; try{ stack = ThreadStack(); mutable onStack = 0; def execOperation(operation : double * double -> double){ def y = stack.Pop(); def x = stack.Pop(); stack.Push(operation(x, y)); onStack--; } currentPosition = 0; while(currentPosition < items.Length){ currentPosition++; mutable value : double; match(items[currentPosition-1]){ | strVal when (Double.TryParse(strVal, out value)) => { onStack++; stack.Push(value);} | "+" => execOperation(_ + _); | "-" => execOperation(_ - _); | "/" => execOperation(_ / _); | "*" => execOperation(_ * _); | token => throw Exception($"bad token $token"); } } when(onStack > 1){ throw Exception("Bad input, not enough operations."); } WriteLine("Result: " + stack.Pop()); }catch{ | e is StackEmptyException => throw Exception("Bad input, not enough arguments."); }finally{ stack.Dispose(); } 


рдФрд░ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рд▓реЗрдЦ рдХреЛ рдПрдХ рдирд┐рд╖реНрдХрд░реНрд╖ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ: рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдПрдХ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рднрд╛рд╖рд╛ рдореЗрдВ рдРрд╕реА рд╡рд┐рдХреГрддрд┐рдпрд╛рдВ рдХрд╛рдлреА рдХреИрдкреЗрд╕рд┐рдЯрд┐рд╡ рдФрд░ рд╕рдордЭрдиреЗ рдпреЛрдЧреНрдп рд╣реИрдВ (рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЙрдирдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рдХреМрд╢рд▓ рд╣реИ)ред рдЕрдирд┐рд╡рд╛рд░реНрдп рд╢реИрд▓реА рдХреНрд░рд┐рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА рдЕрдкреНрд░рд╕реНрддреБрдд рдкрд╛рдардХ рдХреЗ рд▓рд┐рдП рд╕реНрдкрд╖реНрдЯ рд╣реИред

Source: https://habr.com/ru/post/In178311/


All Articles