Changeset 41 in CGBLisp
- Timestamp:
- Feb 1, 2009, 4:22:24 PM (15 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/infix-printer.lisp
r39 r41 18 18 (in-package "INFIX-PRINTER") 19 19 20 (proclaim '(optimize (speed 0) (debug 3))) 21 20 22 (defun infix-print-separated-list (lst sep stream op print-level 21 23 &optional (alt-op nil) (alt-sep alt-op) … … 26 28 (cond 27 29 ((endp lst) nil) 28 ((and (numberp *print-level*) (> print-level *print-level*)) 30 31 ;; Handle *print-level* 32 ((and (numberp *print-level*) 33 (> print-level *print-level*)) 29 34 (format stream "#")) 35 30 36 (t 31 (dolist (arg lst (infix-print arg stream op print-level))37 (dolist (arg lst) 32 38 (setf true-sep sep) 33 39 (incf count) 34 (when (and alt-op (> count 1) (consp arg) (eq alt-op (car arg))) 35 (setf arg (cadr arg) 36 true-sep alt-sep)) 40 41 (when (and alt-op 42 (> count 1) 43 (consp arg) 44 (eq alt-op (car arg))) 45 (setf arg (cadr arg) 46 true-sep alt-sep)) 37 47 (if beg 38 48 (setf beg nil) 39 (format stream "~a" true-sep)) 49 (format stream "~a" true-sep)) 50 51 ;; If *print-length* exceeded, print ellipsis 40 52 (when (and (numberp *print-length*) (> count *print-length*)) 41 53 (format stream "...") 42 (return-from infix-print-separated-list)))))) 54 (return-from infix-print-separated-list (values))) 55 56 (infix-print arg stream op print-level)))) 57 (values)) 43 58 59 60 (defun infix-print-arg-list (lst stream print-level 61 &aux (count 0)) 62 "Print a comma-separated list" 63 64 ;; Arguments never need to be parenthesized? 65 (dolist (e (butlast lst)) 66 (infix-print e stream (1+ print-level)) 67 (when (and (numberp *print-length*) 68 (> count *print-length*)) 69 (format stream "...") 70 (return-from infix-print-arg-list (values))) 71 (format stream ",")) 72 (infix-print (car (last lst)) stream (1+ print-level))) 73 44 74 45 75 (defun infix-print (expr &optional (stream t) (op nil) (print-level 0)) … … 48 78 has lower precedence than OP." 49 79 (cond 50 ((and (numberp *print-level*) (> print-level *print-level*)) 80 ;; Handle *print-level* 81 ((and (numberp *print-level*) 82 (> print-level *print-level*)) 51 83 (format stream "#")) 52 ((null expr) (error "Null expression.")) 53 ((atom expr) (format stream "~a" expr)) 84 85 ;; Null expression is an error 86 ((null expr) 87 (error "Null expression.")) 88 89 ;; Atoms are printed using ~A format directive 90 ((atom expr) 91 (format stream "~a" expr)) 92 93 ;; Check if the operator of this expression has lower precedence 94 ;; than the surrounding operator, and parenthesize if necessary 54 95 ((and op (operator-lessp (car expr) op)) 55 96 (format stream "(") 56 97 (infix-print expr stream nil (1+ print-level)) 57 98 (format stream ")")) 58 ((and (eq (car expr) '-) 59 (endp (cddr expr))) ;unary minus 99 100 ;; Unary minus needs special handling 101 ((and (eq (car expr) '-) (endp (cddr expr))) 60 102 (format stream "-") 103 ;; Print the second element in product context 61 104 (infix-print (cadr expr) stream '* (1+ print-level))) 105 106 ;; All other operators 62 107 (t 63 108 (case (car expr) 109 110 ;; Arithmetic operators 64 111 ((+ - * /) 65 (infix-print-separated-list (cdr expr) (car expr) stream (car expr) (1+ print-level) 66 (cond ((eq (car expr) '+) '-) 67 ((eq (car expr) '-) '-) 68 (t nil)))) 69 (wedge 70 (infix-print-separated-list (cdr expr) '|/\\| stream '* (1+ print-level))) 112 (infix-print-separated-list 113 (cdr expr) 114 (car expr) 115 stream 116 (car expr) 117 (1+ print-level) 118 (cond ((eq (car expr) '+) '-) 119 ((eq (car expr) '-) '-) 120 (t nil)))) 121 122 ;; Exponentials 71 123 (expt 72 124 (unless (= (length (cdr expr)) 2) 73 125 (error "expt must take 2 arguments.")) 74 (infix-print-separated-list (cdr expr) '^ stream '^ (1+ print-level))) 75 (otherwise ;assumed function call 126 (infix-print-separated-list 127 (cdr expr) 128 '^ 129 stream 130 '^ 131 (1+ print-level))) 132 133 ;; Assuming function call 134 (otherwise 76 135 (cond 77 ((and (eq (car expr) 'd) 78 (consp (cdr expr)) 79 (symbolp (cadr expr))) 80 ;; Special syntax for differential forms 81 (format stream "d~a" (cadr expr))) 82 ((eq (car expr) 'aref) 83 ;; Special syntax for subscripted variables 84 ;; consistent with the infix package. 85 (format stream "~a[" (cadr expr)) 86 (infix-print-separated-list (cddr expr) '\, stream '\, (1+ print-level)) 87 (format stream "]")) 88 ((and (symbolp (car expr)) 89 (string= (symbol-name (car expr)) "[")) 90 (format stream "[") 91 (infix-print-separated-list (cdr expr) '\, stream '\, (1+ print-level)) 92 (format stream "]")) 93 (t 94 ;; Generic function call syntax 95 (format stream "~a(" (car expr)) 96 (infix-print-separated-list (cdr expr) '\, stream '\, (1+ print-level)) 97 (format stream ")")))))))) 136 ;; Handle array references 137 ((eq (car expr) 'aref) 138 ;; Special syntax for subscripted variables 139 ;; consistent with the infix package. 140 (format stream "~a[" (cadr expr)) 141 (infix-print-separated-list (cddr expr) '\, stream '\, (1+ print-level)) 142 (format stream "]")) 143 144 ;; Handle lists 145 ((and (symbolp (car expr)) 146 (string= (symbol-name (car expr)) "[")) 147 (format stream "[") 148 (infix-print-separated-list (cdr expr) '\, stream '\, (1+ print-level)) 149 (format stream "]")) 150 151 152 ;; Handle generic function call syntax 153 (t 154 155 (format stream "~a(" (car expr)) 156 (infix-print-arg-list (cdr expr) stream (1+ print-level)) 157 (format stream ")"))))))) 158 (values))
Note:
See TracChangeset
for help on using the changeset viewer.