Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- (let ((char-table
- "|000 nul|001 soh|002 stx|003 etx|004 eot|005 enq|006 ack|007 bel
- |008 bs |009 ht |010 nl |011 vt |012 np |013 cr |014 so |015 si
- |016 dle|017 dc1|018 dc2|019 dc3|020 dc4|021 nak|022 syn|023 etb
- |024 can|025 em |026 sub|027 esc|028 fs |029 gs |030 rs |031 us
- |032 sp |127 del")
- (char-alias
- "|009 tab")
- ) (labels (
- (read-string (str &optional deb) (do ((pos 0) (x t) (l (length str)) (res))
- ((or (>= pos l) (null x)) res)
- (setf l (length str))
- (setf (values x pos) (read-from-string str nil nil :start pos))
- (when deb (format t "read-string x=~s pos=~d~%" x pos))
- (push x res)
- ))
- (charkeys () (let ((res) (save-mac (get-macro-character #\|)))
- (set-macro-character #\| (lambda (stream char)
- (declare (ignore char)) (let ((code (read stream)) (sym (read stream))
- ) (format t "code ~a sym ~a~%" code sym)
- (list (values (intern (symbol-name sym) :keyword)) (code-char code)))
- ))
- (setf res (append (read-string char-table) (read-string char-alias)))
- (set-macro-character #\| save-mac)
- (reverse res)
- ))
- ) (let ((keys (charkeys)))
- (defmacro charkey (x) (append `(case ,x) keys '((t nil)))
- ))
- ))
- (defun tostring (x) "prepares an element for string concatenation"
- (apply #'concatenate 'string (typecase x
- (null (list ""))
- (character (list (list x)))
- (string (list x))
- (keyword (let ((y (charkey x))) (if y (list (list y)) (list (symbol-name x)))))
- (sequence (typecase (elt x 0)
- (function (list (funcall #'tostring (apply (car x) (cdr x)))))
- (keyword (case (elt x 0)
- (:dec )
- (:oct )
- (:hex )
- (t (map 'list #'tostring x))
- ))
- (t (map 'list #'tostring x))
- ))
- (t (list (write-to-string x)))
- ))
- )
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement