File tree Expand file tree Collapse file tree 1 file changed +31
-0
lines changed
Expand file tree Collapse file tree 1 file changed +31
-0
lines changed Original file line number Diff line number Diff line change @@ -763,6 +763,37 @@ impl Executor {
763763 self . stack . push ( Type :: List ( result_list) ) ;
764764 }
765765
766+ "reduce" => {
767+ let code = self . pop_stack ( ) . get_string ( ) ;
768+ let now = self . pop_stack ( ) . get_string ( ) ;
769+ let acc = self . pop_stack ( ) . get_string ( ) ;
770+ let list = self . pop_stack ( ) . get_list ( ) ;
771+
772+ for x in list. iter ( ) {
773+ self . memory
774+ . entry ( now. clone ( ) )
775+ . and_modify ( |value| * value = x. clone ( ) )
776+ . or_insert ( x. clone ( ) ) ;
777+
778+ self . evaluate_program ( code. clone ( ) ) ;
779+ let result = self . pop_stack ( ) ;
780+
781+ self . memory
782+ . entry ( acc. clone ( ) )
783+ . and_modify ( |value| * value = result. clone ( ) )
784+ . or_insert ( result) ;
785+ }
786+
787+ let result = self . memory . get ( & acc) ;
788+ self . stack
789+ . push ( result. unwrap_or ( & Type :: String ( "" . to_string ( ) ) ) . clone ( ) ) ;
790+
791+ self . memory
792+ . entry ( acc. clone ( ) )
793+ . and_modify ( |value| * value = Type :: String ( "" . to_string ( ) ) )
794+ . or_insert ( Type :: String ( "" . to_string ( ) ) ) ;
795+ }
796+
766797 // Generate a range
767798 "range" => {
768799 let step = self . pop_stack ( ) . get_number ( ) ;
You can’t perform that action at this time.
0 commit comments