How to print a list as a matrix in Common Lisp

I work in Common Lisp trying to make a tweeter for Windows.

I have a list (1 1 1 2 2 2 3 3 3) and you want to print the same matrix

 (1 1 1 2 2 2 3 3 3) 

How to do it?

Edit

I'm at the beginning

 (format t "Input width:") (setf width (read)) (format t "Input height:") (setf height (read)) (format t "How many mines:") (setf brMina (read)) (defun matrica (ij) (cond ((= 0 i) '()) (t (append (vrsta j) (matrica (1- i) j) )))) (setf minefield (matrica width height)) (defun stampaj () (format t "~%~a" minefield )) 
+6
source share
2 answers

Another example: using a beautiful printer for fun:

 (defun print-list-as-matrix (list elements-per-row &optional (cell-width (1+ (truncate (log (apply #'max list) 10))))) (let ((*print-right-margin* (* elements-per-row (1+ cell-width))) (*print-miser-width* nil) (*print-pretty* t) (format-string (format nil "~~< ~~@ {~~~ad~~^ ~~} ~~@ :>~%" cell-width))) (format t format-string list))) 

It works as follows:

 CL-USER> (print-list-as-matrix (loop for i from 1 to 9 collect i) 3) 1 2 3 4 5 6 7 8 9 NIL CL-USER> (print-list-as-matrix (loop for i from 1 to 25 collect i) 5) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 NIL CL-USER> (print-list-as-matrix (loop for i from 1 to 16 collect i) 2) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 
+4
source

Like this:

 (defun print-list-as-grid (list rows cols) (assert (= (length list) (* rows cols)) (loop for row from 0 below rows do (loop for col from 0 below cols do (princ (car list)) (princ #\space) (setf list (cdr list))) (princ #\newline))) * (print-list-as-grid '(abcdefghi) 3 3) ABCDEFGHI NIL 
+2
source

Source: https://habr.com/ru/post/944815/


All Articles