Welcome to the Parallax Discussion Forums, sign-up to participate.
CON _clkmode = xtal1 + pll16x _xinfreq = 5_000_000 SIZE = 4 VAR byte array[SIZE + 1] OBJ sio: "Parallax Serial Terminal" PUB start | i sio.start(9600) bytemove(@array, string("ABCDEFGHIJKLMNOPQRSTUVWXYZ"), SIZE) generate(@array, SIZE) PUB generate(addr, len) | i if (len == 1) show(addr) else repeat i from 0 to len - 1 generate(addr, len - 1) if (len & 1) swap(addr, 0, len - 1) else swap(addr, i, len - 1) PRI factorial(n) result := 1 repeat n result *= (n--) PRI swap(addr, i, j) | t t := byte[addr][i] byte[addr][i] := byte[addr][j] byte[addr][j] := t PRI show(addr) sio.str(addr) sio.char(13)
ABCD BACD CABD ACBD BCAD CBAD DBCA BDCA CDBA DCBA BCDA CBDA DACB ADCB CDAB DCAB ACDB CADB DABC ADBC BDAC DBAC ABDC BADC
CON _clkmode = xtal1 + pll16x _xinfreq = 5_000_000 SIZE = 4 VAR byte array[SIZE + 1], need, ready long stack[SIZE * 10] OBJ sio: "Parallax Serial Terminal" PUB start | i sio.start(9600) bytemove(@array, string("ABCDEFGHIJKLMNOPQRSTUVWXYZ"), SIZE) cognew(generate(@array, SIZE), @stack) repeat factorial(SIZE) need~~ repeat until ready sio.str(@array) sio.char(13) ready~ PUB generate(addr, len) | i repeat if (len == 1) repeat until need need~ ready~~ repeat while ready else repeat i from 0 to len - 1 generate(addr, len - 1) if (len & 1) swap(addr, 0, len - 1) else swap(addr, i, len - 1) PRI factorial(n) result := 1 repeat n result *= (n--) PRI swap(addr, i, j) | t t := byte[addr][i] byte[addr][i] := byte[addr][j] byte[addr][j] := t PRI show(addr) sio.str(addr) sio.char(13)
CON _clkmode = xtal1 + pll16x _xinfreq = 5_000_000 SIZE = 4 VAR byte array[SIZE + 1] long stack[SIZE * 10] OBJ sio: "Parallax Serial Terminal" PUB start | i sio.start(9600) bytemove(@array, string("ABCDEFGHIJKLMNOPQRSTUVWXYZ"), SIZE) begin(generate(@array, SIZE), @stack) repeat factorial(SIZE) sio.str(@array) sio.char(13) resume(generate) PUB generate(addr, len) | i repeat if (len == 1) pause else repeat i from 0 to len - 1 generate(addr, len - 1) if (len & 1) swap(addr, 0, len - 1) else swap(addr, i, len - 1) PRI factorial(n) result := 1 repeat n result *= (n--) PRI swap(addr, i, j) | t t := byte[addr][i] byte[addr][i] := byte[addr][j] byte[addr][j] := t PRI show(addr) sio.str(addr) sio.char(13)
Comments
Pause is usually called yield. It should accept an argument that is returned by the calling resume, and resume should take an argument that is returned by the yield that execution resumes at.
EDIT: grammar