;;; -*- 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)))))