(in-package #:str) (declaim (optimize (speed 3) (safety 0))) (declaim (ftype (function ((or pathname string)) (values string &optional)) read-file)) (defun read-file (path) (with-open-file (file path) (let* ((size (file-length file)) (buf (make-string size))) (read-sequence buf file) buf))) (declaim (ftype (function (simple-string simple-string) (values (cons string) &optional)) split)) (defun split (input delimiter) (defun split-rec (result start) (let ((next (search delimiter input :start2 start))) (if next (split-rec (queue:add result (subseq input start next)) (min (+ (length delimiter) next) (length input))) (queue:add result (subseq input start next))))) (queue:to-list (split-rec (queue:new) 0))) (declaim (ftype (function ((cons character)) (values simple-string &optional)) from-list)) (defun from-list (lst) (let ((str (make-string (length lst))) (i 0)) (dolist (item lst) (setf (char str i) item) (incf i)) str))