spiral(n) := block([a, i, j, k, p, di, dj, vi, vj, imin, imax, jmin, jmax], a: zeromatrix(n, n), vi: [1, 0, -1, 0], vj: [0, 1, 0, -1], imin: 0, imax: n, jmin: 1, jmax: n + 1, p: 1, di: vi[p], dj: vj[p], i: 1, j: 1, for k from 1 thru n*n do ( a[j, i]: k, i: i + di, j: j + dj, if i < imin or i > imax or j < jmin or j > jmax then ( i: i - di, j: j - dj, p: mod(p, 4) + 1, di: vi[p], dj: vj[p], i: i + di, j: j + dj, if p = 1 then imax: imax - 1 elseif p = 2 then jmax: jmax - 1 elseif p = 3 then imin: imin + 1 else jmin: jmin + 1 ) ), a )$ spiral(5); /* matrix([ 1, 2, 3, 4, 5], [16, 17, 18, 19, 6], [15, 24, 25, 20, 7], [14, 23, 22, 21, 8], [13, 12, 11, 10, 9]) */