* [ANN] New library stream.el in ELPA @ 2015-10-14 11:43 Nicolas Petton 2015-10-14 12:37 ` Michael Heerdegen ` (3 more replies) 0 siblings, 4 replies; 32+ messages in thread From: Nicolas Petton @ 2015-10-14 11:43 UTC (permalink / raw) To: emacs-devel [-- Attachment #1: Type: text/plain, Size: 1632 bytes --] Hi, I just pushed to ELPA the first version of `stream', a new library that provides an implementation of streams. Streams are implemented as delayed evaluation of cons cells, and are immutable. In that sense they are similar to streams in the SICP book[1] or to Clojure's lazy sequences. `stream' requires Emacs >= 25.1, as it leverages the extensibility of seq.el (the version currently in master, not the one in ELPA): all functions defined in seq.el will work on streams, meaning that it's possible to consume a stream using `seq-take', map and filter it using `seq-map` and `seq-filter`, and so forth. Streams could be created from any sequential input data: - sequences, making operation on them lazy - a set of 2 forms (first and rest), making it easy to represent infinite sequences - buffers (by character) - buffers (by line) - buffers (by page) - IO streams - orgmode table cells - ... The generic `stream' function currently accepts lists, strings, arrays and buffers as input, but it can be cleanly extended to support pretty much any kind of data. All operations on streams are lazy (including the functions from seq.el), unless data is actually needed. Here is an example implementation of the Fibonacci numbers implemented as in infinite stream: (defun fib (a b) (stream-cons a (fib b (+ a b)))) (fib 0 1) The following example returns a stream of the first 50 characters of the current buffer: (seq-take (stream (current-buffer)) 50) Cheers, Nico [1] https://mitpress.mit.edu/sicp/full-text/book/book-Z-H-24.html#%_sec_3.5 [-- Attachment #2: signature.asc --] [-- Type: application/pgp-signature, Size: 512 bytes --] ^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: [ANN] New library stream.el in ELPA 2015-10-14 11:43 [ANN] New library stream.el in ELPA Nicolas Petton @ 2015-10-14 12:37 ` Michael Heerdegen 2015-10-14 13:20 ` Nicolas Petton 2015-10-14 13:30 ` Nicolas Petton 2015-10-14 16:09 ` John Wiegley ` (2 subsequent siblings) 3 siblings, 2 replies; 32+ messages in thread From: Michael Heerdegen @ 2015-10-14 12:37 UTC (permalink / raw) To: emacs-devel Nicolas Petton <nicolas@petton.fr> writes: > I just pushed to ELPA the first version of `stream', a new library that > provides an implementation of streams. Streams are implemented as > delayed evaluation of cons cells, and are immutable. In that sense they > are similar to streams in the SICP book[1] or to Clojure's lazy > sequences. FWIW, I implemented quite the same some years ago, but never got happy with it. The problem was that streams defined via delayed conses end up to be massively nested lambda structures. Emacs has no tail recursion, and sooner or later, I always ended with very simple examples, like computing the 500nth prime in the stream of primes, hitting the `max-lisp-eval-depth' limit. I don't recall the details of a counterexample, but I ended up dismissing the approach completely, because it was hopeless. Then I switched to working with generator.el, and defined a different form of streams I called "ilists". These are like normal lists, but (speaking simplified) the last cdr contains a rule to compute more elements on the fly when they are referenced. That approach gives you a quite similar kind of semantical thing offering the same functionality, without the deadly recursion problem. My fear is that you will soon see `max-lisp-eval-depth' related errors when doing very simple things with your streams and trying to reference element 500 or so. Sorry, but I really don't recall a good counterexample. It would be great if I'm proven wrong by your implementation, but I'm not optimistic. I tried with your package (defun fib (a b) (stream-cons a (fib b (+ a b)))) (seq-elt (fib 0 1) 10) but got the error unless: Symbol’s value as variable is void: #:forced Regards, Michael. ^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: [ANN] New library stream.el in ELPA 2015-10-14 12:37 ` Michael Heerdegen @ 2015-10-14 13:20 ` Nicolas Petton 2015-10-14 13:33 ` Michael Heerdegen 2015-10-14 13:30 ` Nicolas Petton 1 sibling, 1 reply; 32+ messages in thread From: Nicolas Petton @ 2015-10-14 13:20 UTC (permalink / raw) To: Michael Heerdegen, emacs-devel [-- Attachment #1: Type: text/plain, Size: 318 bytes --] Michael Heerdegen <michael_heerdegen@web.de> writes: > I tried with your package > > (defun fib (a b) > (stream-cons a (fib b (+ a b)))) > > (seq-elt (fib 0 1) 10) > > but got the error > > unless: Symbol’s value as variable is void: #:forced Have you tried turning on lexical binding? Nico [-- Attachment #2: signature.asc --] [-- Type: application/pgp-signature, Size: 512 bytes --] ^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: [ANN] New library stream.el in ELPA 2015-10-14 13:20 ` Nicolas Petton @ 2015-10-14 13:33 ` Michael Heerdegen 0 siblings, 0 replies; 32+ messages in thread From: Michael Heerdegen @ 2015-10-14 13:33 UTC (permalink / raw) To: emacs-devel Nicolas Petton <nicolas@petton.fr> writes: > > unless: Symbol’s value as variable is void: #:forced > > Have you tried turning on lexical binding? Not in the Gnus Article buffer ;-) That was it, the example works now - thanks. Regards, Michael. P.S. BTW, forgot to say that the ilist def is "iterators.el". ^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: [ANN] New library stream.el in ELPA 2015-10-14 12:37 ` Michael Heerdegen 2015-10-14 13:20 ` Nicolas Petton @ 2015-10-14 13:30 ` Nicolas Petton 2015-10-14 22:13 ` Michael Heerdegen 1 sibling, 1 reply; 32+ messages in thread From: Nicolas Petton @ 2015-10-14 13:30 UTC (permalink / raw) To: Michael Heerdegen, emacs-devel [-- Attachment #1: Type: text/plain, Size: 531 bytes --] Michael Heerdegen <michael_heerdegen@web.de> writes: > My fear is that you will soon see `max-lisp-eval-depth' related errors > when doing very simple things with your streams and trying to reference > element 500 or so. Sorry, but I really don't recall a good > counterexample. That could happen if you tried to read an entire large stream at once, but why would you do that, and not use instead a sequence? If you do stream it, using `stream-first' and `stream-rest' for instance, you shouldn't have this issue, right? Nico [-- Attachment #2: signature.asc --] [-- Type: application/pgp-signature, Size: 512 bytes --] ^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: [ANN] New library stream.el in ELPA 2015-10-14 13:30 ` Nicolas Petton @ 2015-10-14 22:13 ` Michael Heerdegen 2015-10-15 7:38 ` Nicolas Petton 0 siblings, 1 reply; 32+ messages in thread From: Michael Heerdegen @ 2015-10-14 22:13 UTC (permalink / raw) To: Nicolas Petton; +Cc: emacs-devel Nicolas Petton <nicolas@petton.fr> writes: > If you do stream it, using `stream-first' and `stream-rest' for > instance, you shouldn't have this issue, right? I don't remember. Maybe your implementation is cleverer than mine was ;-) I tried this stress test with your lib: --8<---------------cut here---------------start------------->8--- (defun stream-append (s1 s2) (if (stream-empty-p s1) s2 (stream-cons (stream-first s1) (stream-append (stream-rest s1) s2)))) (seq-elt (stream-append (stream (cl-loop for i from 1 to 100 collect i)) (seq-filter #'cl-oddp (stream-append (stream (cl-loop for i from 1 to 50000 collect i)) (seq-map #'1+ (stream (cl-loop for i from 50001 to 100001 collect i)))))) 40000) --8<---------------cut here---------------end--------------->8--- What can I say - it work well! BTW, is `stream-append' missing in your library, or should that be done via some `seq' function? Regards, Michael. ^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: [ANN] New library stream.el in ELPA 2015-10-14 22:13 ` Michael Heerdegen @ 2015-10-15 7:38 ` Nicolas Petton 0 siblings, 0 replies; 32+ messages in thread From: Nicolas Petton @ 2015-10-15 7:38 UTC (permalink / raw) To: Michael Heerdegen; +Cc: emacs-devel [-- Attachment #1: Type: text/plain, Size: 1146 bytes --] Michael Heerdegen <michael_heerdegen@web.de> writes: > I tried this stress test with your lib: > > --8<---------------cut here---------------start------------->8--- > (defun stream-append (s1 s2) > (if (stream-empty-p s1) s2 > (stream-cons > (stream-first s1) > (stream-append (stream-rest s1) s2)))) > > (seq-elt (stream-append > (stream (cl-loop for i from 1 to 100 collect i)) > (seq-filter > #'cl-oddp > (stream-append > (stream (cl-loop for i from 1 to 50000 collect i)) > (seq-map #'1+ (stream (cl-loop for i from 50001 to 100001 collect i)))))) > 40000) > --8<---------------cut here---------------end--------------->8--- > > What can I say - it work well! :-) > > BTW, is `stream-append' missing in your library, or should that be done > via some `seq' function? It could be done with `seq-concatenate', but it would not be lazy, and would return a sequence (consuming the entire stream!). Adding `stream-append' would indeed make sense. The repository is https://github.com/NicolasPetton/stream, if you want to send me a patch. Nico [-- Attachment #2: signature.asc --] [-- Type: application/pgp-signature, Size: 512 bytes --] ^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: [ANN] New library stream.el in ELPA 2015-10-14 11:43 [ANN] New library stream.el in ELPA Nicolas Petton 2015-10-14 12:37 ` Michael Heerdegen @ 2015-10-14 16:09 ` John Wiegley 2015-10-14 16:20 ` Nicolas Petton 2015-10-15 10:08 ` Michael Heerdegen 2015-10-15 20:28 ` John Mastro 2015-10-24 19:16 ` Michael Heerdegen 3 siblings, 2 replies; 32+ messages in thread From: John Wiegley @ 2015-10-14 16:09 UTC (permalink / raw) To: emacs-devel >>>>> Nicolas Petton <nicolas@petton.fr> writes: > Here is an example implementation of the Fibonacci numbers implemented as in > infinite stream: > (defun fib (a b) > (stream-cons a (fib b (+ a b)))) > (fib 0 1) How bizarre, just yesterday I started a file called "thunks.el" to generalize this kind of behavior. Since I didn't get very far, I'm glad to see the idea taking shape elsewhere! What I wonder is, can you generalize this beyond cons cells? I mean, can we have a general lazy evaluation framework, instead of just lazy lists? The API I was thinking of was: (let ((x (thunk-create FORM))) (thunk-eval x)) The idea being that 'x' is a self-modifying thunk which only evaluates FORM the first time it is forced, but immediately returns the result value after. I think that stream-cons and seq-take could be implemented on top of this lower-level behavior. John ^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: [ANN] New library stream.el in ELPA 2015-10-14 16:09 ` John Wiegley @ 2015-10-14 16:20 ` Nicolas Petton 2015-10-14 16:40 ` John Wiegley 2015-10-15 10:08 ` Michael Heerdegen 1 sibling, 1 reply; 32+ messages in thread From: Nicolas Petton @ 2015-10-14 16:20 UTC (permalink / raw) To: John Wiegley, emacs-devel [-- Attachment #1: Type: text/plain, Size: 1028 bytes --] John Wiegley <johnw@newartisans.com> writes: > How bizarre, just yesterday I started a file called "thunks.el" to generalize > this kind of behavior. Since I didn't get very far, I'm glad to see the idea > taking shape elsewhere! > > What I wonder is, can you generalize this beyond cons cells? I mean, can we > have a general lazy evaluation framework, instead of just lazy lists? The API > I was thinking of was: > > (let ((x (thunk-create FORM))) > (thunk-eval x)) > > The idea being that 'x' is a self-modifying thunk which only evaluates FORM > the first time it is forced, but immediately returns the result value after. > > I think that stream-cons and seq-take could be implemented on top of this > lower-level behavior. stream.el is based on lazy form evaluation with memoization (which is exactly what you describe IIUC), that I didn't need to expose it so I kept it private to the library, see `stream--delay' and `stream-force': https://github.com/NicolasPetton/stream/blob/master/stream.el#L62 Nico [-- Attachment #2: signature.asc --] [-- Type: application/pgp-signature, Size: 512 bytes --] ^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: [ANN] New library stream.el in ELPA 2015-10-14 16:20 ` Nicolas Petton @ 2015-10-14 16:40 ` John Wiegley 2015-10-14 19:31 ` Nicolas Petton 0 siblings, 1 reply; 32+ messages in thread From: John Wiegley @ 2015-10-14 16:40 UTC (permalink / raw) To: emacs-devel; +Cc: Nicolas Petton >>>>> Nicolas Petton <nicolas@petton.fr> writes: > stream.el is based on lazy form evaluation with memoization (which is > exactly what you describe IIUC), that I didn't need to expose it so I kept > it private to the library, see `stream--delay' and `stream-force': > https://github.com/NicolasPetton/stream/blob/master/stream.el#L62 What if you expose the lower-level API, and then make lazy streaming a useful example. I.e., call your module "thunk.el" or "lazy.el". I would have uses for such a library beyond streams of value: for example, querying an external process for a tidbit of information, but abstracting this interaction to appear as a "value" within a thunk. John ^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: [ANN] New library stream.el in ELPA 2015-10-14 16:40 ` John Wiegley @ 2015-10-14 19:31 ` Nicolas Petton 2015-10-14 21:31 ` John Wiegley 0 siblings, 1 reply; 32+ messages in thread From: Nicolas Petton @ 2015-10-14 19:31 UTC (permalink / raw) To: John Wiegley, emacs-devel [-- Attachment #1: Type: text/plain, Size: 998 bytes --] John Wiegley <johnw@newartisans.com> writes: >>>>>> Nicolas Petton <nicolas@petton.fr> writes: > >> stream.el is based on lazy form evaluation with memoization (which is >> exactly what you describe IIUC), that I didn't need to expose it so I kept >> it private to the library, see `stream--delay' and `stream-force': > >> https://github.com/NicolasPetton/stream/blob/master/stream.el#L62 > > What if you expose the lower-level API, and then make lazy streaming a useful > example. I.e., call your module "thunk.el" or "lazy.el". What if I extract it in a thunk.el library and install it in master (with proper tests), and have stream.el use that? (I could also put stream.el in Emacs, but Stefan thought it would be better to have it in ELPA). > I would have uses for such a library beyond streams of value: for example, > querying an external process for a tidbit of information, but abstracting this > interaction to appear as a "value" within a thunk. Yes, that would be really nice! Nico [-- Attachment #2: signature.asc --] [-- Type: application/pgp-signature, Size: 512 bytes --] ^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: [ANN] New library stream.el in ELPA 2015-10-14 19:31 ` Nicolas Petton @ 2015-10-14 21:31 ` John Wiegley 2015-10-14 21:51 ` Nicolas Petton ` (3 more replies) 0 siblings, 4 replies; 32+ messages in thread From: John Wiegley @ 2015-10-14 21:31 UTC (permalink / raw) To: emacs-devel >>>>> Nicolas Petton <nicolas@petton.fr> writes: > What if I extract it in a thunk.el library and install it in master (with > proper tests), and have stream.el use that? (I could also put stream.el in > Emacs, but Stefan thought it would be better to have it in ELPA). Probably I'd prefer to see thunk.el in master, and stream.el in ELPA, since the latter is a bit more special-cased and "implemented in terms of core". If it ends up proving to be a valuable core addition, we can always bring it into master later. We should talk about where to draw "the ELPA divide" at some point too. Core Emacs sort of has at least two separate roles: Functionality the Emacs developers have standardized on -- as a common framework to build packages upon -- and packages that should really be installed anywhere Emacs is installed. John ^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: [ANN] New library stream.el in ELPA 2015-10-14 21:31 ` John Wiegley @ 2015-10-14 21:51 ` Nicolas Petton 2015-10-15 0:42 ` raman ` (2 subsequent siblings) 3 siblings, 0 replies; 32+ messages in thread From: Nicolas Petton @ 2015-10-14 21:51 UTC (permalink / raw) To: John Wiegley, emacs-devel [-- Attachment #1: Type: text/plain, Size: 875 bytes --] John Wiegley <johnw@newartisans.com> writes: >>>>>> Nicolas Petton <nicolas@petton.fr> writes: > >> What if I extract it in a thunk.el library and install it in master (with >> proper tests), and have stream.el use that? (I could also put stream.el in >> Emacs, but Stefan thought it would be better to have it in ELPA). > > Probably I'd prefer to see thunk.el in master, and stream.el in ELPA, since > the latter is a bit more special-cased and "implemented in terms of > core". Agreed. > We should talk about where to draw "the ELPA divide" at some point too. Core > Emacs sort of has at least two separate roles: Functionality the Emacs > developers have standardized on -- as a common framework to build packages > upon -- and packages that should really be installed anywhere Emacs is > installed. I think that would be a fair definition of "the ELPA divide". Nico [-- Attachment #2: signature.asc --] [-- Type: application/pgp-signature, Size: 512 bytes --] ^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: [ANN] New library stream.el in ELPA 2015-10-14 21:31 ` John Wiegley 2015-10-14 21:51 ` Nicolas Petton @ 2015-10-15 0:42 ` raman 2015-10-15 0:48 ` John Wiegley 2015-10-18 18:29 ` Daniel Colascione 2015-10-23 11:30 ` Nicolas Petton 3 siblings, 1 reply; 32+ messages in thread From: raman @ 2015-10-15 0:42 UTC (permalink / raw) To: emacs-devel Speaking from the perspective of building Emacspeak, I only feel comfortable using modules that are already in Core, since I dont want the average emacspeak user to have to pull things from elpa to get the system started up. From that perspective, I would prefer to see streams.el in Master --- though I could likely implement some of what I was thinking of e.g., rapid interactive browsing of content by chunks, where the chunk can be interactively determined etc using think.el just as much as streams.el -- though streams is likely closer to what I would use than the lower level thunk in that case. -- ^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: [ANN] New library stream.el in ELPA 2015-10-15 0:42 ` raman @ 2015-10-15 0:48 ` John Wiegley 0 siblings, 0 replies; 32+ messages in thread From: John Wiegley @ 2015-10-15 0:48 UTC (permalink / raw) To: emacs-devel >>>>> raman <raman@google.com> writes: > Speaking from the perspective of building Emacspeak, I only feel comfortable > using modules that are already in Core, since I dont want the average > emacspeak user to have to pull things from elpa to get the system started > up. Raman, with due respect to your tremendous efforts on Emacspeak, the way that non-Core packages are distributed should not have a bearing on what does and does not go into Core; otherwise, we would be making our choices based on undefinable criteria, like which packages are the most popular. If a package is in ELPA, it can just as easily download its dependencies as itself; if it is not in ELPA, it is outside the scope of this discussion. John ^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: [ANN] New library stream.el in ELPA 2015-10-14 21:31 ` John Wiegley 2015-10-14 21:51 ` Nicolas Petton 2015-10-15 0:42 ` raman @ 2015-10-18 18:29 ` Daniel Colascione 2015-10-19 4:38 ` Stephen J. Turnbull 2015-10-20 12:07 ` David Kastrup 2015-10-23 11:30 ` Nicolas Petton 3 siblings, 2 replies; 32+ messages in thread From: Daniel Colascione @ 2015-10-18 18:29 UTC (permalink / raw) To: emacs-devel [-- Attachment #1: Type: text/plain, Size: 1486 bytes --] On 10/14/2015 02:31 PM, John Wiegley wrote: >>>>>> Nicolas Petton <nicolas@petton.fr> writes: > >> What if I extract it in a thunk.el library and install it in master (with >> proper tests), and have stream.el use that? (I could also put stream.el in >> Emacs, but Stefan thought it would be better to have it in ELPA). > > Probably I'd prefer to see thunk.el in master, and stream.el in ELPA, since > the latter is a bit more special-cased and "implemented in terms of core". If > it ends up proving to be a valuable core addition, we can always bring it into > master later. I prefer keeping code in master. That way, it's easily maintained and distributed automatically. There's very little downside: nobody is going to miss a few tens of kilobytes of compiled elisp. > We should talk about where to draw "the ELPA divide" at some point too. Core > Emacs sort of has at least two separate roles: Functionality the Emacs > developers have standardized on -- as a common framework to build packages > upon -- and packages that should really be installed anywhere Emacs is > installed. I see no need to flake off useful parts of Emacs and put them into ELPA when the core is not resource-constrained. For me, using ELPA packages is a bit more awkward, since I don't use package.el and pull in the bits of ELPA I want manually. If your package is only in ELPA, I probably won't hear about it, and unless it's particularly compelling, I won't use it. [-- Attachment #2: OpenPGP digital signature --] [-- Type: application/pgp-signature, Size: 819 bytes --] ^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: [ANN] New library stream.el in ELPA 2015-10-18 18:29 ` Daniel Colascione @ 2015-10-19 4:38 ` Stephen J. Turnbull 2015-10-20 6:55 ` John Wiegley 2015-10-20 12:07 ` David Kastrup 1 sibling, 1 reply; 32+ messages in thread From: Stephen J. Turnbull @ 2015-10-19 4:38 UTC (permalink / raw) To: Daniel Colascione; +Cc: emacs-devel Daniel Colascione writes: > I prefer keeping code in master. Hackers always do. The vast majority of users aren't hackers, though. The vast majority of that vast majority (the half-vast majority?) loves community package repositories, and for good reason. N.B. I have no opinion on stream.el itself. My opinion is that these stdlib/package repo issues need to be decided case by case, and that in general a bias toward putting stuff in ELPA is not a bad thing. A bias toward putting everything in core should be avoided in the current state of the art. > That way, it's easily maintained and distributed automatically. Assuming it's maintained at all, and FVO "distributed" == "to the hackers who pull from master daily", yes. To industrial users who get their core Emacs from Debian or Red Hat, not so. > There's very little downside: nobody is going to miss a few tens of > kilobytes of compiled elisp. True but irrelevant, even when the specious "few kilobytes" (due to one small module) is replaced by the more realistic "many megabytes" (due to a plethora of small modules and a few monster packages). There is a lot of experience with standard libraries nowadays. A short list of the real tradeoffs involves: 1. Obsolescence/bitrot of stdlib code. 2. Maintainer effort to prevent/remediate (1). 3. Users who need to keep a few modules up to date, but prefer to get their core Emacs + from an OS distro. 4. Developers who always have a current build of master to hand, and can easily rollback using the VCS if that breaks, vs. (3). 5. Paranoid enterprise environments where ordinary programmers have to choose software from a list approved by HQ, and there's no blanket approval for the package repository. (Such users' best hope for access to new features is a short release cycle that fits the convenience of the enterprise's software audit team.) This is really the killer application for "everything in core", but I haven't heard this claim in Emacs channels (and the data I've seen on distribution of versions in a couple of large enterprises suggests that a large majority of industrial users are perfectly happy with 5-year-old Emacsen, and a significant minority often uses 10-year-old Emacsen). 6. Variations in development cycles between core and modules, and among modules. Similarity in cycles argues for joint release and distribution. 7. Discoverability of modules in the stdlib is probably higher, although as we've seen in several threads recently, even those with great interest in the subject can be sadly underinformed about the elephant in the room (eg CEDET/EDE). > I see no need to flake off useful parts of Emacs and put them into ELPA > when the core is not resource-constrained. You haven't noticed that there just aren't enough developers to fix all the bugs yet, let alone develop all of the attractive proposals? That there's only one volunteer for lead maintainer, and he's politically nonaligned in a flagship product of a political organization (not to mention having reservations about top management policy)?[1] 8. Of course to some extent those resource constraints argue for putting everything in core for the convenience of those who *do* do a lot of maintenance work on core. > For me, using ELPA packages is a bit more awkward, Emacs is not just about you and other core developers whose practices are basically similar to yours, though. > since I don't use package.el and pull in the bits of ELPA I want > manually. If your package is only in ELPA, I probably won't hear > about it, and unless it's particularly compelling, I won't use it. You may be more diligent, but Emacs (like other sprawling language and framework projects I know of) is such a mess[2] that most hackers won't use core code if they have to look for it. It's easier to build your own, submit/commit, and let Stefan et al. tell you there's a standard way that also has benefits X, Y, and Z for your application. 9. This is often a good thing, as the existing code may have limitations or even be quite inappropriate for the application to hand. Such experimentation is encouraged by package repos. I could go on, but I'll stop at 9, according to Guido's Rule of Single Digits. Footnotes: [1] I expect these issues to be resolved satisfactorily to all parties. But I wonder if John would have stepped forward if someone who is an enthusiastic advocate of the GNU approach to software freedom had their hat in the ring? [2] Organization of modules is worse than NP-hard. I have found a wonderful proof of this theorem but unfortunately it won't fit in a 4-line .sig. ^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: [ANN] New library stream.el in ELPA 2015-10-19 4:38 ` Stephen J. Turnbull @ 2015-10-20 6:55 ` John Wiegley 2015-10-20 7:02 ` Daniel Colascione 2015-10-20 10:20 ` Stephen J. Turnbull 0 siblings, 2 replies; 32+ messages in thread From: John Wiegley @ 2015-10-20 6:55 UTC (permalink / raw) To: Stephen J. Turnbull; +Cc: Daniel Colascione, emacs-devel >>>>> Stephen J Turnbull <stephen@xemacs.org> writes: > Daniel Colascione writes: >> I prefer keeping code in master. > N.B. I have no opinion on stream.el itself. My opinion is that these > stdlib/package repo issues need to be decided case by case, and that in > general a bias toward putting stuff in ELPA is not a bad thing. A bias > toward putting everything in core should be avoided in the current state of > the art. [...] Stephen summed up what I wanted to say quite nicely. Thank you! Although we have no hard and fast rule yet for what goes into core and ELPA, I expect moving things into core to offer a better reason than "because I want it there". Such a package should provide: - a basic functionality we expect to be commonly used, - supports a package already in core, - provides some justification for being in the default distribution and thus subject to maintenance by the core maintainers. If it can't answer those questions, it should be in ELPA. John ^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: [ANN] New library stream.el in ELPA 2015-10-20 6:55 ` John Wiegley @ 2015-10-20 7:02 ` Daniel Colascione 2015-10-20 15:18 ` John Wiegley 2015-10-20 16:16 ` Jay Belanger 2015-10-20 10:20 ` Stephen J. Turnbull 1 sibling, 2 replies; 32+ messages in thread From: Daniel Colascione @ 2015-10-20 7:02 UTC (permalink / raw) To: Stephen J. Turnbull, emacs-devel [-- Attachment #1: Type: text/plain, Size: 1096 bytes --] On 10/19/2015 11:55 PM, John Wiegley wrote: >>>>>> Stephen J Turnbull <stephen@xemacs.org> writes: > >> Daniel Colascione writes: >>> I prefer keeping code in master. > >> N.B. I have no opinion on stream.el itself. My opinion is that these >> stdlib/package repo issues need to be decided case by case, and that in >> general a bias toward putting stuff in ELPA is not a bad thing. A bias >> toward putting everything in core should be avoided in the current state of >> the art. [...] > > Stephen summed up what I wanted to say quite nicely. Thank you! > > Although we have no hard and fast rule yet for what goes into core and ELPA, I > expect moving things into core to offer a better reason than "because I want > it there". Such a package should provide: > > - a basic functionality we expect to be commonly used, > - supports a package already in core, > - provides some justification for being in the default distribution and > thus subject to maintenance by the core maintainers. So, today, M-x butterfly wouldn't have made the cut? That's sad. [-- Attachment #2: OpenPGP digital signature --] [-- Type: application/pgp-signature, Size: 819 bytes --] ^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: [ANN] New library stream.el in ELPA 2015-10-20 7:02 ` Daniel Colascione @ 2015-10-20 15:18 ` John Wiegley 2015-10-20 16:16 ` Jay Belanger 1 sibling, 0 replies; 32+ messages in thread From: John Wiegley @ 2015-10-20 15:18 UTC (permalink / raw) To: emacs-devel >>>>> Daniel Colascione <dancol@dancol.org> writes: > So, today, M-x butterfly wouldn't have made the cut? That's sad. Probably not. Originally, there was a lot less code like this, and the developers were amused to include it. M-x tetris makes a great demo during conferences. But today, there are a LOT of these sorts of cute packages. We shouldn't feel compelled to include nyancat.el into core because of past whimsy. John ^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: [ANN] New library stream.el in ELPA 2015-10-20 7:02 ` Daniel Colascione 2015-10-20 15:18 ` John Wiegley @ 2015-10-20 16:16 ` Jay Belanger 1 sibling, 0 replies; 32+ messages in thread From: Jay Belanger @ 2015-10-20 16:16 UTC (permalink / raw) To: emacs-devel; +Cc: jay.p.belanger Daniel Colascione <dancol@dancol.org> writes: ... > So, today, M-x butterfly wouldn't have made the cut? That's sad. I agree. In my opinion, some whimsy and diversions that are built in add texture to a program. ^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: [ANN] New library stream.el in ELPA 2015-10-20 6:55 ` John Wiegley 2015-10-20 7:02 ` Daniel Colascione @ 2015-10-20 10:20 ` Stephen J. Turnbull 1 sibling, 0 replies; 32+ messages in thread From: Stephen J. Turnbull @ 2015-10-20 10:20 UTC (permalink / raw) To: John Wiegley; +Cc: Daniel Colascione, emacs-devel John Wiegley writes: > Although we have no hard and fast rule yet for what goes into core > and ELPA, I expect moving things into core to offer a better reason > than "because I want it there". Such a package should provide: > > - a basic functionality we expect to be commonly used, > - supports a package already in core, > - provides some justification for being in the default > distribution and thus subject to maintenance by the core > maintainers. > > If it can't answer those questions, it should be in ELPA. Of course, as Daniel was at pains to point out, there are cases where "it's just too Hello-Kitty-cute to not be in core" is an answer to all three (though the connection of cuteness to "supports package" is as tenuous as the smile on a maintainer's face, I admit ;-). Not-entirely-tongue-in-cheek-ly y'rs, ^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: [ANN] New library stream.el in ELPA 2015-10-18 18:29 ` Daniel Colascione 2015-10-19 4:38 ` Stephen J. Turnbull @ 2015-10-20 12:07 ` David Kastrup 1 sibling, 0 replies; 32+ messages in thread From: David Kastrup @ 2015-10-20 12:07 UTC (permalink / raw) To: Daniel Colascione; +Cc: emacs-devel Daniel Colascione <dancol@dancol.org> writes: > I see no need to flake off useful parts of Emacs and put them into > ELPA when the core is not resource-constrained. > > For me, using ELPA packages is a bit more awkward, since I don't use > package.el and pull in the bits of ELPA I want manually. So? Emacs doesn't try catering for users who don't type M-x for religious reasons either. If you want to pull in the bits of ELPA manually, you are not the person Emacs is built and maintained for. There is no point in Emacs trying to particularly support people who don't want to use the core facilities of Emacs. If you choose to do things your own way, you are responsible for it. > If your package is only in ELPA, I probably won't hear about it, and > unless it's particularly compelling, I won't use it. Why would you "hear" about some random addition to the core? The package manager, in contrast, actually lists new packages. -- David Kastrup ^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: [ANN] New library stream.el in ELPA 2015-10-14 21:31 ` John Wiegley ` (2 preceding siblings ...) 2015-10-18 18:29 ` Daniel Colascione @ 2015-10-23 11:30 ` Nicolas Petton 2015-10-23 19:21 ` John Wiegley 3 siblings, 1 reply; 32+ messages in thread From: Nicolas Petton @ 2015-10-23 11:30 UTC (permalink / raw) To: John Wiegley, emacs-devel [-- Attachment #1: Type: text/plain, Size: 518 bytes --] John Wiegley <johnw@newartisans.com> writes: >>>>>> Nicolas Petton <nicolas@petton.fr> writes: > >> What if I extract it in a thunk.el library and install it in master (with >> proper tests), and have stream.el use that? (I could also put stream.el in >> Emacs, but Stefan thought it would be better to have it in ELPA). > > Probably I'd prefer to see thunk.el in master, and stream.el in ELPA Hi John, I just installed thunk.el in master, and added unit tests to it. Next I'll refactor stream.el to use it. Nico [-- Attachment #2: signature.asc --] [-- Type: application/pgp-signature, Size: 512 bytes --] ^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: [ANN] New library stream.el in ELPA 2015-10-23 11:30 ` Nicolas Petton @ 2015-10-23 19:21 ` John Wiegley 0 siblings, 0 replies; 32+ messages in thread From: John Wiegley @ 2015-10-23 19:21 UTC (permalink / raw) To: Nicolas Petton; +Cc: emacs-devel >>>>> Nicolas Petton <nicolas@petton.fr> writes: > I just installed thunk.el in master, and added unit tests to it. Next I'll > refactor stream.el to use it. Thank you, Nicolas, I'm glad to hear it! John ^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: [ANN] New library stream.el in ELPA 2015-10-14 16:09 ` John Wiegley 2015-10-14 16:20 ` Nicolas Petton @ 2015-10-15 10:08 ` Michael Heerdegen 2015-10-15 18:25 ` John Wiegley 1 sibling, 1 reply; 32+ messages in thread From: Michael Heerdegen @ 2015-10-15 10:08 UTC (permalink / raw) To: emacs-devel "John Wiegley" <johnw@newartisans.com> writes: > What I wonder is, can you generalize this beyond cons cells? I mean, > can we have a general lazy evaluation framework, instead of just lazy > lists? The API I was thinking of was: > > (let ((x (thunk-create FORM))) > (thunk-eval x)) > > The idea being that 'x' is a self-modifying thunk which only evaluates FORM > the first time it is forced, but immediately returns the result value after. Note that there is actually already something like that in Emacs, though it's hard or nearly impossible to find: lisp/url/url-future.el You may want to see the thread "Generators (iterators) for Gnu Emacs" from Dec of last year, where this had been mentioned. Stefan meant he wanted to wait giving it this thing a "future-" prefix until we have understood the consequences of this kind of abstraction. Just want to mention this here, I'm not against writing a new lib. Regards, Michael. ^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: [ANN] New library stream.el in ELPA 2015-10-15 10:08 ` Michael Heerdegen @ 2015-10-15 18:25 ` John Wiegley 2015-10-15 22:13 ` Nicolas Petton 0 siblings, 1 reply; 32+ messages in thread From: John Wiegley @ 2015-10-15 18:25 UTC (permalink / raw) To: Michael Heerdegen; +Cc: Nicolas Petton, emacs-devel >>>>> Michael Heerdegen <michael_heerdegen@web.de> writes: > Note that there is actually already something like that in Emacs, though > it's hard or nearly impossible to find: > lisp/url/url-future.el This is good to know, and it certainly doesn't belong buried down there. I'll leave it to Nicolas to determine if that implementation is already sufficient and should simply be moved, or whether he can improve upon it. Thanks for the heads up, John ^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: [ANN] New library stream.el in ELPA 2015-10-15 18:25 ` John Wiegley @ 2015-10-15 22:13 ` Nicolas Petton 0 siblings, 0 replies; 32+ messages in thread From: Nicolas Petton @ 2015-10-15 22:13 UTC (permalink / raw) To: John Wiegley, Michael Heerdegen; +Cc: emacs-devel [-- Attachment #1: Type: text/plain, Size: 518 bytes --] John Wiegley <johnw@newartisans.com> writes: >>>>>> Michael Heerdegen <michael_heerdegen@web.de> writes: > >> Note that there is actually already something like that in Emacs, though >> it's hard or nearly impossible to find: > >> lisp/url/url-future.el > > This is good to know, and it certainly doesn't belong buried down > there. Indeed, that's definitely interesting! I haven't looked at it in details yet, but it seems to provide async promises working with callbacks rather than lazy form evaluation. Nico [-- Attachment #2: signature.asc --] [-- Type: application/pgp-signature, Size: 512 bytes --] ^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: [ANN] New library stream.el in ELPA 2015-10-14 11:43 [ANN] New library stream.el in ELPA Nicolas Petton 2015-10-14 12:37 ` Michael Heerdegen 2015-10-14 16:09 ` John Wiegley @ 2015-10-15 20:28 ` John Mastro 2015-10-15 22:02 ` Nicolas Petton 2015-10-24 19:16 ` Michael Heerdegen 3 siblings, 1 reply; 32+ messages in thread From: John Mastro @ 2015-10-15 20:28 UTC (permalink / raw) To: Nicolas Petton; +Cc: emacs-devel [-- Attachment #1: Type: text/plain, Size: 823 bytes --] Hi Nico, > I just pushed to ELPA the first version of `stream', a new library that > provides an implementation of streams. > > `stream' requires Emacs >= 25.1, as it leverages the extensibility of > seq.el (the version currently in master, not the one in ELPA): all > functions defined in seq.el will work on streams, meaning that it's > possible to consume a stream using `seq-take', map and filter it using > `seq-map` and `seq-filter`, and so forth. Thanks for working on this, it's definitely useful. Specifying the dependency as (emacs "25.1") seems to prevent it from being installable via package.el until Emacs 25.1 is released. At least, it's listed as "incompat" in the *Packages* menu in my Emacs, built from master fairly recently. I think listing the dependency as (emacs "25") would avoid this. -- john [-- Attachment #2: Type: text/html, Size: 986 bytes --] ^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: [ANN] New library stream.el in ELPA 2015-10-15 20:28 ` John Mastro @ 2015-10-15 22:02 ` Nicolas Petton 0 siblings, 0 replies; 32+ messages in thread From: Nicolas Petton @ 2015-10-15 22:02 UTC (permalink / raw) To: John Mastro; +Cc: emacs-devel [-- Attachment #1: Type: text/plain, Size: 472 bytes --] John Mastro <john.b.mastro@gmail.com> writes: > Hi Nico, Hi John, > Thanks for working on this, it's definitely useful. > > Specifying the dependency as (emacs "25.1") seems to prevent it from > being installable via package.el until Emacs 25.1 is released. At least, > it's listed as "incompat" in the *Packages* menu in my Emacs, built from > master fairly recently. I think listing the dependency as (emacs "25") > would avoid this. Thanks, I will update it! Nico [-- Attachment #2: signature.asc --] [-- Type: application/pgp-signature, Size: 512 bytes --] ^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: [ANN] New library stream.el in ELPA 2015-10-14 11:43 [ANN] New library stream.el in ELPA Nicolas Petton ` (2 preceding siblings ...) 2015-10-15 20:28 ` John Mastro @ 2015-10-24 19:16 ` Michael Heerdegen 2015-10-24 20:52 ` Nicolas Petton 3 siblings, 1 reply; 32+ messages in thread From: Michael Heerdegen @ 2015-10-24 19:16 UTC (permalink / raw) To: Nicolas Petton; +Cc: emacs-devel Nicolas Petton <nicolas@petton.fr> writes: > The generic `stream' function currently accepts lists, strings, arrays > and buffers as input, but it can be cleanly extended to support pretty > much any kind of data. I have a question: For implementing the diverse generic seq functions (`seq-p', `seq-elt', `seq-length') for streams you use `cl-defgeneric' all the time, e.g. --8<---------------cut here---------------start------------->8--- (cl-defgeneric seq-elt ((stream stream) n) "Return the element of STREAM at index N." (while (> n 0) (setq stream (stream-rest stream)) (setq n (1- n))) (stream-first stream)) --8<---------------cut here---------------end--------------->8--- But according to the doc of `cl-defgeneric' and `cl-defmethod', this seems the perfect use case for `cl-defmethod': "[...] it defines the implementation of NAME to use for invocations where the value of the dispatch argument matches the specified TYPE." So why do you use `cl-defgeneric' - what do I miss? Regards, Michael. ^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: [ANN] New library stream.el in ELPA 2015-10-24 19:16 ` Michael Heerdegen @ 2015-10-24 20:52 ` Nicolas Petton 0 siblings, 0 replies; 32+ messages in thread From: Nicolas Petton @ 2015-10-24 20:52 UTC (permalink / raw) To: Michael Heerdegen; +Cc: emacs-devel [-- Attachment #1: Type: text/plain, Size: 428 bytes --] Michael Heerdegen <michael_heerdegen@web.de> writes: > But according to the doc of `cl-defgeneric' and `cl-defmethod', this > seems the perfect use case for `cl-defmethod': > > "[...] it defines the implementation of NAME to use for invocations where > the value of the dispatch argument matches the specified TYPE." > > So why do you use `cl-defgeneric' - what do I miss? Nothing, it's a mistake I made, I will fix it. Nico [-- Attachment #2: signature.asc --] [-- Type: application/pgp-signature, Size: 512 bytes --] ^ permalink raw reply [flat|nested] 32+ messages in thread
end of thread, other threads:[~2015-10-24 20:52 UTC | newest] Thread overview: 32+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2015-10-14 11:43 [ANN] New library stream.el in ELPA Nicolas Petton 2015-10-14 12:37 ` Michael Heerdegen 2015-10-14 13:20 ` Nicolas Petton 2015-10-14 13:33 ` Michael Heerdegen 2015-10-14 13:30 ` Nicolas Petton 2015-10-14 22:13 ` Michael Heerdegen 2015-10-15 7:38 ` Nicolas Petton 2015-10-14 16:09 ` John Wiegley 2015-10-14 16:20 ` Nicolas Petton 2015-10-14 16:40 ` John Wiegley 2015-10-14 19:31 ` Nicolas Petton 2015-10-14 21:31 ` John Wiegley 2015-10-14 21:51 ` Nicolas Petton 2015-10-15 0:42 ` raman 2015-10-15 0:48 ` John Wiegley 2015-10-18 18:29 ` Daniel Colascione 2015-10-19 4:38 ` Stephen J. Turnbull 2015-10-20 6:55 ` John Wiegley 2015-10-20 7:02 ` Daniel Colascione 2015-10-20 15:18 ` John Wiegley 2015-10-20 16:16 ` Jay Belanger 2015-10-20 10:20 ` Stephen J. Turnbull 2015-10-20 12:07 ` David Kastrup 2015-10-23 11:30 ` Nicolas Petton 2015-10-23 19:21 ` John Wiegley 2015-10-15 10:08 ` Michael Heerdegen 2015-10-15 18:25 ` John Wiegley 2015-10-15 22:13 ` Nicolas Petton 2015-10-15 20:28 ` John Mastro 2015-10-15 22:02 ` Nicolas Petton 2015-10-24 19:16 ` Michael Heerdegen 2015-10-24 20:52 ` Nicolas Petton
Code repositories for project(s) associated with this public inbox https://git.savannah.gnu.org/cgit/emacs.git This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).