Advertisement
Guest User

readtable problem

a guest
Jan 22nd, 2021
106
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lisp 1.78 KB | None | 0 0
  1. (let ((char-table
  2.   "|000 nul|001 soh|002 stx|003 etx|004 eot|005 enq|006 ack|007 bel
  3.    |008 bs |009 ht |010 nl |011 vt |012 np |013 cr |014 so |015 si
  4.    |016 dle|017 dc1|018 dc2|019 dc3|020 dc4|021 nak|022 syn|023 etb
  5.    |024 can|025 em |026 sub|027 esc|028 fs |029 gs |030 rs |031 us
  6.    |032 sp |127 del")
  7.   (char-alias
  8.   "|009 tab")
  9. ) (labels (
  10.   (read-string (str &optional deb) (do ((pos 0) (x t) (l (length str)) (res))
  11.     ((or (>= pos l)  (null x)) res)
  12.     (setf l (length str))
  13.     (setf (values x pos) (read-from-string str nil nil :start pos))
  14.     (when deb (format t "read-string x=~s pos=~d~%" x pos))
  15.     (push x res)
  16.   ))
  17.  (charkeys () (let ((res) (save-mac (get-macro-character #\|)))
  18.   (set-macro-character #\| (lambda (stream char)
  19.     (declare (ignore char)) (let ((code (read stream)) (sym (read stream))
  20.       ) (format t "code ~a sym ~a~%" code sym)
  21.         (list (values (intern (symbol-name sym) :keyword)) (code-char code)))
  22.       ))
  23.   (setf res (append (read-string char-table) (read-string char-alias)))
  24.   (set-macro-character #\| save-mac)
  25.   (reverse res)
  26.   ))
  27. ) (let ((keys (charkeys)))
  28. (defmacro charkey (x) (append `(case ,x) keys '((t nil)))
  29. ))
  30. ))
  31. (defun tostring (x) "prepares an element for string concatenation"
  32.   (apply #'concatenate 'string (typecase x
  33.     (null (list ""))
  34.     (character (list (list x)))
  35.     (string (list x))
  36.     (keyword (let ((y (charkey x))) (if y (list (list y)) (list (symbol-name x)))))
  37.     (sequence (typecase (elt x 0)
  38.       (function  (list (funcall #'tostring (apply (car x) (cdr x)))))
  39.       (keyword (case (elt x 0)
  40.         (:dec )
  41.         (:oct )
  42.         (:hex )
  43.         (t (map 'list #'tostring x))
  44.         ))
  45.       (t (map 'list #'tostring x))
  46.     ))
  47.     (t (list (write-to-string x)))
  48.   ))
  49. )
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement