Warning: this is an htmlized version!
The original is here, and
the conversion rules are here.
;; This file:
;;   http://anggtwu.net/MAXIMA/2025-dim-save.lisp.html
;;   http://anggtwu.net/MAXIMA/2025-dim-save.lisp
;;          (find-angg "MAXIMA/2025-dim-save.lisp")
;; Author: Eduardo Ochs <eduardoochs@gmail.com>
;;
;; (defun e () (interactive) (find-angg "MAXIMA/2025-dim-save.lisp"))
;; (find-maximamsg "59245215 202510 11" "Edrx: The results of \"dim-*\" functions look reversed - in a weird way")
;; (find-maximamsg "59245615 202510 12" "Edrx: Reversing the result of dim-* functions in the right way: some progress")
;;
;; Superseded by: (find-angg "MAXIMA/2025-testdispla.lisp")
;;
;; «.my-reverse»		(to "my-reverse")
;; «.contract-chars»		(to "contract-chars")
;; «.contract-chars-tests»	(to "contract-chars-tests")
;; «.testdispla-redef»		(to "testdispla-redef")
;; «.testdispla-redef-tests»	(to "testdispla-redef-tests")

(defvar dim-saved)

(setq dim-saved nil)

(defun dim-save (&rest plist)
  (setq dim-saved `(,@dim-saved ,(copy-tree plist)))
  plist)

(defun dim-show (&optional fmt)
  (let ((*print-pretty* nil))
    (loop for plist in dim-saved
	  do (format t (or fmt "~a~%") plist))))

(defun dim-show-S ()
  (dim-show "~S~%"))

;; «my-reverse»  (to ".my-reverse")
(defun my-reverse-nnlist (abcd)
  (let* ((a (car abcd))
	 (b (cadr abcd))
	 (cd (cddr abcd)))
    `(,a ,b ,@(my-reverse cd))))

