File: foptim.mc

package info (click to toggle)
maxima 5.6-17
  • links: PTS
  • area: main
  • in suites: woody
  • size: 30,572 kB
  • ctags: 47,715
  • sloc: ansic: 154,079; lisp: 147,553; asm: 45,843; tcl: 16,744; sh: 11,057; makefile: 7,198; perl: 1,842; sed: 334; fortran: 24; awk: 5
file content (74 lines) | stat: -rw-r--r-- 2,254 bytes parent folder | download | duplicates (3)
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
;;; -*- LISP -*-
;;; Auxiliary routines for OPTIMIZE'ing
;;;
;;; Created by KMP 8:23pm  Friday, 23 February 1979

;;; Syntax is:
;;;
;;;  FOPTIMIZE(A,B,[C,D],[Q]...);
;;;
;;; Elements of the arg list with different forms do different things:
;;;
;;; [1] If an arg is an ATOM, then its function will be redefined with the 
;;;	optimized form.
;;;
;;; [2] If the arg is a 1-length List, then the function named in the list
;;;     will be optimized, and the optimized LAMBDA will be returned.
;;;
;;; [3] If the arg is a 2-length list, then the function named by its
;;;	first arg will be optimized and given the name of the second 
;;;	element of the list.
;;;

;;; Compiler Declarations

(DECLARE (*FEXPR $FOPTIMIZE)
	 (*EXPR $OPTIMIZE STRIPDOLLAR MGET MPUTPROP))

;;; $FOPTIMIZE is the name of the driver that gets called from Macsyma

(DEFUN $FOPTIMIZE FEXPR (X) (CONS (NCONS 'MLIST) (MAPCAR 'FOPTIMIZE X)))

;;; FOPTIMIZE is the function that does the work.
;;;  It does type checking but will only do interesting things with
;;;  ATOMS or MLIST's one or two long. 

(DEFUN FOPTIMIZE (X)
       (COND ((SYMBOLP X)
	      (*CATCH 'FOPTIMIZE-NO-MEXPR-DEFINITION
		      (PROGN (MPUTPROP X
				       (FOPTIMIZE-AUX (MGET X 'MEXPR) X)
				       'MEXPR)
			     X)))
	     ((OR (ATOM X)
		  (< (LENGTH X) 2.)
		  (> (LENGTH X) 3.)
		  (NOT (EQ (CAAR X) 'MLIST))
		  (NOT (SYMBOLP (CADR X)))
		  (NOT (SYMBOLP (CADDR X))))
	      (CURSORPOS 'A TYO)
	      (PRINC '|;FOPTIMIZE called on an illegal form.| TYO)
	      (ERR))
	     (T
	      (LET (((IN OUT) (CDR X)) (DEF ()))
		   (*CATCH 'FOPTIMIZE-NO-MEXPR-DEFINITION
			   (PROGN
			    (SETQ DEF (FOPTIMIZE-AUX (MGET IN 'MEXPR) IN))
			    (COND (OUT (MPUTPROP OUT DEF 'MEXPR) OUT)
				  (T   DEF))))))))

;;; FOPTIMIZE-AUX
;;;  This function is where the LAMBDA is actually optimized.

(DEFUN FOPTIMIZE-AUX (DEF NAME)
       (COND ((NOT DEF)
	      (CURSORPOS 'A TYO)
	      (PRINC '|;No function definition for | TYO)
	      (PRINC (STRIPDOLLAR NAME) TYO)
	      (PRINC '|. It will be ignored.| TYO)
	      (*THROW 'FOPTIMIZE-NO-MEXPR-DEFINITION '$FAILED)))
       (LIST (NCONS 'LAMBDA)
	     (CADR DEF)
	     ($OPTIMIZE (LIST* (NCONS 'MPROG)
			       (NCONS (NCONS 'MLIST))
			       (CDDR DEF)))))