changelog shortlog graph tags branches files raw help

Mercurial > core / changeset: added io/fast, moved obj/music -> aud/music

changeset 690: 90417ae14b21
parent 689: 2e7d93b892a5
child 691: 295ea43ceb2d
author: Richard Westhaver <ellis@rwest.io>
date: Tue, 01 Oct 2024 23:34:01 -0400
files: emacs/default.el lisp/lib/aud/pkg.lisp lisp/lib/io/fast.lisp lisp/lib/io/io.asd lisp/lib/io/pkg.lisp lisp/lib/obj/music/chord.lisp lisp/lib/obj/music/music.lisp lisp/lib/obj/music/note.lisp lisp/lib/skel/core/pkg.lisp lisp/lib/skel/core/proto.lisp lisp/lib/skel/core/types.lisp lisp/lib/skel/pkg.lisp lisp/lib/skel/skel.asd
description: added io/fast, moved obj/music -> aud/music
     1.1--- a/emacs/default.el	Tue Oct 01 22:29:08 2024 -0400
     1.2+++ b/emacs/default.el	Tue Oct 01 23:34:01 2024 -0400
     1.3@@ -369,21 +369,25 @@
     1.4 ;;   :ensure t
     1.5 ;;   :config
     1.6 ;;   (setq graphviz-dot-indent-width 2))
     1.7+
     1.8 ;;; Comments
     1.9 (defcustom prog-comment-keywords
    1.10   '("TODO" "REVIEW" "FIX" "HACK" "RESEARCH")
    1.11   "List of strings with comment keywords."
    1.12-  :group 'default)
    1.13+  :group 'default
    1.14+  :type 'list)
    1.15 
    1.16 (defcustom prog-comment-timestamp-format-concise "%F"
    1.17   "Specifier for date in `prog-comment-timestamp-keyword'.
    1.18 Refer to the doc string of `format-time-string' for the available
    1.19 options."
    1.20-  :group 'default)
    1.21+  :group 'default
    1.22+  :type 'string)
    1.23 
    1.24 (defcustom prog-comment-timestamp-format-verbose "%F %T %z"
    1.25   "Like `prog-comment-timestamp-format-concise', but longer."
    1.26-  :group 'default)
    1.27+  :group 'default
    1.28+  :type 'string)
    1.29 
    1.30 ;;;###autoload
    1.31 (defun prog-comment-dwim (arg)
    1.32@@ -570,7 +574,8 @@
    1.33 ;;; Scratch
    1.34 (defcustom default-scratch-buffer-mode 'lisp-interaction-mode
    1.35   "Default major mode for new scratch buffers"
    1.36-  :group 'default)
    1.37+  :group 'default
    1.38+  :type 'symbol)
    1.39 
    1.40 ;; Adapted from the `scratch.el' package by Ian Eure.
    1.41 (defun default-scratch-list-modes ()
     2.1--- a/lisp/lib/aud/pkg.lisp	Tue Oct 01 22:29:08 2024 -0400
     2.2+++ b/lisp/lib/aud/pkg.lisp	Tue Oct 01 23:34:01 2024 -0400
     2.3@@ -1,5 +1,8 @@
     2.4 (defpackage :aud
     2.5-  (:use :cl :std :dat/midi :obj/music :sndfile :alsa))
     2.6+  (:use :cl :std :dat/midi :sndfile :alsa))
     2.7+
     2.8+(defpackage :aud/music
     2.9+  (:use :cl :std :aud))
    2.10 
    2.11 (defpackage :aud/mpd
    2.12   (:use :cl :std :sb-bsd-sockets :net/core :net/util)
     3.1--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     3.2+++ b/lisp/lib/io/fast.lisp	Tue Oct 01 23:34:01 2024 -0400
     3.3@@ -0,0 +1,468 @@
     3.4+;;; fast.lisp --- Fast Octet Streams
     3.5+
     3.6+;; based on https://github.com/rpav/fast-io/tree/master
     3.7+
     3.8+;;; Code:
     3.9+(in-package :io/fast)
    3.10+
    3.11+ ;; Vector buffer
    3.12+
    3.13+(defvar *default-output-buffer-size* 16)
    3.14+
    3.15+(declaim (ftype (function (array-index) octet-vector) make-octet-vector)
    3.16+         (inline make-octet-vector))
    3.17+(defun make-octet-vector (len)
    3.18+  (make-array (the array-index len) :element-type 'octet))
    3.19+
    3.20+(declaim (inline output-buffer-vector output-buffer-fill output-buffer-len))
    3.21+(defstruct output-buffer
    3.22+  (vector (make-octet-vector *default-output-buffer-size*)
    3.23+   :type octet-vector)
    3.24+  (fill 0 :type array-index)
    3.25+  (len 0 :type array-index)
    3.26+  (queue nil :type list)
    3.27+  (last nil :type list)
    3.28+  (output nil))
    3.29+
    3.30+(defstruct input-buffer
    3.31+  (vector nil :type (or null octet-vector))
    3.32+  (pos 0 :type array-index)
    3.33+  (stream nil))
    3.34+
    3.35+(defun buffer-position (buffer)
    3.36+  "Return the number of bytes read (for an INPUT-BUFFER) or written
    3.37+   (for an OUTPUT-BUFFER)"
    3.38+  (etypecase buffer
    3.39+    (input-buffer (input-buffer-pos buffer))
    3.40+    (output-buffer (output-buffer-len buffer))))
    3.41+
    3.42+;; Sometimes it is usefull just to skip the buffer instead of reading from it.
    3.43+(defun (setf buffer-position) (new-pos buffer)
    3.44+  "Set the buffer position for input-buffer"
    3.45+  (check-type buffer input-buffer)
    3.46+  (let* ((pos (input-buffer-pos buffer))
    3.47+         (vec (input-buffer-vector buffer))
    3.48+         (vec-len (length vec)))
    3.49+    (declare (optimize (speed 3) (safety 1))
    3.50+             (type octet-vector vec)
    3.51+             (type non-negative-fixnum pos vec-len new-pos))
    3.52+    ;; Only need to update if pos or new-pos is in stream range.
    3.53+    (when-let ((stream-update-needed? (or (> pos vec-len)
    3.54+                                          (> new-pos vec-len)))
    3.55+               (stream (input-buffer-stream buffer)))
    3.56+      (let* ((stream-file-pos (file-position stream))
    3.57+             (pos-diff (- new-pos pos))
    3.58+             (stream-diff (cond ((and (> pos vec-len)
    3.59+                                      (< new-pos vec-len))
    3.60+                                 ;; branch for pos in stream and new-pos
    3.61+                                 ;; is in vector.
    3.62+                                 (- vec-len pos))
    3.63+                                ((and (< pos vec-len)
    3.64+                                      (> new-pos vec-len))
    3.65+                                 ;; branch for pos in vector. and new-pos
    3.66+                                 ;; is in stream.
    3.67+                                 (- pos-diff (- vec-len pos)))
    3.68+                                ;; otherwise stream-diff = pos-diff.
    3.69+                                (t pos-diff)))
    3.70+             (new-stream-pos (+ stream-file-pos stream-diff)))
    3.71+        (declare (type non-negative-fixnum stream-file-pos new-stream-pos)
    3.72+                 (type fixnum pos-diff stream-diff))
    3.73+        (file-position stream new-stream-pos))))
    3.74+  (setf (slot-value buffer 'pos) new-pos))
    3.75+
    3.76+(defun octets-from (sequence)
    3.77+  (let ((vec (make-octet-vector (length sequence))))
    3.78+    (replace vec sequence)
    3.79+    vec))
    3.80+
    3.81+(defun concat-buffer (buffer)
    3.82+  (let* ((len (output-buffer-len buffer))
    3.83+         (array
    3.84+           #+fast-io-sv
    3.85+           (if (eq :static (output-buffer-output buffer))
    3.86+               (static-vectors:make-static-vector (the array-index len))
    3.87+               (make-octet-vector len))
    3.88+           #-fast-io-sv
    3.89+           (make-octet-vector len)))
    3.90+    (loop as i = 0 then (+ i (length a))
    3.91+          for a in (output-buffer-queue buffer) do
    3.92+            (replace (the octet-vector array)
    3.93+                     (the octet-vector a) :start1 i)
    3.94+          finally
    3.95+             (replace (the octet-vector array)
    3.96+                      (output-buffer-vector buffer)
    3.97+                      :start1 i
    3.98+                      :end2 (output-buffer-fill buffer)))
    3.99+    array))
   3.100+
   3.101+(defun flush (output-buffer)
   3.102+  (when (> (output-buffer-fill output-buffer) 0)
   3.103+    (write-sequence (output-buffer-vector output-buffer)
   3.104+                    (output-buffer-output output-buffer)
   3.105+                    :start 0 :end (output-buffer-fill output-buffer))
   3.106+    (prog1 (output-buffer-fill output-buffer)
   3.107+      (setf (output-buffer-fill output-buffer) 0))))
   3.108+
   3.109+(defun extend (buffer &optional (min 1))
   3.110+  (let ((vector (output-buffer-vector buffer)))
   3.111+    (setf (output-buffer-last buffer)
   3.112+          (nconc (output-buffer-last buffer)
   3.113+                 (cons vector nil))
   3.114+          (output-buffer-vector buffer)
   3.115+          (make-octet-vector (max min (1+ (* 2 (length vector)))))
   3.116+          (output-buffer-fill buffer) 0)
   3.117+    (unless (output-buffer-queue buffer)
   3.118+      (setf (output-buffer-queue buffer)
   3.119+            (output-buffer-last buffer)))))
   3.120+
   3.121+(defun fast-write-byte (byte output-buffer)
   3.122+  (declare (type octet byte)
   3.123+           (type output-buffer output-buffer)
   3.124+           (optimize (speed 3) (safety 1)))
   3.125+  (when (= (output-buffer-fill output-buffer)
   3.126+           (array-dimension (output-buffer-vector output-buffer) 0))
   3.127+    (if (streamp (output-buffer-output output-buffer))
   3.128+        (flush output-buffer)
   3.129+        (extend output-buffer)))
   3.130+  (prog1
   3.131+      (setf (aref (output-buffer-vector output-buffer)
   3.132+                  (output-buffer-fill output-buffer))
   3.133+            byte)
   3.134+    (incf (output-buffer-fill output-buffer))
   3.135+    (incf (output-buffer-len output-buffer))))
   3.136+
   3.137+(defun fast-read-byte (input-buffer &optional (eof-error-p t) eof-value)
   3.138+  (declare (type input-buffer input-buffer))
   3.139+  (when-let ((vec (input-buffer-vector input-buffer))
   3.140+             (pos (input-buffer-pos input-buffer)))
   3.141+    (when (< pos (length vec))
   3.142+      (incf (input-buffer-pos input-buffer))
   3.143+      (return-from fast-read-byte (aref vec pos))))
   3.144+  (when-let ((stream (input-buffer-stream input-buffer)))
   3.145+    (let ((byte (read-byte stream eof-error-p eof-value)))
   3.146+      (unless (equal byte eof-value)
   3.147+        (incf (input-buffer-pos input-buffer)))
   3.148+      (return-from fast-read-byte byte)))
   3.149+  (if eof-error-p
   3.150+      (error 'end-of-file :stream input-buffer)
   3.151+      eof-value))
   3.152+
   3.153+(defun fast-peek-byte (input-buffer &optional peek-type (eof-error-p t) eof-value)
   3.154+  "This is like `peek-byte' only for fast-io input-buffers."
   3.155+  (declare (type input-buffer input-buffer))
   3.156+  (loop :for octet = (fast-read-byte input-buffer eof-error-p :eof)
   3.157+     :for new-pos :from (input-buffer-pos input-buffer)
   3.158+     :until (cond ((eq octet :eof)
   3.159+                   (return eof-value))
   3.160+                  ((null peek-type))
   3.161+                  ((eq peek-type 't)
   3.162+                   (plusp octet))
   3.163+                  ((= octet peek-type)))
   3.164+     :finally (setf (buffer-position input-buffer) new-pos)
   3.165+       (return octet)))
   3.166+
   3.167+(defun fast-write-sequence (sequence output-buffer &optional (start 0) end)
   3.168+  (if (streamp (output-buffer-output output-buffer))
   3.169+      (progn
   3.170+        (flush output-buffer)
   3.171+        (write-sequence sequence (output-buffer-output output-buffer) :start start :end end))
   3.172+      (progn
   3.173+        (let* ((start2 start)
   3.174+               (len (if end
   3.175+                        (- end start)
   3.176+                        (- (length sequence) start)))
   3.177+               (buffer-remaining
   3.178+                 (- (length (output-buffer-vector output-buffer))
   3.179+                    (output-buffer-fill output-buffer))))
   3.180+          (when (> buffer-remaining 0)
   3.181+            (replace (output-buffer-vector output-buffer)
   3.182+                     (the octet-vector sequence)
   3.183+                     :start1 (output-buffer-fill output-buffer)
   3.184+                     :start2 start2
   3.185+                     :end2 end)
   3.186+            (incf start2 buffer-remaining)
   3.187+            (incf (output-buffer-fill output-buffer)
   3.188+                  (min buffer-remaining len)))
   3.189+          (let ((sequence-remaining (- (or end (length sequence)) start2)))
   3.190+            (when (> sequence-remaining 0)
   3.191+              (extend output-buffer sequence-remaining)
   3.192+              (replace (output-buffer-vector output-buffer)
   3.193+                       (the octet-vector sequence)
   3.194+                       :start2 start2
   3.195+                       :end2 end)
   3.196+              (incf (output-buffer-fill output-buffer) sequence-remaining)))
   3.197+          (incf (output-buffer-len output-buffer) len)
   3.198+          len))))
   3.199+
   3.200+(defun fast-read-sequence (sequence input-buffer &optional (start 0) end)
   3.201+  (declare (type octet-vector sequence)
   3.202+           (type input-buffer input-buffer))
   3.203+  (let ((start1 start)
   3.204+        (total-len (if end
   3.205+                       (- end start)
   3.206+                       (- (length sequence) start))))
   3.207+    (when-let ((vec (input-buffer-vector input-buffer))
   3.208+               (pos (input-buffer-pos input-buffer)))
   3.209+      (when (< pos (length vec))
   3.210+        (let ((len (min total-len (- (length vec) pos))))
   3.211+          (replace sequence vec
   3.212+                   :start1 start1
   3.213+                   :start2 pos
   3.214+                   :end2 (+ pos len))
   3.215+          (incf (input-buffer-pos input-buffer) len)
   3.216+          (incf start1 len))))
   3.217+    (when (< start1 total-len)
   3.218+      (when-let ((stream (input-buffer-stream input-buffer)))
   3.219+        (let ((bytes-read (read-sequence sequence stream
   3.220+                                         :start start1
   3.221+                                         :end (+ total-len start1))))
   3.222+          (incf (input-buffer-pos input-buffer) bytes-read)
   3.223+          (return-from fast-read-sequence bytes-read))))
   3.224+    start1))
   3.225+
   3.226+(defun finish-output-buffer (output-buffer)
   3.227+  "Finish an output buffer. If it is backed by a vector (static or otherwise)
   3.228+it returns the final octet vector. If it is backed by a stream it ensures that
   3.229+all data has been flushed to the stream."
   3.230+  (if (streamp (output-buffer-output output-buffer))
   3.231+      (flush output-buffer)
   3.232+      (concat-buffer output-buffer)))
   3.233+
   3.234+(defmacro with-fast-output ((buffer &optional output) &body body)
   3.235+  "Create `BUFFER`, optionally outputting to `OUTPUT`."
   3.236+  `(let ((,buffer (make-output-buffer :output ,output)))
   3.237+     ,@body
   3.238+     (if (streamp (output-buffer-output ,buffer))
   3.239+         (flush ,buffer)
   3.240+         (finish-output-buffer ,buffer))))
   3.241+
   3.242+(defmacro with-fast-input ((buffer vector &optional stream (offset 0)) &body body)
   3.243+  `(let ((,buffer (make-input-buffer :vector ,vector :stream ,stream :pos ,offset)))
   3.244+     ,@body))
   3.245+
   3.246+ ;; READx and WRITEx
   3.247+;;; WRITE-UNSIGNED-BE, READ-UNSIGNED-BE, etc taken from PACK, which is
   3.248+;;; in the public domain.
   3.249+
   3.250+(defmacro write-unsigned-be (value size buffer)
   3.251+  (once-only (value buffer)
   3.252+    `(progn
   3.253+       ,@(loop for i from (* (1- size) 8) downto 0 by 8
   3.254+               collect `(fast-write-byte (ldb (byte 8 ,i) ,value) ,buffer)))))
   3.255+
   3.256+(defmacro read-unsigned-be (size buffer)
   3.257+  (with-gensyms (value)
   3.258+    (once-only (buffer)
   3.259+      `(let ((,value 0))
   3.260+         ,@(loop for i from (* (1- size) 8) downto 0 by 8
   3.261+                 collect `(setf (ldb (byte 8 ,i) ,value) (fast-read-byte ,buffer)))
   3.262+         ,value))))
   3.263+
   3.264+(defmacro write-unsigned-le (value size buffer)
   3.265+  (once-only (value buffer)
   3.266+    `(progn
   3.267+       ,@(loop for i from 0 below (* 8 size) by 8
   3.268+               collect `(fast-write-byte (ldb (byte 8 ,i) ,value) ,buffer)))))
   3.269+
   3.270+(defmacro read-unsigned-le (size buffer)
   3.271+  (with-gensyms (value)
   3.272+    (once-only (buffer)
   3.273+      `(let ((,value 0))
   3.274+         ,@(loop for i from 0 below (* 8 size) by 8
   3.275+                 collect `(setf (ldb (byte 8 ,i) ,value) (fast-read-byte ,buffer)))
   3.276+         ,value))))
   3.277+
   3.278+(declaim (inline unsigned-to-signed))
   3.279+(defun unsigned-to-signed (value size)
   3.280+  (let ((max-signed (expt 2 (1- (* 8 size))))
   3.281+        (to-subtract (expt 2 (* 8 size))))
   3.282+    (if (>= value max-signed)
   3.283+        (- value to-subtract)
   3.284+        value)))
   3.285+
   3.286+(declaim (inline signed-to-unsigned))
   3.287+(defun signed-to-unsigned (value size)
   3.288+  (if (minusp value)
   3.289+      (+ value (expt 2 (* 8 size)))
   3.290+      value))
   3.291+
   3.292+(defmacro make-readers (&rest bitlens)
   3.293+  (let ((names (mapcar (lambda (n)
   3.294+                         (mapcar (lambda (m) (symbolicate (format nil m n)))
   3.295+                                 '("READ~A-BE" "READU~A-BE"
   3.296+                                   "READ~A-LE" "READU~A-LE")))
   3.297+                       bitlens)))
   3.298+    `(eval-when (:compile-toplevel :load-toplevel :execute)
   3.299+       (declaim (inline ,@(flatten names)))
   3.300+       ,@(loop for fun in names
   3.301+               for bits in bitlens
   3.302+               as bytes = (truncate bits 8)
   3.303+               collect
   3.304+               `(progn
   3.305+                  (defun ,(first fun) (buffer)
   3.306+                    (unsigned-to-signed (read-unsigned-be ,bytes buffer) ,bytes))
   3.307+                  (defun ,(second fun) (buffer)
   3.308+                    (read-unsigned-be ,bytes buffer))
   3.309+                  (defun ,(third fun) (buffer)
   3.310+                    (unsigned-to-signed (read-unsigned-le ,bytes buffer) ,bytes))
   3.311+                  (defun ,(fourth fun) (buffer)
   3.312+                    (read-unsigned-le ,bytes buffer)))))))
   3.313+
   3.314+(defmacro make-writers (&rest bitlens)
   3.315+  (let ((names (mapcar (lambda (n)
   3.316+                         (mapcar (lambda (m) (symbolicate (format nil m n)))
   3.317+                                 '("WRITE~A-BE" "WRITEU~A-BE"
   3.318+                                   "WRITE~A-LE" "WRITEU~A-LE")))
   3.319+                       bitlens)))
   3.320+    `(eval-when (:compile-toplevel :load-toplevel :execute)
   3.321+       (declaim (notinline ,@(flatten names)))
   3.322+       ,@(loop for fun in names
   3.323+               for bits in bitlens
   3.324+               as bytes = (truncate bits 8)
   3.325+               collect
   3.326+               `(progn
   3.327+                  (defun ,(first fun) (value buffer)
   3.328+                    (declare (type (signed-byte ,bits) value))
   3.329+                    (write-unsigned-be (the (unsigned-byte ,bits)
   3.330+                                            (signed-to-unsigned value ,bytes)) ,bytes buffer))
   3.331+                  (defun ,(second fun) (value buffer)
   3.332+                    (declare (type (unsigned-byte ,bits) value))
   3.333+                    (write-unsigned-be (the (unsigned-byte ,bits) value)
   3.334+                                       ,bytes buffer))
   3.335+                  (defun ,(third fun) (value buffer)
   3.336+                    (declare (type (signed-byte ,bits) value))
   3.337+                    (write-unsigned-le (the (unsigned-byte ,bits)
   3.338+                                            (signed-to-unsigned value ,bytes)) ,bytes buffer))
   3.339+                  (defun ,(fourth fun) (value buffer)
   3.340+                    (declare (type (unsigned-byte ,bits) value))
   3.341+                    (write-unsigned-le (the (unsigned-byte ,bits) value)
   3.342+                                       ,bytes buffer)))))))
   3.343+
   3.344+(make-writers 16 24 32 64 128)
   3.345+(make-readers 16 24 32 64 128)
   3.346+
   3.347+(declaim (inline write8 writeu8 read8 readu8))
   3.348+(defun write8 (value buffer)
   3.349+  (declare (type (signed-byte 8) value))
   3.350+  (fast-write-byte (signed-to-unsigned value 1) buffer))
   3.351+
   3.352+(defun writeu8 (value buffer)
   3.353+  (declare (type (unsigned-byte 8) value))
   3.354+  (fast-write-byte value buffer))
   3.355+
   3.356+
   3.357+(defun read8 (buffer)
   3.358+  (unsigned-to-signed (fast-read-byte buffer) 1))
   3.359+
   3.360+(defun readu8 (buffer)
   3.361+  (fast-read-byte buffer))
   3.362+
   3.363+(setf (symbol-function 'write8-le) #'write8)
   3.364+(setf (symbol-function 'write8-be) #'write8)
   3.365+(setf (symbol-function 'writeu8-le) #'writeu8)
   3.366+(setf (symbol-function 'writeu8-be) #'writeu8)
   3.367+
   3.368+(setf (symbol-function 'read8-le) #'read8)
   3.369+(setf (symbol-function 'read8-be) #'read8)
   3.370+(setf (symbol-function 'readu8-le) #'readu8)
   3.371+(setf (symbol-function 'readu8-be) #'readu8)
   3.372+
   3.373+;; fast-stream
   3.374+
   3.375+(defclass fast-io-stream (fundamental-stream)
   3.376+  ((openp :type boolean :initform t)))
   3.377+
   3.378+(defmethod stream-file-position ((stream fast-io-stream))
   3.379+  (with-slots (buffer) stream
   3.380+    (buffer-position buffer)))
   3.381+
   3.382+(defmethod open-stream-p ((stream fast-io-stream))
   3.383+  (slot-value stream 'openep))
   3.384+
   3.385+ ;; fast-output-stream
   3.386+
   3.387+(defclass fast-output-stream (fast-io-stream fundamental-output-stream)
   3.388+  ((buffer :type output-buffer)))
   3.389+
   3.390+(defmethod initialize-instance ((self fast-output-stream) &key stream
   3.391+                                buffer-size &allow-other-keys)
   3.392+  (call-next-method)
   3.393+  (let ((*default-output-buffer-size* (or buffer-size *default-output-buffer-size*)))
   3.394+    (with-slots (buffer) self
   3.395+      (setf buffer (make-output-buffer :output stream)))))
   3.396+
   3.397+(defmethod output-stream-p ((stream fast-output-stream))
   3.398+  (with-slots (buffer) stream
   3.399+    (and (typep buffer 'output-buffer))))
   3.400+
   3.401+(defmethod stream-element-type ((stream fast-output-stream))
   3.402+  "Return the underlying array element-type.
   3.403+   Should always return '(unsigned-byte 8)."
   3.404+  (with-slots (buffer) stream
   3.405+    (array-element-type (output-buffer-vector buffer))))
   3.406+
   3.407+(defmethod stream-write-byte ((stream fast-output-stream) byte)
   3.408+  (with-slots (buffer) stream
   3.409+    (fast-write-byte byte buffer)))
   3.410+
   3.411+(defmethod stream-write-sequence ((stream fast-output-stream) sequence start end
   3.412+                                  &key &allow-other-keys)
   3.413+  (with-slots (buffer) stream
   3.414+    (fast-write-sequence sequence buffer start end))
   3.415+  sequence)
   3.416+
   3.417+(defun finish-output-stream (stream)
   3.418+  (with-slots (buffer) stream
   3.419+    (if (streamp (output-buffer-output buffer))
   3.420+        (flush buffer)
   3.421+        (finish-output-buffer buffer))))
   3.422+
   3.423+(defmethod close ((stream fast-output-stream) &key abort)
   3.424+  (declare (ignore abort))
   3.425+  (finish-output-stream stream)
   3.426+  (setf (slot-value stream 'openp) nil))
   3.427+
   3.428+ ;; fast-input-stream
   3.429+
   3.430+(defclass fast-input-stream (fast-io-stream fundamental-input-stream)
   3.431+  ((buffer :type input-buffer)))
   3.432+
   3.433+(defmethod initialize-instance ((self fast-input-stream) &key stream
   3.434+                                vector &allow-other-keys)
   3.435+  (call-next-method)
   3.436+  (with-slots (buffer) self
   3.437+    (setf buffer (make-input-buffer :vector vector :stream stream))))
   3.438+
   3.439+(defmethod input-stream-p ((stream fast-input-stream))
   3.440+  (with-slots (buffer) stream
   3.441+    (and (typep buffer 'input-buffer))))
   3.442+
   3.443+(defmethod stream-element-type ((stream fast-input-stream))
   3.444+  "Return element-type of the underlying vector or stream.
   3.445+   Return NIL if none are present."
   3.446+  (with-slots (buffer) stream
   3.447+    (if-let ((vec (input-buffer-vector buffer)))
   3.448+      (array-element-type vec)
   3.449+      (when-let ((stream (input-buffer-stream buffer)))
   3.450+        (stream-element-type stream)))))
   3.451+
   3.452+(defmethod (setf stream-file-position) (new-pos (stream fast-input-stream))
   3.453+  (with-slots (buffer) stream
   3.454+    (setf (buffer-position buffer) new-pos)))
   3.455+
   3.456+(defmethod peek-byte ((stream fast-input-stream) &optional peek-type (eof-error-p t) eof-value)
   3.457+  (with-slots (buffer) stream
   3.458+    (fast-peek-byte buffer peek-type eof-error-p eof-value)))
   3.459+
   3.460+(defmethod stream-read-byte ((stream fast-input-stream))
   3.461+  (with-slots (buffer) stream
   3.462+    (fast-read-byte buffer)))
   3.463+
   3.464+(defmethod stream-read-sequence ((stream fast-input-stream) sequence start end
   3.465+                                 &key &allow-other-keys)
   3.466+  (with-slots (buffer) stream
   3.467+    (fast-read-sequence sequence buffer start end)))
   3.468+
   3.469+(defmethod close ((stream fast-input-stream) &key abort)
   3.470+  (declare (ignore abort))
   3.471+  (setf (slot-value stream 'openp) nil))
     4.1--- a/lisp/lib/io/io.asd	Tue Oct 01 22:29:08 2024 -0400
     4.2+++ b/lisp/lib/io/io.asd	Tue Oct 01 23:34:01 2024 -0400
     4.3@@ -9,6 +9,7 @@
     4.4   :version "0.1.0"
     4.5   :serial t
     4.6   :components ((:file "pkg")
     4.7+               (:file "fast")
     4.8                (:file "ring" :if-feature :linux)
     4.9                (:file "socket")
    4.10                (:file "stream")
     5.1--- a/lisp/lib/io/pkg.lisp	Tue Oct 01 22:29:08 2024 -0400
     5.2+++ b/lisp/lib/io/pkg.lisp	Tue Oct 01 23:34:01 2024 -0400
     5.3@@ -16,6 +16,27 @@
     5.4   (:use :cl :std/condition)
     5.5   (:export :io-error))
     5.6 
     5.7+(defpackage :io/fast
     5.8+  (:use :cl :std :io/proto)
     5.9+  (:export
    5.10+   #:fast-read-byte #:fast-write-byte
    5.11+   #:fast-read-sequence #:fast-write-sequence
    5.12+   #:with-fast-input #:with-fast-output
    5.13+   #:write8 #:writeu8
    5.14+   #:write8-le #:writeu8-le #:write8-be #:writeu8-be
    5.15+   #:write16-le #:writeu16-le #:write16-be #:writeu16-be
    5.16+   #:write24-le #:writeu24-le #:write24-be #:writeu24-be
    5.17+   #:write32-le #:writeu32-le #:write32-be #:writeu32-be
    5.18+   #:write64-le #:writeu64-le #:write64-be #:writeu64-be
    5.19+   #:write128-le #:writeu128-le #:write128-be #:writeu128-be
    5.20+   #:read8 #:readu8
    5.21+   #:read8-le #:readu8-le #:read8-be #:readu8-be
    5.22+   #:read16-le #:readu16-le #:read16-be #:readu16-be
    5.23+   #:read32-le #:readu32-le #:read32-be #:readu32-be
    5.24+   #:read64-le #:readu64-le #:read64-be #:readu64-be
    5.25+   #:read128-le #:readu128-le #:read128-be #:readu128-be
    5.26+   #:fast-output-stream #:fast-input-stream))
    5.27+
    5.28 (defpackage :io/ring
    5.29   (:use :cl :uring :io/proto)
    5.30   (:import-from :sb-alien :addr)
     7.1--- a/lisp/lib/obj/music/music.lisp	Tue Oct 01 22:29:08 2024 -0400
     7.2+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
     7.3@@ -1,266 +0,0 @@
     7.4-;;; music.lisp --- Musical Lisp Systems
     7.5-;; inspired by CLM (Stanford CCRMA)
     7.6-;;
     7.7-;; see also: http://www.titanmusic.com/papers/public/mips20010910.pdf
     7.8-;; 
     7.9-;; refs: https://openmusictheory.github.io/
    7.10-;; https://mlochbaum.github.io/BQN-Musician/index.html
    7.11-
    7.12-;;; Code:
    7.13-(in-package :obj/music)
    7.14-
    7.15-;;; unicode char support
    7.16-(defvar *flat-char* #\MUSIC_FLAT_SIGN) ;; ♭
    7.17-(defvar *sharp-char* #\MUSIC_SHARP_SIGN) ;; ♯
    7.18-(defvar *natural-char* #\MUSIC_NATURAL_SIGN) ;; ♮
    7.19-
    7.20-;;; amp/db/adb
    7.21-(defmacro db-to-amp (db) 
    7.22-  `(expt 10 (/ ,db 20)))
    7.23-
    7.24-(defmacro amp-to-db (amp)
    7.25-  `(* 20 (log ,amp 10)))
    7.26-
    7.27-(defmacro vol-to-amp (v &key (max 1000))
    7.28-  (let ((vol (gensym)))
    7.29-    `(let ((,vol ,v))
    7.30-       (if (<= ,vol 0) 0 (db-to-amp (* -10 (log (/ ,max ,vol) 2)))))))
    7.31-
    7.32-;; the 96.3296 figure for max is from track-rms.ins
    7.33-(defmacro adb-to-amp (adb &key (max 96.3296))
    7.34-  (let ((db (gensym)))
    7.35-    `(let ((,db ,adb))
    7.36-       (if (<= ,db 0.0) 0.0 (db-to-amp (- (abs ,db) ,max))))))
    7.37-
    7.38-(defmacro amp-to-adb (amp &key (max 96.3296))
    7.39-  `(if (<= ,amp .00001526) 0.0 (+ ,max (amp-to-db ,amp))))
    7.40-
    7.41-;;; Tones
    7.42-
    7.43-;; reading more on this, tones can be simple or complex. Here we deal
    7.44-;; with simple tones. A 'pitch' on the other hand, is the perceived
    7.45-;; representation of a tone or complex tones. Multiple sets of tones
    7.46-;; can share the same 'pitch'.
    7.47-
    7.48-;; In CLM, pitches are based on C0, compared to A4
    7.49-;; which is the norm. I think it makes quite a bit of sense from a
    7.50-;; technical standpoint, but with notes that low it becomes very
    7.51-;; difficult to hear the differences between tunings.
    7.52-
    7.53-;; This is Lisp after all though, so the correct implementation should
    7.54-;; support tuning by ear based on any note in the *PITCH-TABLE*.
    7.55-
    7.56-;; Ideally we get smart with it.
    7.57-;; NOTE: chroma,morph,chromamorph,genus equivalence across oct
    7.58-
    7.59-(defvar *c0-default* 16.35160)
    7.60-
    7.61-;;; Ideally pitch-sets are vectors with a lookup table for
    7.62-;;; strings/symbols
    7.63-(eval-always
    7.64-  (defvar *pitch-table* (make-hash-table :test #'equal)))
    7.65-
    7.66-;; (defmacro define-pitch (name octave interval &key (table *pitch-table*) (c0 *c0-default*))
    7.67-;;   ;; TODO
    7.68-;;   ;; (declare (ignore idx))
    7.69-;;   `(let ((pitch (* ,c0 (expt 2.0 (+ ,octave (/ ,interval 12.0))))))
    7.70-;;      (setf (gethash ,(symbol-name name) ,table) pitch)))
    7.71-
    7.72-;; (define-pitch c0 0 0)
    7.73-;; (define-pitch cs0 0 1)
    7.74-;; (define-pitch df0 0 1)
    7.75-;; (define-pitch d0 0 2) 
    7.76-;; (define-pitch ds0 0 3)
    7.77-;; (define-pitch ef0 0 3)
    7.78-;; (define-pitch e0 0 4)
    7.79-;; (define-pitch ff0 0 4)
    7.80-;; (define-pitch f0 0 5)
    7.81-;; (define-pitch es0 0 5)
    7.82-;; (define-pitch fs0 0 6)
    7.83-;; (define-pitch gf0 0 6)
    7.84-;; (define-pitch g0 0 7) 
    7.85-;; (define-pitch gs0 0 8)
    7.86-;; (define-pitch af0 0 8)
    7.87-;; (define-pitch a0 0 9) 
    7.88-;; (define-pitch as0 0 10)
    7.89-;; (define-pitch bf0 0 10)
    7.90-;; (define-pitch b0 0 11) 
    7.91-;; (define-pitch cf0 0 -1)
    7.92-;; (define-pitch bs0 0 12) 
    7.93-
    7.94-;; (define-pitch c1 1 0)
    7.95-;; (define-pitch cs1 1 1)
    7.96-;; (define-pitch df1 1 1)
    7.97-;; (define-pitch d1 1 2) 
    7.98-;; (define-pitch ds1 1 3)
    7.99-;; (define-pitch ef1 1 3)
   7.100-;; (define-pitch e1 1 4)
   7.101-;; (define-pitch ff1 1 4)
   7.102-;; (define-pitch f1 1 5)
   7.103-;; (define-pitch es1 1 5)
   7.104-;; (define-pitch fs1 1 6)
   7.105-;; (define-pitch gf1 1 6)
   7.106-;; (define-pitch g1 1 7) 
   7.107-;; (define-pitch gs1 1 8)
   7.108-;; (define-pitch af1 1 8)
   7.109-;; (define-pitch a1 1 9) 
   7.110-;; (define-pitch as1 1 10)
   7.111-;; (define-pitch bf1 1 10)
   7.112-;; (define-pitch b1 1 11) 
   7.113-;; (define-pitch cf1 1 -1)
   7.114-;; (define-pitch bs1 1 12) 
   7.115-
   7.116-;; (define-pitch c2 2 0)
   7.117-;; (define-pitch cs2 2 1)
   7.118-;; (define-pitch df2 2 1)
   7.119-;; (define-pitch d2 2 2) 
   7.120-;; (define-pitch ds2 2 3)
   7.121-;; (define-pitch ef2 2 3)
   7.122-;; (define-pitch e2 2 4)
   7.123-;; (define-pitch ff2 2 4)
   7.124-;; (define-pitch f2 2 5)
   7.125-;; (define-pitch es2 2 5)
   7.126-;; (define-pitch fs2 2 6)
   7.127-;; (define-pitch gf2 2 6)
   7.128-;; (define-pitch g2 2 7) 
   7.129-;; (define-pitch gs2 2 8)
   7.130-;; (define-pitch af2 2 8)
   7.131-;; (define-pitch a2 2 9) 
   7.132-;; (define-pitch as2 2 10)
   7.133-;; (define-pitch bf2 2 10)
   7.134-;; (define-pitch b2 2 11) 
   7.135-;; (define-pitch cf2 2 -1)
   7.136-;; (define-pitch bs2 2 12) 
   7.137-
   7.138-;; (define-pitch c3 3 0)
   7.139-;; (define-pitch cs3 3 1)
   7.140-;; (define-pitch df3 3 1)
   7.141-;; (define-pitch d3 3 2) 
   7.142-;; (define-pitch ds3 3 3)
   7.143-;; (define-pitch ef3 3 3)
   7.144-;; (define-pitch e3 3 4)
   7.145-;; (define-pitch ff3 3 4)
   7.146-;; (define-pitch f3 3 5)
   7.147-;; (define-pitch es3 3 5)
   7.148-;; (define-pitch fs3 3 6)
   7.149-;; (define-pitch gf3 3 6)
   7.150-;; (define-pitch g3 3 7) 
   7.151-;; (define-pitch gs3 3 8)
   7.152-;; (define-pitch af3 3 8)
   7.153-;; (define-pitch a3 3 9) 
   7.154-;; (define-pitch as3 3 10)
   7.155-;; (define-pitch bf3 3 10)
   7.156-;; (define-pitch b3 3 11) 
   7.157-;; (define-pitch cf3 3 -1)
   7.158-;; (define-pitch bs3 3 12) 
   7.159-
   7.160-;; (define-pitch c4 4 0)
   7.161-;; (define-pitch cs4 4 1)
   7.162-;; (define-pitch df4 4 1)
   7.163-;; (define-pitch d4 4 2) 
   7.164-;; (define-pitch ds4 4 3)
   7.165-;; (define-pitch ef4 4 3)
   7.166-;; (define-pitch e4 4 4)
   7.167-;; (define-pitch ff4 4 4)
   7.168-;; (define-pitch f4 4 5)
   7.169-;; (define-pitch es4 4 5)
   7.170-;; (define-pitch fs4 4 6)
   7.171-;; (define-pitch gf4 4 6)
   7.172-;; (define-pitch g4 4 7) 
   7.173-;; (define-pitch gs4 4 8)
   7.174-;; (define-pitch af4 4 8)
   7.175-;; (define-pitch a4 4 9) 
   7.176-;; (define-pitch as4 4 10)
   7.177-;; (define-pitch bf4 4 10)
   7.178-;; (define-pitch b4 4 11) 
   7.179-;; (define-pitch cf4 4 -1)
   7.180-;; (define-pitch bs4 4 12) 
   7.181-
   7.182-;; (define-pitch c5 5 0)
   7.183-;; (define-pitch cs5 5 1)
   7.184-;; (define-pitch df5 5 1)
   7.185-;; (define-pitch d5 5 2) 
   7.186-;; (define-pitch ds5 5 3)
   7.187-;; (define-pitch ef5 5 3)
   7.188-;; (define-pitch e5 5 4)
   7.189-;; (define-pitch ff5 5 4)
   7.190-;; (define-pitch f5 5 5)
   7.191-;; (define-pitch es5 5 5)
   7.192-;; (define-pitch fs5 5 6)
   7.193-;; (define-pitch gf5 5 6)
   7.194-;; (define-pitch g5 5 7) 
   7.195-;; (define-pitch gs5 5 8)
   7.196-;; (define-pitch af5 5 8)
   7.197-;; (define-pitch a5 5 9) 
   7.198-;; (define-pitch as5 5 10)
   7.199-;; (define-pitch bf5 5 10)
   7.200-;; (define-pitch b5 5 11) 
   7.201-;; (define-pitch cf5 5 -1)
   7.202-;; (define-pitch bs5 5 12) 
   7.203-
   7.204-;; (define-pitch c6 6 0)
   7.205-;; (define-pitch cs6 6 1)
   7.206-;; (define-pitch df6 6 1)
   7.207-;; (define-pitch d6 6 2) 
   7.208-;; (define-pitch ds6 6 3)
   7.209-;; (define-pitch ef6 6 3)
   7.210-;; (define-pitch e6 6 4)
   7.211-;; (define-pitch ff6 6 4)
   7.212-;; (define-pitch f6 6 5)
   7.213-;; (define-pitch es6 6 5)
   7.214-;; (define-pitch fs6 6 6)
   7.215-;; (define-pitch gf6 6 6)
   7.216-;; (define-pitch g6 6 7) 
   7.217-;; (define-pitch gs6 6 8)
   7.218-;; (define-pitch af6 6 8)
   7.219-;; (define-pitch a6 6 9) 
   7.220-;; (define-pitch as6 6 10)
   7.221-;; (define-pitch bf6 6 10)
   7.222-;; (define-pitch b6 6 11) 
   7.223-;; (define-pitch cf6 6 -1)
   7.224-;; (define-pitch bs6 6 12) 
   7.225-
   7.226-;; (define-pitch c7 7 0)
   7.227-;; (define-pitch cs7 7 1)
   7.228-;; (define-pitch df7 7 1)
   7.229-;; (define-pitch d7 7 2) 
   7.230-;; (define-pitch ds7 7 3)
   7.231-;; (define-pitch ef7 7 3)
   7.232-;; (define-pitch e7 7 4)
   7.233-;; (define-pitch ff7 7 4)
   7.234-;; (define-pitch f7 7 5)
   7.235-;; (define-pitch es7 7 5)
   7.236-;; (define-pitch fs7 7 6)
   7.237-;; (define-pitch gf7 7 6)
   7.238-;; (define-pitch g7 7 7) 
   7.239-;; (define-pitch gs7 7 8)
   7.240-;; (define-pitch af7 7 8)
   7.241-;; (define-pitch a7 7 9) 
   7.242-;; (define-pitch as7 7 10)
   7.243-;; (define-pitch bf7 7 10)
   7.244-;; (define-pitch b7 7 11) 
   7.245-;; (define-pitch cf7 7 -1)
   7.246-;; (define-pitch bs7 7 12) 
   7.247-
   7.248-;; (define-pitch c8 8 0)
   7.249-;; (define-pitch cs8 8 1)
   7.250-;; (define-pitch df8 8 1)
   7.251-;; (define-pitch d8 8 2) 
   7.252-;; (define-pitch ds8 8 3)
   7.253-;; (define-pitch ef8 8 3)
   7.254-;; (define-pitch e8 8 4)
   7.255-;; (define-pitch ff8 8 4)
   7.256-;; (define-pitch f8 8 5)
   7.257-;; (define-pitch es8 8 5)
   7.258-;; (define-pitch fs8 8 6)
   7.259-;; (define-pitch gf8 8 6)
   7.260-;; (define-pitch g8 8 7) 
   7.261-;; (define-pitch gs8 8 8)
   7.262-;; (define-pitch af8 8 8)
   7.263-;; (define-pitch a8 8 9) 
   7.264-;; (define-pitch as8 8 10)
   7.265-;; (define-pitch bf8 8 10)
   7.266-;; (define-pitch b8 8 11) 
   7.267-;; (define-pitch cf8 8 -1)
   7.268-;; (define-pitch bs8 8 12) 
   7.269-
     9.1--- a/lisp/lib/skel/core/pkg.lisp	Tue Oct 01 22:29:08 2024 -0400
     9.2+++ b/lisp/lib/skel/core/pkg.lisp	Tue Oct 01 23:34:01 2024 -0400
     9.3@@ -9,14 +9,12 @@
     9.4    :skel-io-error
     9.5    :skel-compile-error))
     9.6 
     9.7-(defpackage :skel/core/types
     9.8-  (:use :cl :std)
     9.9-  (:export :vc-designator :license-designator :script-designator
    9.10-   :contact-designator))
    9.11-
    9.12 (defpackage :skel/core/proto
    9.13   (:use :cl :std)
    9.14   (:export
    9.15+   ;; types
    9.16+   :vc-designator :license-designator :script-designator :contact-designator
    9.17+   ;; generics
    9.18    :sk-run :sk-new 
    9.19    :sk-tangle :sk-weave
    9.20    :sk-call :sk-call*
    9.21@@ -53,7 +51,7 @@
    9.22    :make-shebang-comment))
    9.23 
    9.24 (defpackage :skel/core/vars
    9.25-  (:use :cl :std :skel/core/types)
    9.26+  (:use :cl :std :skel/core/proto)
    9.27   (:import-from :sb-unix :uid-username :unix-getuid)
    9.28   (:export :*user-skelrc* :*system-skelrc* :*keep-ast*
    9.29    :*skel-project* :*default-skelrc*
    9.30@@ -64,7 +62,7 @@
    9.31 
    9.32 (defpackage :skel/core/obj
    9.33   (:use :cl :std :obj
    9.34-   :skel/core/proto :skel/core/err :skel/core/types :skel/core/vars
    9.35+   :skel/core/proto :skel/core/err :skel/core/vars
    9.36    :dat/sxp :skel/core/header :vc :log)
    9.37   (:import-from :uiop :ensure-absolute-pathname :read-file-forms)
    9.38   (:export :sk-license :sk-author :sk-stash :sk-cache :sk-registry :sk-user
    9.39@@ -139,6 +137,6 @@
    9.40            :init-skel-function-scope))
    9.41 
    9.42 (defpackage :skel/core/print
    9.43-  (:use :cl :std :skel/core/err :skel/core/obj :skel/core/types :skel/core/proto :skel/core/vars)
    9.44+  (:use :cl :std :skel/core/err :skel/core/obj :skel/core/proto :skel/core/vars)
    9.45   (:export
    9.46    :*sk-print-dispatch-table*))
    10.1--- a/lisp/lib/skel/core/proto.lisp	Tue Oct 01 22:29:08 2024 -0400
    10.2+++ b/lisp/lib/skel/core/proto.lisp	Tue Oct 01 23:34:01 2024 -0400
    10.3@@ -1,6 +1,19 @@
    10.4 ;;; Proto
    10.5 (in-package :skel/core/proto)
    10.6 
    10.7+(deftype vc-designator () `(member :hg :git list))
    10.8+
    10.9+;; ref: https://spdx.org/licenses/
   10.10+(deftype license-designator () `(or null string pathname (member :mpl2 :wtfpl :lgpg :llgpl :gpl :mit :mit0)))
   10.11+
   10.12+(deftype script-designator () '(member :bin :sh :bash :zsh :nu :lisp :python))
   10.13+
   10.14+(deftype document-designator () '(member :org :txt :pdf :html :md))
   10.15+
   10.16+(deftype stack-slot-kind () '(member :shell :lisp :comment :var :rule :directive :nop))
   10.17+
   10.18+(deftype contact-designator () '(or string (cons string string)))
   10.19+
   10.20 (defgeneric sk-run (self)
   10.21   (:documentation "Run the object SELF."))
   10.22 (defgeneric sk-new (self &rest args &key &allow-other-keys)
    11.1--- a/lisp/lib/skel/core/types.lisp	Tue Oct 01 22:29:08 2024 -0400
    11.2+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
    11.3@@ -1,14 +0,0 @@
    11.4-(in-package :skel/core/types)
    11.5-
    11.6-(deftype vc-designator () `(member :hg :git list))
    11.7-
    11.8-;; ref: https://spdx.org/licenses/
    11.9-(deftype license-designator () `(or null string pathname (member :mpl2 :wtfpl :lgpg :llgpl :gpl :mit :mit0)))
   11.10-
   11.11-(deftype script-designator () '(member :bin :sh :bash :zsh :nu :lisp :python))
   11.12-
   11.13-(deftype document-designator () '(member :org :txt :pdf :html :md))
   11.14-
   11.15-(deftype stack-slot-kind () '(member :shell :lisp :comment :var :rule :directive :nop))
   11.16-
   11.17-(deftype contact-designator () '(or string (cons string string)))
    12.1--- a/lisp/lib/skel/pkg.lisp	Tue Oct 01 22:29:08 2024 -0400
    12.2+++ b/lisp/lib/skel/pkg.lisp	Tue Oct 01 23:34:01 2024 -0400
    12.3@@ -32,9 +32,8 @@
    12.4 ;;; Code:
    12.5 (pkg:defpkg :skel/core
    12.6   (:use :cl :std)
    12.7-  (:use-reexport :skel/core/err :skel/core/types :skel/core/proto
    12.8-   :skel/core/vars :skel/core/header :skel/core/obj :skel/core/util
    12.9-   :skel/core/vm :dat/sxp))
   12.10+  (:use-reexport :skel/core/err :skel/core/proto :skel/core/vars 
   12.11+   :skel/core/header :skel/core/obj :skel/core/util :skel/core/vm :dat/sxp))
   12.12 
   12.13 (pkg:defpkg :skel/comp
   12.14   (:use :cl :std)
    13.1--- a/lisp/lib/skel/skel.asd	Tue Oct 01 22:29:08 2024 -0400
    13.2+++ b/lisp/lib/skel/skel.asd	Tue Oct 01 23:34:01 2024 -0400
    13.3@@ -16,7 +16,6 @@
    13.4     :components 
    13.5     ((:file "pkg")
    13.6      (:file "err")
    13.7-     (:file "types")
    13.8      (:file "proto")
    13.9      (:file "header")
   13.10      (:file "vars")