Changeset 41 in CGBLisp


Ignore:
Timestamp:
Feb 1, 2009, 4:22:24 PM (15 years ago)
Author:
Marek Rychlik
Message:

* empty log message *

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/infix-printer.lisp

    r39 r41  
    1818(in-package "INFIX-PRINTER")
    1919
     20(proclaim '(optimize (speed 0) (debug 3)))
     21
    2022(defun infix-print-separated-list (lst sep stream op print-level
    2123                                   &optional (alt-op nil) (alt-sep alt-op)
     
    2628  (cond
    2729   ((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*))
    2934    (format stream "#"))
     35
    3036   (t
    31     (dolist (arg lst (infix-print arg stream op print-level))
     37    (dolist (arg lst)
    3238      (setf true-sep sep)
    3339      (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))
    3747      (if beg
    3848          (setf beg nil)
    39         (format stream "~a" true-sep))
     49          (format stream "~a" true-sep))
     50     
     51      ;; If *print-length* exceeded, print ellipsis
    4052      (when (and (numberp *print-length*) (> count *print-length*))
    4153        (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))
    4358
     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   
    4474
    4575(defun infix-print (expr &optional (stream t) (op nil) (print-level 0))
     
    4878has lower precedence than OP."
    4979  (cond
    50    ((and (numberp *print-level*) (> print-level *print-level*))
     80    ;; Handle *print-level*
     81   ((and (numberp *print-level*)
     82         (> print-level *print-level*))
    5183    (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
    5495   ((and op (operator-lessp (car expr) op))
    5596    (format stream "(")
    5697    (infix-print expr stream nil (1+ print-level))
    5798    (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)))
    60102    (format stream "-")
     103    ;; Print the second element in product context
    61104    (infix-print (cadr expr) stream '* (1+ print-level)))
     105
     106   ;; All other operators
    62107   (t
    63108    (case (car expr)
     109
     110      ;; Arithmetic operators
    64111      ((+ - * /)
    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
    71123      (expt
    72124       (unless (= (length (cdr expr)) 2)
    73125         (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               
    76135       (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.