[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[elpa] master c2cbe67: * externals-list: Convert myers to :external
From: |
Stefan Monnier |
Subject: |
[elpa] master c2cbe67: * externals-list: Convert myers to :external |
Date: |
Sat, 28 Nov 2020 19:09:55 -0500 (EST) |
branch: master
commit c2cbe6718cf3af91cd42ed12c9fa645ef21ec601
Author: Stefan Monnier <monnier@iro.umontreal.ca>
Commit: Stefan Monnier <monnier@iro.umontreal.ca>
* externals-list: Convert myers to :external
---
externals-list | 3 +-
packages/myers/myers.el | 196 ------------------------------------------------
2 files changed, 2 insertions(+), 197 deletions(-)
diff --git a/externals-list b/externals-list
index 9021f72..665eea3 100644
--- a/externals-list
+++ b/externals-list
@@ -104,7 +104,7 @@
("ioccur" :external
"https://github.com/thierryvolpiatto/ioccur.git")
("ivy-explorer" :external "https://github.com/clemera/ivy-explorer")
("ivy-posframe" :external "https://github.com/tumashu/ivy-posframe")
- ("jgraph-mode" :external nil)
+ ("jgraph-mode" :external nil)
("js2-mode" :external "https://github.com/mooz/js2-mode.git")
("jsonrpc" :core "lisp/jsonrpc.el")
("leaf" :external "https://github.com/conao3/leaf.el")
@@ -115,6 +115,7 @@
("modus-operandi-theme":external
"https://gitlab.com/protesilaos/modus-themes")
("modus-vivendi-theme" :external
"https://gitlab.com/protesilaos/modus-themes")
("muse" :external "https://github.com/alexott/muse") ;FIXME:
Not nearly in-sync
+ ("myers" :external nil)
("nameless" :external "https://github.com/Malabarba/Nameless")
("names" :external "http://github.com/Malabarba/names")
("nhexl-mode" :external nil)
diff --git a/packages/myers/myers.el b/packages/myers/myers.el
deleted file mode 100644
index e52dd6a..0000000
--- a/packages/myers/myers.el
+++ /dev/null
@@ -1,196 +0,0 @@
-;;; myers.el --- Random-access singly-linked lists -*- lexical-binding: t;
-*-
-
-;; Copyright (C) 2016 Free Software Foundation, Inc.
-
-;; Author: Stefan Monnier <monnier@iro.umontreal.ca>
-;; Keywords: list, containers
-;; Package-Requires: ((emacs "25"))
-;; Version: 0.1
-
-;; This program is free software; you can redistribute it and/or modify
-;; it under the terms of the GNU General Public License as published by
-;; the Free Software Foundation, either version 3 of the License, or
-;; (at your option) any later version.
-
-;; This program is distributed in the hope that it will be useful,
-;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-;; GNU General Public License for more details.
-
-;; You should have received a copy of the GNU General Public License
-;; along with this program. If not, see <http://www.gnu.org/licenses/>.
-
-;;; Commentary:
-
-;; This package implements Eugene W. Myers's "stacks" which are like
-;; standard singly-linked lists, except that they also provide efficient
-;; lookup. More specifically:
-;;
-;; cons/car/cdr are O(1), while (nthcdr N L) is O(min (N, log L))
-;;
-;; For details, see "An applicative random-access stack", Eugene W. Myers,
-;; 1983, Information Processing Letters
-;;
http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.188.9344&rep=rep1&type=pdf
-
-;;; Code:
-
-(require 'cl-lib)
-(require 'seq)
-
-(cl-defstruct (myers
- (:copier nil)
- (:constructor nil)
- (:conc-name myers--)
- (:constructor myers--cons (car cdr skip-distance skip)))
- (car nil :read-only t)
- (cdr nil :read-only t :type (or null myers))
- ;; Contrary to Myers's presentation, we index from the top of the stack,
- ;; and we don't store the total length but the "skip distance" instead.
- ;; This makes `cons' slightly faster, and better matches our use for
- ;; debruijn environments.
- (skip-distance nil :read-only t :type integer)
- (skip nil :read-only t :type (or null myers)))
-
-(defun myers-cons (car cdr)
- "Create a new Myers cons, give it CAR and CDR as components, and return it.
-This like `cons' but for Myers's lists."
- (if (null cdr)
- (myers--cons car cdr 1 cdr)
- (let ((s1 (myers--skip-distance cdr))
- (cddr (myers--skip cdr)))
- (if (null cddr)
- (myers--cons car cdr 1 cdr)
- (let ((s2 (myers--skip-distance cddr))
- (cdddr (myers--skip cddr)))
- (if (<= s2 s1)
- (myers--cons car cdr (+ 1 s1 s2) cdddr)
- (myers--cons car cdr 1 cdr)))))))
-
-(defun myers-list (&rest objects)
- "Return a newly created list with specified arguments as elements."
- (let ((list nil))
- (dolist (x (nreverse objects))
- (setq list (myers-cons x list)))
- list))
-
-;; FIXME: Should myers-car/cdr just defer to myers--car/cdr, or should they
-;; reproduce car/cdr's behavior more faithfully and return nil when the arg
-;; is nil?
-(defalias 'myers-car #'myers--car)
-(defalias 'myers-cdr #'myers--cdr)
-
-(pcase-defmacro myers-cons (car cdr)
- `(cl-struct myers (car ,car) (cdr ,cdr)))
-
-(defun myers-nthcdr (n list)
- "Take `myers-cdr' N times on LIST, return the result."
- (while (and (> n 0) list)
- (let ((s (myers--skip-distance list)))
- (if (<= s n)
- (setq n (- n s) list (myers--skip list))
- (setq n (- n 1) list (myers--cdr list)))))
- list)
-
-;; This operation would be more efficient using Myers's choice of keeping
-;; the length (instead of the skip-distance) in each node.
-(cl-defmethod seq-length ((seq myers))
- (let ((n 0))
- (while seq
- (cl-incf n (myers--skip-distance seq))
- (setq seq (myers--skip seq)))
- n))
-
-(cl-defmethod seq-elt ((seq myers) n)
- (let ((l (myers-nthcdr n seq)))
- (when l (myers--car l))))
-
-
-(cl-defmethod seq-do (fun (seq myers))
- (while seq
- (funcall fun (myers--car seq))
- (setq seq (myers--cdr seq))))
-
-(cl-defmethod seqp ((_seq myers)) t)
-
-(cl-defmethod seq-copy ((seq myers))
- (let ((elts ()))
- (while seq
- (push (myers--car seq) elts)
- (setq seq (myers--cdr seq)))
- (dolist (elt elts)
- (setq seq (myers-cons elt seq)))
- seq))
-
-(cl-defmethod seq-subseq ((seq myers) start &optional end)
- (when (< start 0)
- (let ((nstart (+ (seq-length seq) start)))
- (if (< nstart 0)
- (signal 'args-out-of-range (list seq start))
- (setq start nstart))))
- (setq seq (myers-nthcdr start seq))
- (if (null end)
- (seq-copy seq)
- (let ((nend (if (>= end 0)
- (- end start)
- (+ end (seq-length seq)))))
- (if (< nend 0)
- (signal 'args-out-of-range (list seq end))
- (setq end nend)))
- (let ((elts ())
- (res ()))
- (dotimes (_ end)
- (push (myers--car seq) elts)
- (setq seq (myers--cdr seq)))
- (dolist (elt elts)
- (setq res (myers-cons elt res)))
- res)))
-
-(cl-defmethod seq-empty-p ((_seq myers)) nil)
-
-(cl-defmethod seq-reverse ((seq myers))
- (let ((res ()))
- (while seq
- (setq res (myers-cons (myers--car seq) res))
- (setq seq (myers--cdr seq)))
- res))
-
-(defun myers-find (pred list)
- "Find the first element of LIST for which PRED returns non-nil.
-\"Binary\" search, assuming the list is \"sorted\" (i.e. all elements after
-this one also return true).
-Return the node holding that element (or nil, if none found)."
- (while
- (when list
- (if (funcall pred (myers--car list))
- nil
- (let ((l2 (myers--skip list)))
- (setq list (myers--cdr list))
- (if (eq l2 list)
- t
- (while
- (and l2 (not (funcall pred (myers--car l2)))
- (progn
- (setq list (myers--cdr l2))
- (setq l2 (myers--skip l2))
- t))))
- t))))
- list)
-
-;; (* Find the last node for which the predicate `p' is false.
-;; * "Binary" search, assuming the list is "sorted" (i.e. all elements after
-;; * this one also return true). *)
-;; let rec findcdr p l =
-;; let rec findcdr2 last l1 l2 =
-;; match l1,l2 with
-;; | _, (Mcons (x, l1, _, l2) as l) when not (p x) -> findcdr2 (Some l) l1
l2
-;; | l, _ -> findcdr1 last l
-;; and findcdr1 last l =
-;; match l with
-;; | Mnil -> last
-;; | Mcons (x, _, _, _) when p x -> last
-;; | Mcons (_, l1, _, l2) -> findcdr2 (Some l) l1 l2
-;; in findcdr1 None l
-
-
-(provide 'myers)
-;;; myers.el ends here
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [elpa] master c2cbe67: * externals-list: Convert myers to :external,
Stefan Monnier <=