;;; ll-list --- ll list -*- lexical-binding: t -*- ;; ;;; Commentary: ;; ;;; Code: (require 'cl-lib) (cl-pushnew "." load-path :test #'string=) (require 'll nil t) (require 'll-type nil t) (defun --- (s) (if (sequ s) (length s) 0)) (defun ll-drop-center (lst) (cl-assert (su lst)) (when-let* ((len (--- lst)) (hlf (/ len 2))) `(,@(take hlf lst) ,@(last lst (if (evenp len) (1- hlf) hlf))))) ;; (ll-drop-center '( ) ) ; ( ) ;; (ll-drop-center '( 1 )) ; ( _ ) ;; (ll-drop-center '( 1 2 )) ; ( 1 _ ) ;; (ll-drop-center '( 1 2 3 )) ; ( 1 _ 3 ) ;; (ll-drop-center '( 1 2 3 4 )) ; ( 1 2 _ 4 ) ;; (ll-drop-center '( 1 2 3 4 5 )) ; ( 1 2 _ 4 5 ) ;; (ll-drop-center '( 1 2 3 4 5 6 )) ; ( 1 2 3 _ 5 6 ) ;; (ll-drop-center '( 1 2 3 4 5 6 7 )) ; ( 1 2 3 _ 5 6 7 ) (defun l= (l1 l2) (cl-assert (su l1)) (cl-assert (su l2)) (equal l1 l2)) (defun !l= (l1 l2) (cl-assert (lu l1)) (cl-assert (lu l2)) (! (l= l1 l2))) (defun 1st (l) (or (& (lu l) (car l)) (& (vu l) (aref l 0)))) (defun 2nd (l) (or (& (lu l) (cadr l)) (& (vu l) (aref l 1)))) (defun 3rd (l) (or (& (lu l) (caddr l)) (& (vu l) (aref l 2)))) (defun 4th (l) (or (& (lu l) (cadddr l)) (& (vu l) (aref l 3)))) ;; used to be up to (caddddr l) ;; used to be up to (cadddddr l) ;; used to be up to (caddddddr l) ;; used to be up to (cadddddddr l) (defmacro ll-pushlast (e lst) (declare (debug (form gv-place))) (macroexp-let2 macroexp-copyable-p x e (gv-letplace (get set) lst (funcall set `(append ,get (cons ,e nil)))))) (defun seq-butlast (l &optional n) (cl-assert (lu l)) (cl-assert (ni n)) (seq-take l (- (--- l) n))) (defun seq-last (l &optional n) (cl-assert (lu l)) (cl-assert (ni n)) (seq-subseq l (- (--- l) n))) (defun ll-shift (l &optional n) (cl-assert (lu l)) (or (& (ni n) n) (& (nf n) (r n)) (setf n 1)) (let ((len (--- l))) (if (or (--- len) (z n)) l (setf n (m n len)) (append (last l n) (butlast l n))))) (provide 'll-list) ;;; ll-list.el ends here