1 //: Phase 3: Start running a loaded and transformed recipe. 2 //: 3 //: The process of running Mu code: 4 //: load -> transform -> run 5 //: 6 //: So far we've seen recipes as lists of instructions, and instructions point 7 //: at other recipes. To kick things off Mu needs to know how to run certain 8 //: 'primitive' recipes. That will then give the ability to run recipes 9 //: containing these primitives. 10 //: 11 //: This layer defines a skeleton with just two primitive recipes: IDLE which 12 //: does nothing, and COPY, which can copy numbers from one memory location to 13 //: another. Later layers will add more primitives. 14 15 :(scenario copy_literal) 16 def main [ 17 1:num <- copy 23 18 ] 19 +run: {1: "number"} <- copy {23: "literal"} 20 +mem: storing 23 in location 1 21 22 :(scenario copy) 23 def main [ 24 1:num <- copy 23 25 2:num <- copy 1:num 26 ] 27 +run: {2: "number"} <- copy {1: "number"} 28 +mem: location 1 is 23 29 +mem: storing 23 in location 2 30 31 :(scenario copy_multiple) 32 def main [ 33 1:num, 2:num <- copy 23, 24 34 ] 35 +mem: storing 23 in location 1 36 +mem: storing 24 in location 2 37 38 :(before "End Types") 39 // Book-keeping while running a recipe. 40 //: Later layers will replace this to support running multiple routines at once. 41 struct routine { 42 recipe_ordinal running_recipe; 43 int running_step_index; 44 routine(recipe_ordinal r) :running_recipe(r), running_step_index(0) {} 45 bool completed() const; 46 const vector<instruction>& steps() const; 47 }; 48 49 :(before "End Globals") 50 routine* Current_routine = NULL; 51 :(before "End Reset") 52 Current_routine = NULL; 53 54 :(code) 55 void run(const recipe_ordinal r) { 56 routine rr(r); 57 Current_routine = &rr; 58 run_current_routine(); 59 Current_routine = NULL; 60 } 61 62 void run_current_routine() { 63 pre { line-height: 125%; } td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } .highlight .hll { background-color: #ffffcc } .highlight .c { color: #888888 } /* Comment */ .highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */ .highlight .k { color: #008800; font-weight: bold } /* Keyword */ .highlight .ch { color: #888888 } /* Comment.Hashbang */ .highlight .cm { color: #888888 } /* Comment.Multiline */ .highlight .cp { color: #cc0000; font-weight: bold } /* Comment.Preproc */ .highlight .cpf { color: #888888 } /* Comment.PreprocFile */ .highlight .c1 { color: #888888 } /* Comment.Single */ .highlight .cs { color: #cc0000; font-weight: bold; background-color: #fff0f0 } /* Comment.Special */ .highlight .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */ .highlight .ge { font-style: italic } /* Generic.Emph */ .highlight .ges { font-weight: bold; font-style: italic } /* Generic.EmphStrong */ .highlight .gr { color: #aa0000 } /* Generic.Error */ .highlight .gh { color: #333333 } /* Generic.Heading */ .highlight .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */ .highlight .go { color: #888888 } /* Generic.Output */ .highlight .gp { color: #555555 } /* Generic.Prompt */ .highlight .gs { font-weight: bold } /* Generic.Strong */ .highlight .gu { color: #666666 } /* Generic.Subheading */ .highlight .gt { color: #aa0000 } /* Generic.Traceback */ .highlight .kc { color: #008800; font-weight: bold } /* Keyword.Constant */ .highlight .kd { color: #008800; font-weight: bold } /* Keyword.Declaration */ .highlight .kn { color: #008800; font-weight: bold } /* Keyword.Namespace */ .highlight .kp { color: #008800 } /* Keyword.Pseudo */ .highlight .kr { color: #008800; font-weight: bold } /* Keyword.Reserved */ .highlight .kt { color: #888888; font-weight: bold } /* Keyword.Type */ .highlight .m { color: #0000DD; font-weight: bold } /* Literal.Number */ .highlight .s { color: #dd2200; background-color: #fff0f0 } /* Literal.String */ .highlight .na { color: #336699 } /* Name.Attribute */ .highlight .nb { color: #003388 } /* Name.Builtin */ .highlight .nc { color: #bb0066; font-weight: bold } /* Name.Class */ .highlight .no { color: #003366; font-weight: bold } /* Name.Constant */ .highlight .nd { color: #555555 } /* Name.Decorator */ .highlight .ne { color: #bb0066; font-weight: bold } /* Name.Exception */ .highlight .nf { color: #0066bb; font-weight: bold } /* Name.Function */ .highlight .nl { color: #336699; font-style: italic } /* Name.Label */ .highlight .nn { color: #bb0066; font-weight: bold } /* Name.Namespace */ .highlight .py { color: #336699; font-weight: bold } /* Name.Property */ .highlight .nt { color: #bb0066; font-weight: bold } /* Name.Tag */ .highlight .nv { color: #336699 } /* Name.Variable */ .highlight .ow { color: #008800 } /* Operator.Word */ .highlight .w { color: #bbbbbb } /* Text.Whitespace */ .highlight .mb { color: #0000DD; font-weight: bold } /* Literal.Number.Bin */ .highlight .mf { color: #0000DD; font-weight: bold } /* Literal.Number.Float */ .highlight .mh { color: #0000DD; font-weight: bold } /* Literal.Number.Hex */ .highlight .mi { color: #0000DD; font-weight: bold } /* Literal.Number.Integer */ .highlight .mo { color: #0000DD; font-weight: bold } /* Literal.Number.Oct */ .highlight .sa { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Affix */ .highlight .sb { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Backtick */ .highlight .sc { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Char */ .highlight .dl { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Delimiter */ .highlight .sd { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Doc */ .highlight .s2 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Double */ .highlight .se { color: #0044dd; background-color: #fff0f0 } /* Literal.String.Escape */ .highlight .sh { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Heredoc */ .highlight .si { color: #3333bb; background-color: #fff0f0 } /* Literal.String.Interpol */ .highlight .sx { color: #22bb22; background-color: #f0fff0 } /* Literal.String.Other */ .highlight .sr { color: #008800; background-color: #fff0ff } /* Literal.String.Regex */ .highlight .s1 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Single */ .highlight .ss { color: #aa6600; background-color: #fff0f0 } /* Literal.String.Symbol */ .highlight .bp { color: #003388 } /* Name.Builtin.Pseudo */ .highlight .fm { color: #0066bb; font-weight: bold } /* Name.Function.Magic */ .highlight .vc { color: #336699 } /* Name.Variable.Class */ .highlight .vg { color: #dd7700 } /* Name.Variable.Global */ .highlight .vi { color: #3333bb } /* Name.Variable.Instance */ .highlight .vm { color: #336699 } /* Name.Variable.Magic */ .highlight .il { color: #0000DD; font-weight: bold } /* Literal.Number.Integer.Long */; a screen is an array of pointers to lines, in turn arrays of characters (function new-screen [ (default-space:space-address <- new space:literal 30:literal) (nrows:integer <- next-input) (ncols:integer <- next-input) (result:screen-address <- new screen:literal nrows:integer) (rowidx:integer <- copy 0:literal) { begin (curr-line-address-address:line-address-address <- index-address result:screen-address/deref rowidx:integer) (curr-line-address-address:line-address-address/deref <- new line:literal ncols:integer) (curr-line-address:line-address <- copy curr-line-address-address:line-address-address/deref) (rowidx:integer <- add rowidx:integer 1:literal) (x:boolean <- not-equal rowidx:integer nrows:integer) (loop-if x:boolean) } (reply result:screen-address) ])