Annotation of 43BSD/ucb/lisp/lisplib/syntax.l, revision 1.1.1.1

1.1       root        1: (setq rcs-syntax-
                      2:    "$Header: /usr/lib/lisp/syntax.l,v 1.1 83/01/29 18:40:24 jkf Exp $")
                      3: 
                      4: ;;
                      5: ;; syntax.l                            -[Sat Jan 29 18:28:58 1983 by jkf]-
                      6: ;;
                      7: ;; contains the user callable setsyntax function
                      8: ;;
                      9: 
                     10: 
                     11: ;--- setsyntax :: new version of setsyntax
                     12: ;  this version allows symbolic syntax codes.
                     13: ;
                     14: (declare
                     15:    (special syntax:symbolic-to-old-fixnum ;; for upward compatibility
                     16:                                        ; use this to map from old
                     17:                                        ; fixnums to symbolic names
                     18:            syntax:symbolic-bits-to-fixnum ;; bit definitions of symbolic
                     19:                                           ;bits.  see h/chars.h
                     20:            syntax:code-to-bits         ;; used at runtime to
                     21:                                        ; interpret symbolic names
                     22:            readtable                   ;; current readtable
                     23:    ))
                     24: 
                     25: 
                     26: (def setsyntax
                     27:    (lexpr (n)
                     28:          (cond ((not (or (equal n 2) (equal n 3)))
                     29:                 (error "setsyntax: 2 or 3 args required, not " n)))
                     30:          ; determine the correct code
                     31:          (prog (given ch number)
                     32:             (setq given (arg 2)
                     33:                   ch    (arg 1))
                     34:             (cond ((and (not (numberp ch))
                     35:                         (not (symbolp ch)))
                     36:                    (error "setsyntax: first arg must be a number or symbol: "
                     37:                           ch)))
                     38:             (cond ((numberp given)
                     39:                    ; using the old fixnum values (we suppose)
                     40:                    (cond ((setq number
                     41:                                 (rassq given syntax:symbolic-to-old-fixnum))
                     42:                           (setq given (car number))) ; use symbolic name
                     43:                          (t (error "setsyntax: fixnum code is not defined: "
                     44:                                    given)))))
                     45:             (cond ((symbolp given)
                     46:                    ; convert from common names to our symbolic names
                     47:                    (cond ((eq 'macro given)
                     48:                           (setq given 'vmacro))
                     49:                          ((eq 'splicing given)
                     50:                           (setq given 'vsplicing-macro)))
                     51:                    ; now see if the symbolic name is defined
                     52:                    (cond ((setq number (assq given syntax:code-to-bits))
                     53:                           (setq number (cdr number)))
                     54:                          (t (error "setsyntax: unknown symbolic code: "
                     55:                                    given))))
                     56:                   (t (error "setsyntax: second arg not symbol or fixnum: "
                     57:                             given)))
                     58:             ; now call the low level code to set the value.
                     59:             (int:setsyntax (arg 1) number)             ;;; change to *
                     60:             ; the final argument is placed on the property list of the
                     61:             ; first argument, with the indicator being the current readtable,
                     62:             ; thus you can have more than one macro function for each
                     63:             ; character for each readtable.
                     64:             (cond ((equal n 3)
                     65:                    (cond ((numberp ch) (setq ch (ascii ch))))   ; need symbol
                     66:                    (putprop ch (arg 3) readtable))))
                     67:    t))
                     68:             
                     69: 
                     70: (def getsyntax
                     71:    (lambda (ch)
                     72:       (let ((res (int:getsyntax ch))   ; this will be modified too
                     73:            (symb))
                     74:         (cond ((setq symb (rassq res syntax:code-to-bits))
                     75:                (car symb))
                     76:               (t (error "getsyntax: no symbolic code corresponds to: "
                     77:                         res))))))
                     78: 
                     79: 
                     80: ;--- add-syntax-class : add a new symbolic syntax class
                     81: ; name is the name which we will use to refer to it.
                     82: ; bits are a list of symbolic bit names for it.
                     83: ; modifies global variable: syntax:code-to-bits
                     84: ;
                     85: (def add-syntax-class
                     86:    (lambda (name bits)
                     87:       (cond ((not (symbolp name))
                     88:             (error "add-syntax-class: illegal name: " name)))
                     89:       (cond ((not (dtpr bits))
                     90:             (error "add-syntax-class: illegal bits: " bits)))
                     91:       (do ((xx bits (cdr xx))
                     92:           (this 0)
                     93:           (num 0))
                     94:          ((null xx)
                     95:           (cond ((setq this (assq name syntax:code-to-bits))
                     96:                  (rplacd this num))    ; replace old value
                     97:                 (t (setq syntax:code-to-bits (cons (cons name num)
                     98:                                                    syntax:code-to-bits)))))
                     99:          (cond ((setq this (assq (car xx) syntax:symbolic-bits-to-fixnum))
                    100:                 ;(format t "num:~d, oth:~a, comb:~d~%"
                    101:                        ; num (cdr this) (apply 'boole `(7 ,num ,(cdr this))))
                    102:                 (setq num (boole 7 num (cdr this)))
                    103:                 ;(format t "res: ~d~%" num)
                    104:                 )   ; logical or
                    105:                (t (error "illegal syntax code " (car xx)))))
                    106:       name))
                    107: 
                    108: (setq syntax:symbolic-to-old-fixnum
                    109:        '((vnumber . 0) (vsign . 1) (vcharacter . 2)
                    110:         (vsingle-character-symbol . 66.)
                    111:         (vleft-paren . 195.) (vright-paren . 196.)
                    112:         (vperiod . 133.)
                    113:         (vleft-bracket . 198.) (vright-bracket . 199.) (veof . 200.)
                    114:         (vsingle-quote . 201.) (vsymbol-delimiter . 138.)
                    115:         (vstring-delimiter . 137.)
                    116:         (villegal . 203.) (vseparator . 204.)
                    117:         (vsplicing-macro . 205.) (vmacro . 206.)
                    118:         (vescape . 143.))
                    119:    syntax:symbolic-bits-to-fixnum 
                    120:        '(; character classes
                    121:           (cnumber . 0) (csign . 1) (ccharacter . 2)
                    122:           (cleft-paren . 3)
                    123:           (cright-paren . 4) (cperiod . 5) (cleft-bracket . 6)
                    124:           (cright-bracket . 7)
                    125:           (csingle-quote . 9.) (csymbol-delimiter . 10.) (cillegal . 11.)
                    126:           (cseparator . 12.) (csplicing-macro . 13.)
                    127:           (cmacro . 14.) (cescape . 15.) (csingle-character-symbol . 16.)
                    128:           (cstring-delimiter . 17.)
                    129:           (csingle-macro . 18.) (csingle-splicing-macro . 19.)
                    130:           (cinfix-macro . 20.)
                    131:           (csingle-infix-macro . 21.)
                    132:          ; escape bits
                    133:           (escape-when-unique . 64.)
                    134:           (escape-when-first . 128.)
                    135:           (escape-always . 192.)
                    136:          ; separator
                    137:           (separator . 32.))
                    138:    syntax:code-to-bits nil)
                    139:        
                    140: (add-syntax-class 'vnumber     '(cnumber))
                    141: (add-syntax-class 'vsign       '(csign))
                    142: (add-syntax-class 'vcharacter  '(ccharacter))
                    143: (add-syntax-class 'vleft-paren         '(cleft-paren escape-always separator))
                    144: (add-syntax-class 'vright-paren        '(cright-paren escape-always separator))
                    145: (add-syntax-class 'vperiod     '(cperiod escape-when-unique))
                    146: (add-syntax-class 'vleft-bracket '(cleft-bracket escape-always separator))
                    147: (add-syntax-class 'vright-bracket '(cright-bracket escape-always separator))
                    148: (add-syntax-class 'vsingle-quote '(csingle-quote escape-always separator))
                    149: (add-syntax-class 'vsymbol-delimiter   '(csymbol-delimiter escape-always))
                    150: (add-syntax-class 'villegal    '(cillegal escape-always separator))
                    151: (add-syntax-class 'vseparator  '(cseparator escape-always separator))
                    152: (add-syntax-class 'vsplicing-macro '(csplicing-macro escape-always separator))
                    153: (add-syntax-class 'vmacro      '(cmacro escape-always separator))
                    154: (add-syntax-class 'vescape     '(cescape escape-always))
                    155: (add-syntax-class 'vsingle-character-symbol
                    156:                  '(csingle-character-symbol separator))
                    157: (add-syntax-class 'vstring-delimiter   '(cstring-delimiter escape-always))
                    158: (add-syntax-class 'vsingle-macro '(csingle-macro escape-when-unique))
                    159: (add-syntax-class 'vsingle-splicing-macro
                    160:                 '(csingle-splicing-macro escape-when-unique))
                    161: (add-syntax-class 'vinfix-macro '(cinfix-macro escape-always separator))
                    162: (add-syntax-class 'vsingle-infix-macro
                    163:                   '(csingle-infix-macro escape-when-unique))
                    164: 
                    165: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.