Oops, I realise that I forgot to include the definition of disploop. Here it is:
∇N disploop S →(N=0)/0 next: S←next S disp ← '.#'[1+S] ⎕DL ÷4 N←N-1 →next ∇ Regards, Elias On 20 February 2014 01:01, Elias Mårtenson <loke...@gmail.com> wrote: > As I mentioned previously, I've been playing around with Game of Life, and > I wrote my own. When I try to put this code in a loop, I get array > corruption, and subsequently a crash (as I mentioned earlier) when I try to > )SAVE the workspace. > > Here is the code. I start by creating a 5×5 field and initialise it with a > blinker: > > D←5 5 ⍴ 0 > D[2 3 4;3]←1 > > > I then define the function next which calculates the next generation, > based on the one passed in as argument: > > ∇Z←next D;N > N ← (↑+/, ¯1 0 1∘.⊖ ¯1 0 1⌽¨⊂D) - D > Z ← (3≠2 3⍳N×D) ∨ 3=N×~D > ∇ > > > Then create a function that repeatedly calls next on an array and formats > the resulting field to an array called disp. This variable is the one > that is displayed in the Emacs buffer (for this example, there is no need > to use that). > > I then try to run 10 generations on D which results in a very unexpected > error: > > *10 disploop D* > INDEX ERROR > disploop[4] disp←'.#'[1+S] > > > After this, I can also display the content of S which is clearly wrong: > > *8⎕CR S* > ┌→────────────┐ > │2 ┌→────────┐│ > │ ↓0 0 0 0 0││ > │ │0 0 1 0 0││ > │ │0 0 1 0 0││ > │ │0 0 1 0 0││ > │ │0 0 0 0 0││ > │ └─────────┘│ > └∊────────────┘ > > > By the way, shouldn't S be local to the function disploop? Why is it > visible at all here? > > If I run this manually, outside of disploop, this does not happen. > > Finally, I try to )SAVE this workspace, and I get the same error as > before: > > Assertion failed: sub_idx < values.size() > in Function: save > in file: Archive.cc:743 > > Call stack: > > ---------------------------------------- > -- Stack trace at Archive.cc:743 > ---------------------------------------- > 0x7fe1efa06de5 __libc_start_main > 0x434275 main > 0x51cced Workspace::immediate_execution(bool) > 0x46173d Command::process_line() > 0x46139f Command::process_line(UCS_string&) > 0x51ffda Workspace::save_WS(std::ostream&, std::vector<UCS_string, > std::allocator<UCS_string> >&) > 0x4404a4 XML_Saving_Archive::save() > 0x4428ef do_Assert(char const*, char const*, char const*, int) > ======================================== > > SI stack: > > Depth: 1 > Exec: 0x7fe1cc000ea8 > Pmode: ∇ disploop[4] > PC: 20 ← > Stat: disp ← '.#'[1+S] > err_code: 0x50005 > thrown: at Value.cc:1033 > e_msg_1: 'INDEX ERROR' > e_msg_2: 'disploop[4] disp←'.#'[1+S]' > e_msg_3: ' ^ ^' > > Depth: 0 > Exec: 0x20578f0 > Pmode: ◊ 10 disploop D > PC: 3 ENDL > Stat: 10 disploop D > err_code: 0x0 > thrown: at StateIndicator.cc:39 > e_msg_1: 'No Error' > e_msg_2: '' > e_msg_3: '' > > > > ============================================================================== > *** immediate_execution() caught other exception *** > > > Regards, > Elias >