;;; -*- Mode:Lisp; Readtable:CL; Package:USER; Base:10; Patch-File:T -*-
;;; Patch file for System version 130.9
;;; Reason:
;;;  Optimize (COERCE x 'RATIONAL) into (RATIONAL X).  This also avoids
;;;  foolish compiler warnings compiling such forms.  Note that calls in the
;;;  form (COERCE X '(RATIONAL ...)) are not optimized.
;;; Written 21-Nov-88 18:16:14 by keith (Keith Corbett) at site Gigamos Cambridge
;;; while running on Breaking Glass from band 3
;;; with Experimental System 130.7, Experimental ZWEI 128.7, Experimental ZMail 75.0, Experimental Local-File 77.0, Experimental File-Server 26.0, Experimental Unix-Interface 16.0, Experimental Tape 27.0, Experimental Lambda-Diag 19.0, Microcode 1762, SDU Boot Tape 3.14, SDU ROM 103, 11/18 Falcon System Loaded.



; From modified file DJ: L.SYS; TYPES.LISP#110 at 21-Nov-88 18:16:16
#10R SYSTEM-INTERNALS#: 
(COMPILER-LET ((*PACKAGE* (PKG-FIND-PACKAGE "SYSTEM-INTERNALS")))
  (COMPILER::PATCH-SOURCE-FILE "SYS: SYS; TYPES  "

(defun coerce-optimizer (form)
  (let (frob type canon)
    (cond ((not (list-match-p form `(coerce ,frob ',type)))
	   form)
	  (t
	   (setq canon (type-canonicalize type nil nil))
	   (case (if (atom canon) canon (car canon))
	     (list
	      (once-only (frob)
		`(if (consp ,frob) ,frob (coerce-to-list ,frob))))
	     (short-float `(small-float ,frob))	;not strictly correct, since works on complex
	     (single-float `(float ,frob))	;ditto
	     (float
	      (once-only (frob)			;ditto
		`(if (small-floatp ,frob) ,frob (float ,frob))))
	     ((t) frob)
	     (cl:character `(cl:character ,frob))
	     (complex
	      (if (memq (cadr-safe canon) '(nil *))
		  (once-only (frob)
		    `(if (complexp ,frob) ,frob
		       (complex frob)))
		(once-only (frob)
		  `(if (complexp ,frob)
		       (%complex-cons (coerce (%complex-real-part ,frob) ',(cadr canon))
				      (coerce (%complex-imag-part ,frob) ',(cadr canon)))
		     (complex (coerce ,frob ',(cadr canon)))))))
	     (rational
	      (if (consp canon) form `(rational ,frob)))
	     (array
	      `(coerce-to-vector
		 ,frob
		 ',(array-type-from-element-type
		     (if (atom canon) t (cadr canon)))
		 nil))
	     (simple-array
	      `(coerce-to-vector
		 ,frob
		 ',(array-type-from-element-type
		     (if (atom canon) t (cadr canon)))
		 t))
	     (t (compiler::warn 'compiler::bad-coerce :improbable
				"Do not know how to coerce to type ~S" type)
		form))))))

))