(defun my-reverse-otherlist (list)
  (reverse (mapcar #'my-reverse list)))

(defun my-reverse (o)
  (if (listp o)
      (if (numberp (car o))
	  (my-reverse-nnlist o)
	  (my-reverse-otherlist o))
      o))

#|
* (eepitch-maxima)
* (eepitch-kill)
* (eepitch-maxima)
load("2025-dim-save.lisp");
to_lisp();
  (my-reverse '(:a (2 3 :b :c) (:d :e) :f))
  (to-maxima)

|#


;; `dimension-superscript-saving-1' saves a lot of information.
;; `dimension-superscript-saving-2' saves just the essential.

(defun dimension-superscript-saving-1 (form result)
  (dim-save :pos 1 :form form :result result)
  (let ((out (dimension-superscript form result)))
    (dim-save :pos 2 :form form :result result :out out)
    out))

(defun dimension-superscript-saving-2 (form result)
  (let ((out (dimension-superscript form result)))
    (dim-save :rev-out (my-reverse out))
    out))

(displa-def mexpt  dimension-superscript-saving-2)
(displa-def %mexpt dimension-superscript-saving-2)


#|
* (eepitch-maxima)
* (eepitch-kill)
* (eepitch-maxima)
load("2025-dim-save.lisp");
a^b;
a^bc;
ab^cd;
ab^(cd^ef);
ab^(cd^(ef[gh]));
:lisp (dim-show)

to_lisp();
  (defvar o)
  (setq o (nth 5 dim-saved))
  (setq o (getf o :out))
  (reverse o)
  (my-reverse o)

  (my-reverse '(2 3 :a :b))  
  (my-reverse '(:c (2 3 :a :b) :d))
  (numberp #\a)

  (getf '(1 2 3 4) :out)

|#


;; «contract-chars»  (to ".contract-chars")
(defun contract-chars (o)
  (cond ((null o) nil)
	((atom o) o)
	((characterp (car o))
	 (let ((chars ()))
	   (loop while (characterp (car o))
		 do (push (car o) chars)
		 do (setq o (cdr o)))
	   (cons (coerce chars 'string)
		 (contract-chars o))))
	(t (cons (contract-chars (car o))
		 (contract-chars (cdr o))))))


;; «contract-chars-tests»  (to ".contract-chars-tests")
#|
* (eepitch-maxima)
* (eepitch-kill)
* (eepitch-maxima)
load("2025-dim-save.lisp");
to_lisp();
  (defvar o)
  (setq o '(1 2 #\a #\b #\c 3 4 #\d #\e 5))
  (contract-chars o)
  (to-maxima)

|#


(defun dim-$matrix-saving (form result)
  (let ((out (dim-$matrix form result)))
    (dim-save :con-out (contract-chars out))
    out))

;; (displa-def $matrix dim-$matrix)
;; (displa-def %matrix dim-$matrix)
;; (displa-def $matrix dim-$matrix-saving)
;; (displa-def %matrix dim-$matrix-saving)

#|
* (eepitch-maxima)
* (eepitch-kill)
* (eepitch-maxima)
load("2025-dim-save.lisp");
to_lisp();
  (displa-def $matrix dim-$matrix-saving)
  (displa-def %matrix dim-$matrix-saving)
  (to-maxima)

display_matrix_brackets: false$
matrix([A],[B],[C],[D]);
matrix([Aa],[Bb],[Cc],[Dd]);
matrix([Aaa],[Bbb],[Ccb],[Ddd]);
matrix([box(a^b)]);
matrix([box(ab^cd)]);

:lisp (dim-show-S)

:lisp (d-box nil 1 2 3 nil)

matrix([a,b], [c,d]);
matrix([Aa,Bb,Ccc], [Dd,Ed,Fff]);

|#


;; «testdispla-redef»  (to ".testdispla-redef")

(setf (get '$testdispla 'dimension) 'dim-testdispla)

(defun dim-testdispla (form result)	; initial definition, for tests
  (declare (ignorable form))
  (dim-$matrix #$matrix([a,b],[c,d])$ result))

(defun testdispla-as-string ()
  (with-output-to-string (*standard-output*)
    (maxima-display #$testdispla()$)))

(defun testdispla-redef-0 (body)
  `(defun dim-testdispla (form result)
     (declare (ignorable form))
     ,body))

(defun testdispla-redef (body)
  (eval (testdispla-redef-0 body))
  (testdispla-as-string))

(defvar testdispla-inner)

(setq testdispla-inner '(dim-$matrix #$matrix([a,b],[c,d])$ result))

(defun testdispla-wrap (inner)
  `(progn (dim-save :pos 1 :form form :result result)
	  (let ((out ,inner))
	    (dim-save :pos 2 :form form :result result :out out)
	    out)))


(defclass testdispla ()
  ((form      :initarg :form      :initform #$a+b$)
   (dim       :initarg :dim       :initform nil)
   (save      :initarg :save      :initform t)
   (innersave :initarg :innersave :initform '(:form form :result result))
   ))

(defun make-testdispla (&rest args)
  (apply 'make-instance 'testdispla args))

(defmethod td-innerbody ((td testdispla))
  (with-slots (form dim) td
    (let ((dim-this (or dim (get (caar form) 'dimension))))
      `(,dim-this ',form result))))

(defmethod td-outerbody ((td testdispla))
  (with-slots (save innersave) td
    (if (not save)
	(td-innerbody td)
	`(progn (dim-save :pos 1 ,@innersave)
	  (let ((out ,(td-innerbody td)))
	    (dim-save :pos 2 ,@innersave :out out)
	    out)))))

(setf (get '$testdispla 'dimension) 'dim-testdispla)

(defmethod td-defun-dim ((td testdispla))
  `(defun dim-testdispla (form result)
     (declare (ignorable form))
     ,(td-outerbody td)))

(defmethod td-redef ((td testdispla))
  (eval (td-defun-dim td)))

(defun td-output-as-string ()
  (with-output-to-string (*standard-output*)
    (maxima-display #$testdispla()$)))


#|
** «testdispla-redef-tests»  (to ".testdispla-redef-tests")
* (eepitch-maxima)
* (eepitch-kill)
* (eepitch-maxima)
load("2025-dim-save.lisp");
to_lisp();
  (defvar mytd)
  (td-innerbody (make-testdispla))
  (td-innerbody (make-testdispla :form #$c*d$))
  (td-innerbody (make-testdispla :form #$c*d$ :dim 'dim-foo))
  (td-outerbody (make-testdispla :save nil))
  (td-outerbody (make-testdispla))
  (td-outerbody (make-testdispla :innersave '(:height height)))
  (td-defun-dim (make-testdispla))
  (td-redef     (make-testdispla))
  (td-output-as-string)

  (setq mytd (make-testdispla))
  (td-innerbody mytd)

  (setq mytd (make-instance 'testdispla))
  (setq mytd (make-instance 'testdispla :form #$a+b$))
  (setq mytd (make-instance 'testdispla :form #$a+b$ :dim 'dim-foo))
  (setq mytd (make-testdispla))
  (setq mytd (make-testdispla :form #$a+b$))
  (setq mytd (make-testdispla :form #$a+b$ :dim 'dim-foo))
  (describe mytd)
  (setq mytd (make-testdispla))
  (td-innerbody mytd)


testdispla();


to_lisp();
  (testdispla-as-string)
  (testdispla-redef-0 '(dim-$matrix #$matrix([a,b],[c,d])$ result))
  (testdispla-redef   '(dim-$matrix #$matrix([a,b],[c,d])$ result))
  (testdispla-redef   '(dim-$matrix #$matrix([2,3],[4,5])$ result))
  (testdispla-wrap testdispla-inner)
  (to-maxima)

  (dim-save :pos 1 :form form :result result)
  (let ((out (dimension-superscript form result)))
    (dim-save :pos 2 :form form :result result :out out)
    out))


|#




;; (find-maximagitfile "src/displa.lisp" ";;; BKPT")
;; (find-maximagitfile "src/displa.lisp" "(defun dim-mbox ")
;; (find-maximagitfile "src/displa.lisp" "(defun dim-mbox " "(nreverse dummy)")
;; (find-maximagitfile "src/displa.lisp" "(defun d-box ")







;; Local Variables:
;; coding:  utf-8-unix
;; End: