;;; -*-  Mode: Lisp; Package: Maxima; Syntax: Common-Lisp; Base: 10 -*- ;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


(in-package :maxima)
(macsyma-module nforma)

(declare-top (special 1//2 -1//2 displayp aliaslist in-p))

(setq in-p nil)


(defmvar $format_for_numbers nil)  ;; default

;; hacks by RJF
;;  format_for_numbers:  "~R"   will make 23 print like twenty-three
;;  format_for_numbers:  "~@R"   will make 23 print like XXIII

;; In general, format_for_numbers should remain nil  (false in Maxima)
;; because nformat is used by other programs that do not like to see
;; strings like "123" instead of numbers like 123.

(defun format-num (form) 
  (if $format_for_numbers (format nil $format_for_numbers form) form))

(defmfun nformat (form)
  (cond ((atom form)
	 (cond ((and (numberp form) (minusp form)) (list '(mminus) (nformat (- form))))
	       ((floatp form)
		(format-num form))
	       ((numberp form) form)
	       ((eq t form) (if in-p t '$true))
	       ((eq nil form) (if in-p nil '$false))
	       ((and displayp (car (assqr form aliaslist))))
	       ;;	       (($EXTENDP FORM)
	       ;;		(NFORMAT (transform-extends form)))
	       (t form)))
	((atom (car form))
	 form)
	((null (cdar form)) form)
	(t (setf formatter (get (caar form) 'format-prog))
	   (cond (formatter(funcall formatter form))
		 (t form)))))

(setf (get 'rat 'format-prog) 
  #'(lambda(form)
   (cond ((minusp (cadr form))
		(list '(mminus) (list '(rat) (- (cadr form)) (caddr form))))
	 (t (cons '(rat) (cdr form)))))) ;make a copy? RJF 6/09

(setf (get 'macroexpanded 'format-prog) #'(lambda(form) (nformat (caddr form))))

(setf (get 'mplus  'format-prog) 'form-mplus)
(setf (get 'mtimes 'format-prog) 'form-mtimes)
(setf (get 'mexpt  'format-prog) 'form-mexpt)
(setf (get 'mrat   'format-prog) 'form-mrat)
(setf (get 'mpois  'format-prog) #'(lambda(form)(nformat ($outofpois form))))
(setf (get 'bigfloat   'format-prog) 
  #'(lambda(form)
      (if (minusp (cadr form))
	  (list '(mminus) (list (car form) (- (cadr form)) (caddr form)))
	(cons (car form) (cdr form)))))