;;;;Here there be aliens
(mapc 'require '(asdf usocket))

(setq *print-pretty* t)

(defvar *lf* nil)
(defvar *pc* 0)
(defvar *post* nil)
(defun alist-and-body (s c n)
`(setq *post* (cons
   (let ((utime (get-universal-time)))
    (multiple-value-bind
     (second minute hour date month year day)
     (decode-universal-time utime 0)
     (append (read ,s t nil t)
      (list
      (cons 'pc (incf *pc*))
      (cons 'second second)
      (cons 'minute minute)
      (cons 'hour hour)
      (cons 'date date)
      (cons 'month
       (cdr (assoc month '((1 . jan) (2 . feb) (3 . mar) (4 . apr)
                          (5 . may) (6 . jun) (7 . jul) (8 . aug)
                          (9 . sep) (10 . oct) (11 . nov) (12 . dec)))))
      (cons 'year year)
      (cons 'day
       (cdr (assoc day '((0 . mon) (1 . tue) (2 . wed) (3 . thu)
                         (4 . fri) (5 . sat) (6 . sun)))))))))
  (loop for r = (read ,s t nil t)
   while (not (eq r '}))
   collect r
   finally (read-char-no-hang ,s t nil t)))))

(set-dispatch-macro-character #\# #\{ #'alist-and-body)

(defun post (&optional (msg nil) (server "127.0.0.1") (port 45678))
(usocket:with-client-socket (socket stream server port :element-type 'character)
 (unwind-protect
  (let ((*read-eval* nil))
   (format stream "7~s~%~s~%" (car msg) (cdr msg))
   (loop for response = (read stream nil nil)
    while response collecting response))
  (usocket:socket-close socket))))

(defun strm2syms (stream)
 (let ((symbols (list))
       (curword (list)))
  (loop for ch = (read-char stream nil nil)
   do (if (or (null ch) (char= ch #\Space))
       (progn (push (with-input-from-string
                      (s (format nil "|~a|"
                          (coerce (nreverse curword) 'string)))
                      (read s)) symbols) (setf curword (list)))
       (when ch (push ch curword)))
   while ch finally (return-from strm2syms (reverse symbols)))))

(defun unjust (stream)
(let ((string (format nil "~a" (strm2syms stream))))
 (values (subseq string 1 (1- (length string))))))

(defun linewise (filepath)
(with-open-file (file filepath :direction :input)
 (loop for line = (read-line file nil nil) while line collecting
  (with-input-from-string (in line) (unjust in)))))