all messages for Emacs-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
* return first element in list with certain property
@ 2017-11-19 20:43 Emanuel Berg
  2017-11-19 20:51 ` Eric Abrahamsen
                   ` (2 more replies)
  0 siblings, 3 replies; 54+ messages in thread
From: Emanuel Berg @ 2017-11-19 20:43 UTC (permalink / raw)
  To: help-gnu-emacs

What is considered the right way to return the
first element in list that has
a certain property?

The best way I've found so far is `cl-some' and
then `and'. While I don't consider the
"`and' hack" to be detrimental in any way I was
curious if there was a complete
"hack free" way...

Example: get the first element that is bigger
than 1:

    (cl-some (lambda (e) (and (> e 1) e)) '(1 1 3 1 4 2)) ; 3

-- 
underground experts united
http://user.it.uu.se/~embe8573




^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: return first element in list with certain property
  2017-11-19 20:43 return first element in list with certain property Emanuel Berg
@ 2017-11-19 20:51 ` Eric Abrahamsen
  2017-11-19 21:37 ` Philipp Stephani
       [not found] ` <mailman.4093.1511127491.27995.help-gnu-emacs@gnu.org>
  2 siblings, 0 replies; 54+ messages in thread
From: Eric Abrahamsen @ 2017-11-19 20:51 UTC (permalink / raw)
  To: help-gnu-emacs

Emanuel Berg <moasen@zoho.com> writes:

> What is considered the right way to return the
> first element in list that has
> a certain property?
>
> The best way I've found so far is `cl-some' and
> then `and'. While I don't consider the
> "`and' hack" to be detrimental in any way I was
> curious if there was a complete
> "hack free" way...
>
> Example: get the first element that is bigger
> than 1:
>
>     (cl-some (lambda (e) (and (> e 1) e)) '(1 1 3 1 4 2)) ; 3

I think `cl-find' is what I use for this, with the :test keyword. Or
`seq-find' seems to do the same thing.




^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: return first element in list with certain property
       [not found] <mailman.4086.1511124258.27995.help-gnu-emacs@gnu.org>
@ 2017-11-19 21:19 ` Marco Wahl
  2017-11-19 22:51   ` Emanuel Berg
  2017-11-21  4:00   ` Emanuel Berg
  2017-11-19 21:20 ` Marco Wahl
  1 sibling, 2 replies; 54+ messages in thread
From: Marco Wahl @ 2017-11-19 21:19 UTC (permalink / raw)
  To: help-gnu-emacs

Emanuel Berg <moasen@zoho.com> writes:

> What is considered the right way to return the
> first element in list that has
> a certain property?
>
> The best way I've found so far is `cl-some' and
> then `and'. While I don't consider the
> "`and' hack" to be detrimental in any way I was
> curious if there was a complete
> "hack free" way...
>
> Example: get the first element that is bigger
> than 1:
>
>     (cl-some (lambda (e) (and (> e 1) e)) '(1 1 3 1 4 2)) ; 3

(cl-loop for e in '(1 1 3 1 4 2)
         when (> e 1)
         return e)

lgtm





^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: return first element in list with certain property
       [not found] <mailman.4086.1511124258.27995.help-gnu-emacs@gnu.org>
  2017-11-19 21:19 ` Marco Wahl
@ 2017-11-19 21:20 ` Marco Wahl
  1 sibling, 0 replies; 54+ messages in thread
From: Marco Wahl @ 2017-11-19 21:20 UTC (permalink / raw)
  To: help-gnu-emacs

Emanuel Berg <moasen@zoho.com> writes:

> What is considered the right way to return the
> first element in list that has
> a certain property?
>
> The best way I've found so far is `cl-some' and
> then `and'. While I don't consider the
> "`and' hack" to be detrimental in any way I was
> curious if there was a complete
> "hack free" way...
>
> Example: get the first element that is bigger
> than 1:
>
>     (cl-some (lambda (e) (and (> e 1) e)) '(1 1 3 1 4 2)) ; 3

(cl-loop for e in '(1 1 3 1 4 2)
         when (> e 1)
         return e)

lgtm


^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: return first element in list with certain property
  2017-11-19 20:43 return first element in list with certain property Emanuel Berg
  2017-11-19 20:51 ` Eric Abrahamsen
@ 2017-11-19 21:37 ` Philipp Stephani
  2017-11-19 22:55   ` Emanuel Berg
  2017-11-20 20:12   ` Drew Adams
       [not found] ` <mailman.4093.1511127491.27995.help-gnu-emacs@gnu.org>
  2 siblings, 2 replies; 54+ messages in thread
From: Philipp Stephani @ 2017-11-19 21:37 UTC (permalink / raw)
  To: help-gnu-emacs

Emanuel Berg <moasen@zoho.com> schrieb am So., 19. Nov. 2017 um 21:44 Uhr:

> What is considered the right way to return the
> first element in list that has
> a certain property?
>
> The best way I've found so far is `cl-some' and
> then `and'. While I don't consider the
> "`and' hack" to be detrimental in any way I was
> curious if there was a complete
> "hack free" way...
>

cl-find-if


^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: return first element in list with certain property
  2017-11-19 21:19 ` Marco Wahl
@ 2017-11-19 22:51   ` Emanuel Berg
  2017-11-21  4:00   ` Emanuel Berg
  1 sibling, 0 replies; 54+ messages in thread
From: Emanuel Berg @ 2017-11-19 22:51 UTC (permalink / raw)
  To: help-gnu-emacs

Marco Wahl wrote:

>> What is considered the right way to return
>> the first element in list that has a certain
>> property? The best way I've found so far is
>> `cl-some' and then `and'. While I don't
>> consider the "`and' hack" to be detrimental
>> in any way I was curious if there was
>> a complete "hack free" way... Example: get
>> the first element that is bigger than 1:
>> (cl-some (lambda (e) (and (> e 1) e)) '(1 1
>> 3 1 4 2)) ; 3
>
> (cl-loop for e in '(1 1 3 1 4 2) when (> e 1)
> return e)

Much worse than mine :)

-- 
underground experts united
http://user.it.uu.se/~embe8573




^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: return first element in list with certain property
  2017-11-19 21:37 ` Philipp Stephani
@ 2017-11-19 22:55   ` Emanuel Berg
  2017-11-20 18:51     ` John Mastro
  2017-11-20 20:12   ` Drew Adams
  1 sibling, 1 reply; 54+ messages in thread
From: Emanuel Berg @ 2017-11-19 22:55 UTC (permalink / raw)
  To: help-gnu-emacs

Philipp Stephani wrote:

>> What is considered the right way to return
>> the first element in list that has a certain
>> property? The best way I've found so far is
>> `cl-some' and then `and'. While I don't
>> consider the "`and' hack" to be detrimental
>> in any way I was curious if there was
>> a complete "hack free" way...
>>
>
> cl-find-if

That's it 100%

-- 
underground experts united
http://user.it.uu.se/~embe8573




^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: return first element in list with certain property
  2017-11-19 22:55   ` Emanuel Berg
@ 2017-11-20 18:51     ` John Mastro
  2017-11-20 19:21       ` Michael Heerdegen
  2017-11-20 20:52       ` Emanuel Berg
  0 siblings, 2 replies; 54+ messages in thread
From: John Mastro @ 2017-11-20 18:51 UTC (permalink / raw)
  To: help-gnu-emacs@gnu.org

Emanuel Berg <moasen@zoho.com> wrote:
> Philipp Stephani wrote:
>> cl-find-if
>
> That's it 100%

Or, if seq.el is more your style:

(seq-find (lambda (e) (> e 1)) '(1 1 3 1 4 2))
;=> 3

        John



^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: return first element in list with certain property
  2017-11-20 18:51     ` John Mastro
@ 2017-11-20 19:21       ` Michael Heerdegen
  2017-11-20 21:20         ` Emanuel Berg
  2017-11-20 20:52       ` Emanuel Berg
  1 sibling, 1 reply; 54+ messages in thread
From: Michael Heerdegen @ 2017-11-20 19:21 UTC (permalink / raw)
  To: John Mastro; +Cc: help-gnu-emacs@gnu.org

John Mastro <john.b.mastro@gmail.com> writes:

> >> cl-find-if
> >
> > That's it 100%
>
> Or, if seq.el is more your style:
>
> (seq-find (lambda (e) (> e 1)) '(1 1 3 1 4 2))
> ;=> 3

And if you want to be cool:

(seq-find (apply-partially #'< 1) '(1 1 3 1 4 2))
==> 3


Michael.



^ permalink raw reply	[flat|nested] 54+ messages in thread

* RE: return first element in list with certain property
  2017-11-19 21:37 ` Philipp Stephani
  2017-11-19 22:55   ` Emanuel Berg
@ 2017-11-20 20:12   ` Drew Adams
  2017-11-20 20:49     ` Eric Abrahamsen
  1 sibling, 1 reply; 54+ messages in thread
From: Drew Adams @ 2017-11-20 20:12 UTC (permalink / raw)
  To: Philipp Stephani, help-gnu-emacs

>> cl-find-if
>
> That's it 100%

BTW, I haven't run any tests, but the `cl-find' code, which
is used also by functions such as `cl-find-if', apparently
traverses the list twice: Once when it calls `cl-position'
and a second time when it calls `elt'.

 (defun cl-find (cl-item cl-seq &rest cl-keys)
  (let ((cl-pos (apply 'cl-position cl-item cl-seq cl-keys)))
    (and cl-pos (elt cl-seq cl-pos))))

`cl-position' does this for a list - it cdrs down list CL-P:

(let ((cl-p (nthcdr cl-start cl-seq)))
  (or cl-end (setq cl-end 8000000))
      (let ((cl-res nil))
        (while (and cl-p (< cl-start cl-end)
                    (or (not cl-res) cl-from-end))
          (if (cl--check-test cl-item (car cl-p))
              (setq cl-res cl-start))
          (setq cl-p (cdr cl-p) cl-start (1+ cl-start)))
        cl-res))

Checking the C source for `elt' called on a list (admittedly,
somewhat old C source code, which is all I have at hand), it
does, in effect, (car (nthcdr n list)).  It cdrs down LIST.

Someone might want to profile the difference, for a long list
whose first occurrence for the sought item is near the end of
the list.  Maybe compare, for example, the use of `cl-find-if'
with something simple that traverses the list only once:

(catch '>1
  (dolist (x xs nil) (when (> x 1) (throw '>1 x))))

The idiom of traversing a list only once, throwing to a
`catch', is a pretty good one to learn, I think.  It's
straightforward and transparent, doing just what it says.

Granted, it doesn't shout "Return the first element > 1."

And it's a little more verbose than using a higher
abstraction such as `cl-find-if'.  Anyway, compare the
length of the code above with these - a difference, but
not huge:

(seq-find (apply-partially #'< 1) xs)
(seq-find (lambda (x) (> x 1)) xs)
(cl-find-if (lambda (x) (> x 1)) xs)
(cl-loop for x in xs when (> x 1) return x)
(cl-some (lambda (x) (and (> x 1) x)) xs)

Dunno whether the other functions, besides `cl-find-if',
traverse the list more than once.

Maybe the code defining `cl-find' should be tweaked to
avoid two traversals?  `cl-position' traverses only once,
and so does `elt'.  Maybe getting the position in the list
and then cdring down the list again to that position is
not the smartest way to do `cl-find-if' on a list.



^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: return first element in list with certain property
  2017-11-20 20:12   ` Drew Adams
@ 2017-11-20 20:49     ` Eric Abrahamsen
  2017-11-20 21:16       ` Emanuel Berg
  0 siblings, 1 reply; 54+ messages in thread
From: Eric Abrahamsen @ 2017-11-20 20:49 UTC (permalink / raw)
  To: help-gnu-emacs

Drew Adams <drew.adams@oracle.com> writes:

>>> cl-find-if
>>
>> That's it 100%
>
> BTW, I haven't run any tests, but the `cl-find' code, which
> is used also by functions such as `cl-find-if', apparently
> traverses the list twice: Once when it calls `cl-position'
> and a second time when it calls `elt'.
>
>  (defun cl-find (cl-item cl-seq &rest cl-keys)
>   (let ((cl-pos (apply 'cl-position cl-item cl-seq cl-keys)))
>     (and cl-pos (elt cl-seq cl-pos))))
>
> `cl-position' does this for a list - it cdrs down list CL-P:
>
> (let ((cl-p (nthcdr cl-start cl-seq)))
>   (or cl-end (setq cl-end 8000000))
>       (let ((cl-res nil))
>         (while (and cl-p (< cl-start cl-end)
>                     (or (not cl-res) cl-from-end))
>           (if (cl--check-test cl-item (car cl-p))
>               (setq cl-res cl-start))
>           (setq cl-p (cdr cl-p) cl-start (1+ cl-start)))
>         cl-res))
>
> Checking the C source for `elt' called on a list (admittedly,
> somewhat old C source code, which is all I have at hand), it
> does, in effect, (car (nthcdr n list)).  It cdrs down LIST.
>
> Someone might want to profile the difference, for a long list
> whose first occurrence for the sought item is near the end of
> the list.  Maybe compare, for example, the use of `cl-find-if'
> with something simple that traverses the list only once:
>
> (catch '>1
>   (dolist (x xs nil) (when (> x 1) (throw '>1 x))))

FWIW, this is essentially how seq-find works, and I generally use this.

I once tried making a binary-search for very long lists that are sorted,
but I suppose that could be much worse, since you're potentially
traversing (a part of) the list four or five as you zero in on the
element.

`delete-dups' is also instructional: it uses a different strategy, with
a hash table, for lists longer than 100 elements.

Eric




^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: return first element in list with certain property
  2017-11-20 18:51     ` John Mastro
  2017-11-20 19:21       ` Michael Heerdegen
@ 2017-11-20 20:52       ` Emanuel Berg
  1 sibling, 0 replies; 54+ messages in thread
From: Emanuel Berg @ 2017-11-20 20:52 UTC (permalink / raw)
  To: help-gnu-emacs

John Mastro wrote:

> Or, if seq.el is more your style:
>
> (seq-find (lambda (e) (> e 1)) '(1 1 3 1 4 2)) ;=> 3

(require 'seq)
(seq-find   (lambda (e) (> e 1)) '(1 1 3 1 4 2)) ; 3

(require 'cl-lib)
(cl-find-if (lambda (e) (> e 1)) '(1 1 3 1 4 2)) ; 3

The syntax seems pretty identical to me so
perhaps you can tell me more about the
seq package?

I have never required `seq' before, CL tho 21
times. So I'll stick to even more CL unless you
can show the court some chocking new
evidence...

--
underground experts united
http://user.it.uu.se/~embe8573




^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: return first element in list with certain property
  2017-11-20 20:49     ` Eric Abrahamsen
@ 2017-11-20 21:16       ` Emanuel Berg
  2017-11-20 22:02         ` Eric Abrahamsen
  2017-11-20 22:59         ` Drew Adams
  0 siblings, 2 replies; 54+ messages in thread
From: Emanuel Berg @ 2017-11-20 21:16 UTC (permalink / raw)
  To: help-gnu-emacs

Eric Abrahamsen wrote:

> FWIW, this is essentially how seq-find works,
> and I generally use this.

Here (my use case) it is important that the
search is linear along the list from the
beginning as the hit is almost always in the
very early section of the list.

However the below tests seem to indicate no
problems for any of the solutions suggested
so far?

(let ((test-list '(0 1 2 3 4 5)))

  (cl-dolist (e test-list)
    (message "cl-dolist processing: %s" e)
    (when (> e 1) (cl-return e) ))

  (cl-find-if (lambda (e) (and (message "cl-find-if processing: %s" e)
                               (> e 1) ))
              test-list)

  (seq-find   (lambda (e) (and (message "find-seq processing: %s" e)
                               (> e 1) ))
              test-list)
  )
;; cl-dolist processing: 0
;; cl-dolist processing: 1
;; cl-dolist processing: 2
;; cl-find-if processing: 0
;; cl-find-if processing: 1
;; cl-find-if processing: 2
;; find-seq processing: 0
;; find-seq processing: 1
;; find-seq processing: 2

-- 
underground experts united
http://user.it.uu.se/~embe8573




^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: return first element in list with certain property
  2017-11-20 19:21       ` Michael Heerdegen
@ 2017-11-20 21:20         ` Emanuel Berg
  2017-11-20 21:40           ` John Mastro
  2017-11-20 22:19           ` Michael Heerdegen
  0 siblings, 2 replies; 54+ messages in thread
From: Emanuel Berg @ 2017-11-20 21:20 UTC (permalink / raw)
  To: help-gnu-emacs

Michael Heerdegen wrote:

> And if you want to be cool:
>
> (seq-find (apply-partially #'< 1) '(1 1 3 1 4
> 2)) ==> 3

"And" if you want to be cool? I agree
`apply-partially' is cooler but why is
`seq-find' better than `cl-find-if'?

Actually no one said it was better. The only
thing said was that it was my style. Eheh.

-- 
underground experts united
http://user.it.uu.se/~embe8573




^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: return first element in list with certain property
  2017-11-20 21:20         ` Emanuel Berg
@ 2017-11-20 21:40           ` John Mastro
  2017-11-20 22:19           ` Michael Heerdegen
  1 sibling, 0 replies; 54+ messages in thread
From: John Mastro @ 2017-11-20 21:40 UTC (permalink / raw)
  To: help-gnu-emacs@gnu.org

Emanuel Berg <moasen@zoho.com> wrote:
> Michael Heerdegen wrote:
>
>> And if you want to be cool:
>>
>> (seq-find (apply-partially #'< 1) '(1 1 3 1 4
>> 2)) ==> 3
>
> "And" if you want to be cool? I agree
> `apply-partially' is cooler but why is
> `seq-find' better than `cl-find-if'?
>
> Actually no one said it was better. The only
> thing said was that it was my style. Eheh.

I didn't say anything about your style. I pointed out that "if seq.el is
more your style" (in other words, "if you prefer seq.el"), seq-find also
works for this.

        John



^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: return first element in list with certain property
  2017-11-20 21:16       ` Emanuel Berg
@ 2017-11-20 22:02         ` Eric Abrahamsen
  2017-11-21  1:54           ` Emanuel Berg
  2017-11-20 22:59         ` Drew Adams
  1 sibling, 1 reply; 54+ messages in thread
From: Eric Abrahamsen @ 2017-11-20 22:02 UTC (permalink / raw)
  To: help-gnu-emacs

Emanuel Berg <moasen@zoho.com> writes:

> Eric Abrahamsen wrote:
>
>> FWIW, this is essentially how seq-find works,
>> and I generally use this.
>
> Here (my use case) it is important that the
> search is linear along the list from the
> beginning as the hit is almost always in the
> very early section of the list.

In that case there will be less difference between the two: as Drew
noted, `cl-find-if' will traverse the list twice, which only becomes a
big problem if the desired element is at the end of the list.

But enough speculation!

(setq test-front (append '(1 1 3) (make-list 1000 1)))

(setq test-back (append (make-list 1000 1) '(3 1 1)))

(benchmark 1000 '(seq-find (lambda (elt) (= 3 elt)) test-front))
"Elapsed time: 0.008247s"

(benchmark 1000 '(cl-find-if (lambda (elt) (= 3 elt)) test-front))
"Elapsed time: 0.006165s"

(benchmark 1000 '(seq-find (lambda (elt) (= 3 elt)) test-back))
"Elapsed time: 0.134623s"

(benchmark 1000 '(cl-find-if (lambda (elt) (= 3 elt)) test-back))
"Elapsed time: 0.167007s"

Yup, in your case it doesn't matter too much.

Eric




^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: return first element in list with certain property
  2017-11-20 21:20         ` Emanuel Berg
  2017-11-20 21:40           ` John Mastro
@ 2017-11-20 22:19           ` Michael Heerdegen
  1 sibling, 0 replies; 54+ messages in thread
From: Michael Heerdegen @ 2017-11-20 22:19 UTC (permalink / raw)
  To: help-gnu-emacs

Emanuel Berg <moasen@zoho.com> writes:

> > And if you want to be cool:
> >
> > (seq-find (apply-partially #'< 1) '(1 1 3 1 4
> > 2)) ==> 3
>
> "And" if you want to be cool? I agree `apply-partially' is cooler but
>  why is `seq-find' better than `cl-find-if'?

I (too) didn't want to imply that.  Both functions are defined, so both
are there to be used.


Michael.



^ permalink raw reply	[flat|nested] 54+ messages in thread

* RE: return first element in list with certain property
  2017-11-20 21:16       ` Emanuel Berg
  2017-11-20 22:02         ` Eric Abrahamsen
@ 2017-11-20 22:59         ` Drew Adams
  2017-11-21  1:50           ` Emanuel Berg
  1 sibling, 1 reply; 54+ messages in thread
From: Drew Adams @ 2017-11-20 22:59 UTC (permalink / raw)
  To: Emanuel Berg, help-gnu-emacs

> However the below tests seem to indicate no
> problems for any of the solutions suggested
> so far?

Certainly there will be no problem with any of them
when the list is small.

> (let ((test-list '(0 1 2 3 4 5)))
> 
>   (cl-dolist (e test-list)
>     (message "cl-dolist processing: %s" e)
>     (when (> e 1) (cl-return e) ))
> 
>   (cl-find-if (lambda (e) (and (message "cl-find-if processing: %s" e)
>                                (> e 1) ))
>               test-list)
> 
>   (seq-find   (lambda (e) (and (message "find-seq processing: %s" e)
>                                (> e 1) ))
>               test-list)
>   )
> ;; cl-dolist processing: 0
> ;; cl-dolist processing: 1
> ;; cl-dolist processing: 2
> ;; cl-find-if processing: 0
> ;; cl-find-if processing: 1
> ;; cl-find-if processing: 2
> ;; find-seq processing: 0
> ;; find-seq processing: 1
> ;; find-seq processing: 2

As I said, `cl-find-if' apparently traverses the list twice.

You see only one message for each element tested because your
predicate is called only once per element.  `cl-find-if' is
implemented by first calling `cl-position', which uses your
predicate.  And then, once a satisfactory element is found,
it calls `elt' to traverse the list again, to obtain that
element.  The call to `elt' does not use your predicate, so
you see no messages for it.

As I said, I have not bothered to profile the different
suggestions, but a guess is that with a very large list
`cl-find-if' will be slower.



^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: return first element in list with certain property
  2017-11-20 22:59         ` Drew Adams
@ 2017-11-21  1:50           ` Emanuel Berg
  0 siblings, 0 replies; 54+ messages in thread
From: Emanuel Berg @ 2017-11-21  1:50 UTC (permalink / raw)
  To: help-gnu-emacs

Drew Adams wrote:

> You see only one message for each element
> tested because your predicate is called only
> once per element.

Yes, isn't that completely natural?

> `cl-find-if' is implemented by first calling
> `cl-position', which uses your predicate.
> And then, once a satisfactory element is
> found, it calls `elt' to traverse the list
> again, to obtain that element.

By "traverse" you mean go from the first
element, to the second, and so on, until the
element is found (or the list ends)?

Or do you mean the entire thing is gone thru
just like one would traverse a rock or...
a traverse? But that doesn't make any sense WRT
searching (as opposed to logistics)?

If both `cl-position' and `elt' do this
lineary, i.e. if this is the list

    (0 ... n)

and the sought-after element has index e for
(0 <= e <= n) then the worst-case for both are
n, so combined 2n.

However for this

  (cl-dolist (e test-list)
    (when (> e 1) (cl-return e) ))

the worst-case is n! So both are linear, but,
interestingly, the explicit iteration is twice
as fast! I just wrote in another thread

    Using the primitive list-searching
    functions ‘memq’, ‘member’, ‘assq’, or
    ‘assoc’ is even faster than explicit
    iteration. It can be worth rearranging
    a data structure so that one of these
    primitive search functions can be used. [1]

OK, so `cl-find-if' isn't mentioned or even
a primitive, however it sure looks better than
the `cl-dolist' above. But it isn't!

So why does it use `etl'?

[1] (info "(elisp) Compilation Tips")

-- 
underground experts united
http://user.it.uu.se/~embe8573




^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: return first element in list with certain property
  2017-11-20 22:02         ` Eric Abrahamsen
@ 2017-11-21  1:54           ` Emanuel Berg
  2017-11-21  2:18             ` Emanuel Berg
                               ` (2 more replies)
  0 siblings, 3 replies; 54+ messages in thread
From: Emanuel Berg @ 2017-11-21  1:54 UTC (permalink / raw)
  To: help-gnu-emacs

Eric Abrahamsen wrote:

> In that case there will be less difference
> between the two: as Drew noted, `cl-find-if'
> will traverse the list twice, which only
> becomes a big problem if the desired element
> is at the end of the list.

It doesn't have to be a problem, it is bizarre
as it is. Thanks for mentioning it, I'll change
to `seq-find'.

See, my intuition was right, seq-find *is*
better even tho you guys are in denial about
it :)

-- 
underground experts united
http://user.it.uu.se/~embe8573




^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: return first element in list with certain property
  2017-11-21  1:54           ` Emanuel Berg
@ 2017-11-21  2:18             ` Emanuel Berg
  2017-11-21 17:34               ` Michael Heerdegen
  2017-11-21 18:01             ` Philipp Stephani
  2017-11-22 21:28             ` Nicolas Petton
  2 siblings, 1 reply; 54+ messages in thread
From: Emanuel Berg @ 2017-11-21  2:18 UTC (permalink / raw)
  To: help-gnu-emacs

YT wrote:

> It doesn't have to be a problem, it is
> bizarre as it is. Thanks for mentioning it,
> I'll change to `seq-find'.

Not so fast.
O K A Y ...
I t  s e e m s  `seq-find' i s  n o t  i n
E m a c s  b u t  i n  seq-24.el .

However CL is, so shockingly, this is the best
by far - worst-case n, and with all the fixings
available from the get-go!

    (cl-dolist (e test-list)
      (when (> e 1) (cl-return e) ))

-- 
underground experts united
http://user.it.uu.se/~embe8573




^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: return first element in list with certain property
  2017-11-19 21:19 ` Marco Wahl
  2017-11-19 22:51   ` Emanuel Berg
@ 2017-11-21  4:00   ` Emanuel Berg
  1 sibling, 0 replies; 54+ messages in thread
From: Emanuel Berg @ 2017-11-21  4:00 UTC (permalink / raw)
  To: help-gnu-emacs

Marco Wahl wrote:

> (cl-loop for e in '(1 1 3 1 4 2) when (> e 1)
> return e)
>
> lgtm

+1 only I prefer the dolist syntax.

-- 
underground experts united
http://user.it.uu.se/~embe8573




^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: return first element in list with certain property
  2017-11-21  2:18             ` Emanuel Berg
@ 2017-11-21 17:34               ` Michael Heerdegen
  2017-11-21 20:10                 ` Emanuel Berg
  0 siblings, 1 reply; 54+ messages in thread
From: Michael Heerdegen @ 2017-11-21 17:34 UTC (permalink / raw)
  To: help-gnu-emacs

Emanuel Berg <moasen@zoho.com> writes:

> I t  s e e m s  `seq-find' i s  n o t  i n
> E m a c s  b u t  i n  seq-24.el .

It is in Emacs.  seq-24.el was a special version of seq.el adapted
(backported) to Emacs 24, since some things had to be done differently
in this Emacs version.


Michael.



^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: return first element in list with certain property
  2017-11-21  1:54           ` Emanuel Berg
  2017-11-21  2:18             ` Emanuel Berg
@ 2017-11-21 18:01             ` Philipp Stephani
  2017-11-21 18:37               ` Michael Heerdegen
                                 ` (3 more replies)
  2017-11-22 21:28             ` Nicolas Petton
  2 siblings, 4 replies; 54+ messages in thread
From: Philipp Stephani @ 2017-11-21 18:01 UTC (permalink / raw)
  To: help-gnu-emacs

Emanuel Berg <moasen@zoho.com> schrieb am Di., 21. Nov. 2017 um 02:55 Uhr:

> Eric Abrahamsen wrote:
>
> > In that case there will be less difference
> > between the two: as Drew noted, `cl-find-if'
> > will traverse the list twice, which only
> > becomes a big problem if the desired element
> > is at the end of the list.
>
> It doesn't have to be a problem, it is bizarre
> as it is. Thanks for mentioning it, I'll change
> to `seq-find'.
>
> See, my intuition was right, seq-find *is*
> better even tho you guys are in denial about
> it :)
>

Please consider Knuth's statement about premature optimization. Until your
users have actually complained about the speed of your product and you have
benchmarked it and isolated cl-find-if as the culprit, there's no need to
micro-optimize. Presumably cl-find-if has performed two iterations for
years or decades without anybody being bothered enough to improve it.


^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: return first element in list with certain property
  2017-11-21 18:01             ` Philipp Stephani
@ 2017-11-21 18:37               ` Michael Heerdegen
  2017-11-21 19:26               ` Drew Adams
                                 ` (2 subsequent siblings)
  3 siblings, 0 replies; 54+ messages in thread
From: Michael Heerdegen @ 2017-11-21 18:37 UTC (permalink / raw)
  To: Philipp Stephani; +Cc: help-gnu-emacs

Philipp Stephani <p.stephani2@gmail.com> writes:

> Please consider Knuth's statement about premature optimization. Until
> your users have actually complained about the speed of your product
> and you have benchmarked it and isolated cl-find-if as the culprit,
> there's no need to micro-optimize. Presumably cl-find-if has performed
> two iterations for years or decades without anybody being bothered
> enough to improve it.

Not only that.  Seems the second iteration is at least ~50 times faster
than the first one (using `elt' that is much faster than a loop), so it
doesn't matter anyway.  If your program is slow, the second iteration
will never be the culprit.


Michael.



^ permalink raw reply	[flat|nested] 54+ messages in thread

* RE: return first element in list with certain property
  2017-11-21 18:01             ` Philipp Stephani
  2017-11-21 18:37               ` Michael Heerdegen
@ 2017-11-21 19:26               ` Drew Adams
  2017-11-21 20:17                 ` Emanuel Berg
  2017-11-21 20:14               ` Emanuel Berg
       [not found]               ` <mailman.4260.1511289435.27995.help-gnu-emacs@gnu.org>
  3 siblings, 1 reply; 54+ messages in thread
From: Drew Adams @ 2017-11-21 19:26 UTC (permalink / raw)
  To: Philipp Stephani, help-gnu-emacs

> Please consider Knuth's statement about premature optimization. Until
> your users have actually complained about the speed of your product and you
> have benchmarked it and isolated cl-find-if as the culprit, there's no need to
> micro-optimize.

100% agreement.

> Presumably cl-find-if has performed two iterations for years
> or decades without anybody being bothered enough to improve it.

"Presumably ..."  No.

Yes, cl.el has been here for a long time.  But that doesn't
mean that everything in it is implemented as well as it
could be.

It was put together in a fairly short time, and it has _not_
had super heavy use over the years (that's my guess).

And yes, Emacs lisp use (including of CL emulation) is mostly
for Emacs, and most use cases do not involve things that need
high performance.  The number of cases where `cl-find' has
actually been used on very large lists is likely not so high.

Looking at the code, it seems that it would not be difficult
to improve this aspect, providing just a single traversal.
For the list case it could just use the catch-throw idiom,
for example.

So yes, not choosing to use `cl-find' in your Emacs-Lisp
code just because it traverses the list twice is silly and
is most likely premature optimization.

But fixing the `cl-find' implementation so that it does not
gratuitously traverse the list twice might not be silly.

As those tests communicated here so far have shown, `cl-find'
is anyway performant - no doubt partly because `elt' has a
C implementation.  Still, the double traversal is gratuitous,
and `cl-find' would be faster without it.

(Do I personally care about how fast it is?  Not really.)



^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: return first element in list with certain property
  2017-11-21 17:34               ` Michael Heerdegen
@ 2017-11-21 20:10                 ` Emanuel Berg
  2017-11-21 21:33                   ` Michael Heerdegen
  2017-11-22 21:31                   ` Nicolas Petton
  0 siblings, 2 replies; 54+ messages in thread
From: Emanuel Berg @ 2017-11-21 20:10 UTC (permalink / raw)
  To: help-gnu-emacs

Michael Heerdegen wrote:

> It is in Emacs. seq-24.el was a special
> version of seq.el adapted (backported) to
> Emacs 24, since some things had to be done
> differently in this Emacs version.

OK, so is it different in Emacs 25? Or is one
still supposed to get seq.el from ELPA, only
with no backport hassle?

There is where I got the whole thing (I guess,
tho I don't remember the occasion) and the
source is located in the .emacs.d dir in my
home dir.

When I can do the virtually the same with CL
which is readily available it doesn't feel
motivated to put this on presumable users to go
fetch seq just for this.

-- 
underground experts united
http://user.it.uu.se/~embe8573




^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: return first element in list with certain property
  2017-11-21 18:01             ` Philipp Stephani
  2017-11-21 18:37               ` Michael Heerdegen
  2017-11-21 19:26               ` Drew Adams
@ 2017-11-21 20:14               ` Emanuel Berg
       [not found]               ` <mailman.4260.1511289435.27995.help-gnu-emacs@gnu.org>
  3 siblings, 0 replies; 54+ messages in thread
From: Emanuel Berg @ 2017-11-21 20:14 UTC (permalink / raw)
  To: help-gnu-emacs

Philipp Stephani wrote:

> Please consider Knuth's statement about
> premature optimization. Until your users have
> actually complained about the speed of your
> product and you have benchmarked it and
> isolated cl-find-if as the culprit, there's
> no need to micro-optimize.
> Presumably cl-find-if has performed two
> iterations for years or decades without
> anybody being bothered enough to improve it.

This is not an optimization issue in my eyes.
It is just bizarre to have low-level operators
on low-level data structures operate like this
when there is no reason to, as the `cl-loop',
`cl-dolist' and `seq-find' examples all show.
It is like the basic building blocks of the
universe. Better get them right.
I'm a bottom-up guy.

-- 
underground experts united
http://user.it.uu.se/~embe8573




^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: return first element in list with certain property
  2017-11-21 19:26               ` Drew Adams
@ 2017-11-21 20:17                 ` Emanuel Berg
  2017-11-21 20:47                   ` Drew Adams
  0 siblings, 1 reply; 54+ messages in thread
From: Emanuel Berg @ 2017-11-21 20:17 UTC (permalink / raw)
  To: help-gnu-emacs

Drew Adams wrote:

> So yes, not choosing to use `cl-find' in your
> Emacs-Lisp code just because it traverses the
> list twice is silly and is most likely
> premature optimization.

So yes, you are silly.

> (Do I personally care about how fast it is?
> Not really.)

I don't care twice as much.

-- 
underground experts united
http://user.it.uu.se/~embe8573




^ permalink raw reply	[flat|nested] 54+ messages in thread

* RE: return first element in list with certain property
  2017-11-21 20:17                 ` Emanuel Berg
@ 2017-11-21 20:47                   ` Drew Adams
  0 siblings, 0 replies; 54+ messages in thread
From: Drew Adams @ 2017-11-21 20:47 UTC (permalink / raw)
  To: Emanuel Berg, help-gnu-emacs

> > So yes, not choosing to use `cl-find' in your
> > Emacs-Lisp code just because it traverses the
> > list twice is silly and is most likely
> > premature optimization.
> 
> So yes, you are silly.

I didn't choose not to use `cl-find'.  Did you?
For that reason alone ("just because")?

FWIW, I tend to use just the catch-throw idiom,
partly because some of my code supports also
Emacs versions that predate `cl-lib.el'.

But I don't think I have any code that searches
long enough lists that such performance
considerations would be worthwhile.



^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: return first element in list with certain property
  2017-11-21 20:10                 ` Emanuel Berg
@ 2017-11-21 21:33                   ` Michael Heerdegen
  2017-11-22 21:30                     ` Nicolas Petton
  2017-11-22 21:31                   ` Nicolas Petton
  1 sibling, 1 reply; 54+ messages in thread
From: Michael Heerdegen @ 2017-11-21 21:33 UTC (permalink / raw)
  To: help-gnu-emacs

Emanuel Berg <moasen@zoho.com> writes:

> When I can do the virtually the same with CL which is readily
> available it doesn't feel motivated to put this on presumable users to
> go fetch seq just for this.

If your package package-requires "seq", the package manager should
install the thing automatically when appropriate.  I'm not sure about
Emacsen with major version < 24, though.

Of course you can also just use the cl thing.


Michael.



^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: return first element in list with certain property
       [not found]               ` <mailman.4260.1511289435.27995.help-gnu-emacs@gnu.org>
@ 2017-11-22  3:52                 ` James K. Lowden
  2017-11-22  5:04                   ` Michael Heerdegen
                                     ` (2 more replies)
  0 siblings, 3 replies; 54+ messages in thread
From: James K. Lowden @ 2017-11-22  3:52 UTC (permalink / raw)
  To: help-gnu-emacs

On Tue, 21 Nov 2017 19:37:01 +0100
Michael Heerdegen <michael_heerdegen@web.de> wrote:

> Philipp Stephani <p.stephani2@gmail.com> writes:
> 
> > Please consider Knuth's statement about premature optimization.
> > Until your users have actually complained about the speed of your
> > product and you have benchmarked it and isolated cl-find-if as the
> > culprit, there's no need to micro-optimize. Presumably cl-find-if
> > has performed two iterations for years or decades without anybody
> > being bothered enough to improve it.
> 
> Not only that.  Seems the second iteration is at least ~50 times
> faster than the first one (using `elt' that is much faster than a
> loop), so it doesn't matter anyway.  If your program is slow, the
> second iteration will never be the culprit.

Not only that.  ;-)   Traversing the list twice is still O(n).  

I would guess in elisp the typical list is on the order of a dozen
elements.  As Rob Pike says,"Fancy algorithms are slow for small N, and
N is almost always small."  

 No matter how long the list is, it traversing it twice will only take
at most twice as long.  If your design fails when your data size
doubles, you have problems emacs won't solve.  

--jkl


^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: return first element in list with certain property
  2017-11-22  3:52                 ` James K. Lowden
@ 2017-11-22  5:04                   ` Michael Heerdegen
  2017-11-22 14:06                   ` Emanuel Berg
  2017-11-22 14:52                   ` Rusi
  2 siblings, 0 replies; 54+ messages in thread
From: Michael Heerdegen @ 2017-11-22  5:04 UTC (permalink / raw)
  To: James K. Lowden; +Cc: help-gnu-emacs

"James K. Lowden" <jklowden@speakeasy.net> writes:

> No matter how long the list is, it traversing it twice will only take
> at most twice as long.

Hey, you would not say that if you had to traverse the list yourself ;-)

When I optimize my own code, I always imagine I would have to perform
the algorithm myself.  Then you get a good feeling where it's worth to
optimize and where not.


Michael.



^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: return first element in list with certain property
  2017-11-22  3:52                 ` James K. Lowden
  2017-11-22  5:04                   ` Michael Heerdegen
@ 2017-11-22 14:06                   ` Emanuel Berg
  2017-11-22 14:52                   ` Rusi
  2 siblings, 0 replies; 54+ messages in thread
From: Emanuel Berg @ 2017-11-22 14:06 UTC (permalink / raw)
  To: help-gnu-emacs

James K. Lowden wrote:

> I would guess in elisp the typical list is on
> the order of a dozen elements. As Rob Pike
> says,"Fancy algorithms are slow for small N,
> and N is almost always small."

But here it is not a matter of fancy algorithms
to do it in N. Actually the one implemented to
do it in 2N seems "fancier" to me, if that is
the word.

-- 
underground experts united
http://user.it.uu.se/~embe8573




^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: return first element in list with certain property
  2017-11-22  3:52                 ` James K. Lowden
  2017-11-22  5:04                   ` Michael Heerdegen
  2017-11-22 14:06                   ` Emanuel Berg
@ 2017-11-22 14:52                   ` Rusi
  2 siblings, 0 replies; 54+ messages in thread
From: Rusi @ 2017-11-22 14:52 UTC (permalink / raw)
  To: help-gnu-emacs

On Wednesday, November 22, 2017 at 9:22:18 AM UTC+5:30, James K. Lowden wrote:
> On Tue, 21 Nov 2017 19:37:01 +0100
> Michael Heerdegen wrote:
> 
> > Philipp Stephani  writes:
> > 
> > > Please consider Knuth's statement about premature optimization.
> > > Until your users have actually complained about the speed of your
> > > product and you have benchmarked it and isolated cl-find-if as the
> > > culprit, there's no need to micro-optimize. Presumably cl-find-if
> > > has performed two iterations for years or decades without anybody
> > > being bothered enough to improve it.
> > 
> > Not only that.  Seems the second iteration is at least ~50 times
> > faster than the first one (using `elt' that is much faster than a
> > loop), so it doesn't matter anyway.  If your program is slow, the
> > second iteration will never be the culprit.
> 
> Not only that.  ;-)   Traversing the list twice is still O(n).  
> 
> I would guess in elisp the typical list is on the order of a dozen
> elements.  As Rob Pike says,"Fancy algorithms are slow for small N, and
> N is almost always small."  
> 
>  No matter how long the list is, it traversing it twice will only take
> at most twice as long.  If your design fails when your data size
> doubles, you have problems emacs won't solve.  

I dont think its quite as simple as that…

Consider python wherein
- C is typically 2 orders of magnitude (hundreds of times) faster than python
- the two can cohabit quite closely; eg moving a ordinary python loop to a 
vector numpy operation implicitly moves python to C with corresponding speedup
(and speed-down due to conversion etc)

And so the two versions are not just comparing loop vs loop-loop
but loop₁ vs loop₂ - loop₃
where the ₁₂₃ can vary across {interpreter, bare-metal}
we could have all manner of possibilities of speedup and speed-down

Sure its not nearly as simple to add C to elisp as to python
However it is essentially the same thing: elisp and python are interpreters
sitting on top of C. Which in big-O terms means 1 loop vs 2 constant multiplier
vs bare-metal vs interpretive overhead multiplier


^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: return first element in list with certain property
  2017-11-21  1:54           ` Emanuel Berg
  2017-11-21  2:18             ` Emanuel Berg
  2017-11-21 18:01             ` Philipp Stephani
@ 2017-11-22 21:28             ` Nicolas Petton
  2017-11-23  0:56               ` Emanuel Berg
  2 siblings, 1 reply; 54+ messages in thread
From: Nicolas Petton @ 2017-11-22 21:28 UTC (permalink / raw)
  To: Emanuel Berg, help-gnu-emacs

[-- Attachment #1: Type: text/plain, Size: 442 bytes --]

Emanuel Berg <moasen@zoho.com> writes:

> See, my intuition was right, seq-find *is*
> better even tho you guys are in denial about
> it :)

The way I see it (I'm completely biased of course), the real advantage
of `seq' is that it provides a complete and consistent sequence
manipulation API (I tried to design it that way at least), and can be
extended to work with other data structures (see stream.el in ELPA for
instance).

Cheers,
Nico

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 487 bytes --]

^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: return first element in list with certain property
  2017-11-21 21:33                   ` Michael Heerdegen
@ 2017-11-22 21:30                     ` Nicolas Petton
  0 siblings, 0 replies; 54+ messages in thread
From: Nicolas Petton @ 2017-11-22 21:30 UTC (permalink / raw)
  To: Michael Heerdegen, help-gnu-emacs

[-- Attachment #1: Type: text/plain, Size: 333 bytes --]

Michael Heerdegen <michael_heerdegen@web.de> writes:

> If your package package-requires "seq", the package manager should
> install the thing automatically when appropriate.  I'm not sure about
> Emacsen with major version < 24, though.

I have never tried loading `seq' in Emacs < 24, so don't expect this to
work :)

Cheers,
Nico

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 487 bytes --]

^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: return first element in list with certain property
  2017-11-21 20:10                 ` Emanuel Berg
  2017-11-21 21:33                   ` Michael Heerdegen
@ 2017-11-22 21:31                   ` Nicolas Petton
  1 sibling, 0 replies; 54+ messages in thread
From: Nicolas Petton @ 2017-11-22 21:31 UTC (permalink / raw)
  To: Emanuel Berg, help-gnu-emacs

[-- Attachment #1: Type: text/plain, Size: 245 bytes --]

Emanuel Berg <moasen@zoho.com> writes:

> OK, so is it different in Emacs 25? Or is one
> still supposed to get seq.el from ELPA, only
> with no backport hassle?

Yes, seq.el is included in Emacs since 25.1 (same goes for map.el).

Cheers,
Nico

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 487 bytes --]

^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: return first element in list with certain property
  2017-11-22 21:28             ` Nicolas Petton
@ 2017-11-23  0:56               ` Emanuel Berg
  2017-11-23  1:17                 ` Michael Heerdegen
  2017-11-25  2:57                 ` John Mastro
  0 siblings, 2 replies; 54+ messages in thread
From: Emanuel Berg @ 2017-11-23  0:56 UTC (permalink / raw)
  To: help-gnu-emacs

Nicolas Petton wrote:

> The way I see it (I'm completely biased of
> course), the real advantage of `seq' is that
> it provides a complete and consistent
> sequence manipulation API (I tried to design
> it that way at least), and can be extended to
> work with other data structures (see
> stream.el in ELPA for instance).

With respect to this particular issue, seq and
`seq-find' is superior to CL and `cl-find-if'.
After that was revealed, the only thing that
made me hesitant about using it was the install
hassle. But now that you say it is included in
vanilla Emacs from version 25, which is right
around the corner, perhaps I should use
it still?

How will this be expressed in the source?
Will plain `require' be enough? There was talk
in another post the package should
"package-require" it so it will be installed
automatically along with the package. But if
there is a function to do this, I can't find
it. And if there is, will it be transparent so
it won't install anything unless necessary?

Or do I have to prompt the current Emacs
version to take different action?

-- 
underground experts united
http://user.it.uu.se/~embe8573




^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: return first element in list with certain property
  2017-11-23  0:56               ` Emanuel Berg
@ 2017-11-23  1:17                 ` Michael Heerdegen
  2017-11-23  1:30                   ` Emanuel Berg
  2017-11-25  2:57                 ` John Mastro
  1 sibling, 1 reply; 54+ messages in thread
From: Michael Heerdegen @ 2017-11-23  1:17 UTC (permalink / raw)
  To: help-gnu-emacs

Emanuel Berg <moasen@zoho.com> writes:

> How will this be expressed in the source?  Will plain `require' be
> enough?

No.

> There was talk in another post the package should "package-require" it
> so it will be installed automatically along with the package. But if
> there is a function to do this, I can't find it. And if there is, will
> it be transparent so it won't install anything unless necessary?

Sure, it won't.

You declare package dependencies in the package header - see (info
"(elisp) Simple Packages") - that's what I called "package-require".

You maybe want to read the whole (info "(elisp) Packaging").  Everything
is quite simple.


Michael.



^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: return first element in list with certain property
  2017-11-23  1:17                 ` Michael Heerdegen
@ 2017-11-23  1:30                   ` Emanuel Berg
  0 siblings, 0 replies; 54+ messages in thread
From: Emanuel Berg @ 2017-11-23  1:30 UTC (permalink / raw)
  To: help-gnu-emacs

Michael Heerdegen wrote:

> You maybe want to read the whole (info
> "(elisp) Packaging"). Everything is
> quite simple.

Oh, no! A whole new section! I still haven't
read the whole one on "Tips and Conventions"...

-- 
underground experts united
http://user.it.uu.se/~embe8573




^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: return first element in list with certain property
  2017-11-23  0:56               ` Emanuel Berg
  2017-11-23  1:17                 ` Michael Heerdegen
@ 2017-11-25  2:57                 ` John Mastro
  2017-11-25  3:54                   ` Robert Thorpe
  1 sibling, 1 reply; 54+ messages in thread
From: John Mastro @ 2017-11-25  2:57 UTC (permalink / raw)
  To: help-gnu-emacs@gnu.org

Emanuel Berg <moasen@zoho.com> wrote:
> With respect to this particular issue, seq and
> `seq-find' is superior to CL and `cl-find-if'.
> After that was revealed, the only thing that
> made me hesitant about using it was the install
> hassle. But now that you say it is included in
> vanilla Emacs from version 25, which is right
> around the corner, perhaps I should use
> it still?

Emacs 25 was released a bit over a year ago, in September 2016 :)

I think it's perfectly reasonable to use seq.el in your package.

        John



^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: return first element in list with certain property
  2017-11-25  2:57                 ` John Mastro
@ 2017-11-25  3:54                   ` Robert Thorpe
  2017-11-25  4:44                     ` Alexis
                                       ` (3 more replies)
  0 siblings, 4 replies; 54+ messages in thread
From: Robert Thorpe @ 2017-11-25  3:54 UTC (permalink / raw)
  To: John Mastro; +Cc: help-gnu-emacs

John Mastro <john.b.mastro@gmail.com> writes:

> Emanuel Berg <moasen@zoho.com> wrote:
>> With respect to this particular issue, seq and
>> `seq-find' is superior to CL and `cl-find-if'.
>> After that was revealed, the only thing that
>> made me hesitant about using it was the install
>> hassle. But now that you say it is included in
>> vanilla Emacs from version 25, which is right
>> around the corner, perhaps I should use
>> it still?
>
> Emacs 25 was released a bit over a year ago, in September 2016 :)
>
> I think it's perfectly reasonable to use seq.el in your package.

I don't agree, 24 isn't that old.  Perhaps you use Microsoft Windows?

Those of us using *nix derivatives are in a different situation.
Upgrading is risky.  If you use GNU/Linux (or whatever you call it) it
makes sense to stick with one distribution (I use Xubuntu).  It makes
sense not to upgrade too regularly.  Compiling Emacs is a non-starter
because there are too many build options and nobody understands them
except distro builders and the Emacs maintainers.  Unfortunately, that
means not upgrading Emacs.

I use Emacs 25.2 at work on MS Windows.  At home I use Emacs 24.5.  I will
continue to use it until I have to upgrade Ubuntu.

I consider this worthwhile because owning and updating a MS Windows
machine would be much more troublesome and expensive.  That applies
whatever you think about software licensing.  However, for Emacs it
means using older versions.

BR,
Robert Thorpe




^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: return first element in list with certain property
  2017-11-25  3:54                   ` Robert Thorpe
@ 2017-11-25  4:44                     ` Alexis
  2017-11-25  7:10                     ` tomas
                                       ` (2 subsequent siblings)
  3 siblings, 0 replies; 54+ messages in thread
From: Alexis @ 2017-11-25  4:44 UTC (permalink / raw)
  To: Robert Thorpe; +Cc: John Mastro, help-gnu-emacs


Robert Thorpe <rt@robertthorpeconsulting.com> writes:

> Compiling Emacs is a non-starter because there are too many 
> build
> options and nobody understands them except distro builders and 
> the
> Emacs maintainers.

As a data point: i use Debian, am neither a distro builder nor an 
Emacs
maintainer, but nevertheless compile Emacs myself. Once the 
development
libraries are installed - and i only need to do so manually once 
per
Debian installation - all i need to do is unpack the Emacs 
tarball, cd
to the unpacked directory, and do the usual:

$ ./configure && make && make install

which, in my experience, Does The Right Thing.


Alexis.



^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: return first element in list with certain property
  2017-11-25  3:54                   ` Robert Thorpe
  2017-11-25  4:44                     ` Alexis
@ 2017-11-25  7:10                     ` tomas
  2017-11-25 17:11                       ` Emanuel Berg
  2017-11-25  7:46                     ` Eli Zaretskii
  2017-11-25 19:00                     ` John Mastro
  3 siblings, 1 reply; 54+ messages in thread
From: tomas @ 2017-11-25  7:10 UTC (permalink / raw)
  To: help-gnu-emacs

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

On Sat, Nov 25, 2017 at 03:54:15AM +0000, Robert Thorpe wrote:
> John Mastro <john.b.mastro@gmail.com> writes:
> 
> > Emanuel Berg <moasen@zoho.com> wrote:
> >> With respect to this particular issue, seq and
> >> `seq-find' is superior to CL and `cl-find-if'.
> >> After that was revealed, the only thing that
> >> made me hesitant about using it was the install
> >> hassle. But now that you say it is included in
> >> vanilla Emacs from version 25, which is right
> >> around the corner, perhaps I should use
> >> it still?
> >
> > Emacs 25 was released a bit over a year ago, in September 2016 :)
> >
> > I think it's perfectly reasonable to use seq.el in your package.
> 
> I don't agree, 24 isn't that old.  Perhaps you use Microsoft Windows?
> 
> Those of us using *nix derivatives are in a different situation.
> Upgrading is risky.  If you use GNU/Linux (or whatever you call it) it
> makes sense to stick with one distribution (I use Xubuntu).  It makes
> sense not to upgrade too regularly.  Compiling Emacs is a non-starter
> because there are too many build options and nobody understands them
> except distro builders and the Emacs maintainers.  Unfortunately, that
> means not upgrading Emacs.

[...]

I disagree somewhat. At the moment, Emacs tip is compiling peacefully
in the background (Debian GNU Linux user here). Compiling Emacs has
never been so easy, especially on GNU/Linux.

My strategy is this: There are some applications close to my heart
(Emacs is one :) which I do compile myself (I have a strong opinion
about things, and disagree on some choices made by the distributor).
I try to script everything (e.g. the "configuration" is a script)
and compile often. This keeps the build pipeline "warm".

That said, I agree, somewhat, too: I couldn't do that to all of my
currently installed packages (roughly 100) without going insane.
There I trust blindly my distributor, to whom I'm infinitely grateful
for this incredible job.

Cheers
- -- tomás
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.12 (GNU/Linux)

iEYEARECAAYFAloZF2EACgkQBcgs9XrR2kZGWACffoOO9KgKFHtbWrIOh7eIUmr5
ItUAn32g+JRiTZkBllNJYkmwb5bmSgQP
=J65L
-----END PGP SIGNATURE-----



^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: return first element in list with certain property
  2017-11-25  3:54                   ` Robert Thorpe
  2017-11-25  4:44                     ` Alexis
  2017-11-25  7:10                     ` tomas
@ 2017-11-25  7:46                     ` Eli Zaretskii
  2017-11-25  8:03                       ` tomas
  2017-11-25 19:00                     ` John Mastro
  3 siblings, 1 reply; 54+ messages in thread
From: Eli Zaretskii @ 2017-11-25  7:46 UTC (permalink / raw)
  To: help-gnu-emacs

> From: Robert Thorpe <rt@robertthorpeconsulting.com>
> Date: Sat, 25 Nov 2017 03:54:15 +0000
> Cc: help-gnu-emacs@gnu.org
> 
> Compiling Emacs is a non-starter because there are too many build
> options and nobody understands them except distro builders and the
> Emacs maintainers.

??? Just use the defaults (i.e. no options except, perhaps, --prefix),
and you should be fine.  The non-default options indeed need you to
understand them, but they are for corner cases, and generally can be
ignored unless your needs are unusual, e.g. if your Unix box is
32-bit, or your GTK is buggy.



^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: return first element in list with certain property
  2017-11-25  7:46                     ` Eli Zaretskii
@ 2017-11-25  8:03                       ` tomas
  0 siblings, 0 replies; 54+ messages in thread
From: tomas @ 2017-11-25  8:03 UTC (permalink / raw)
  To: help-gnu-emacs

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

On Sat, Nov 25, 2017 at 09:46:28AM +0200, Eli Zaretskii wrote:
> > From: Robert Thorpe <rt@robertthorpeconsulting.com>
> > Date: Sat, 25 Nov 2017 03:54:15 +0000
> > Cc: help-gnu-emacs@gnu.org
> > 
> > Compiling Emacs is a non-starter because there are too many build
> > options and nobody understands them except distro builders and the
> > Emacs maintainers.
> 
> ??? Just use the defaults (i.e. no options except, perhaps, --prefix),
> and you should be fine [...]

Yes. And even for crazy nuts as me who do care about some options,
it's just as difficult as finding out once and letting a shell
script "remember" the settings (perhaps adjust once a year).

But one has to choose which packages to care about and which ones
to leave to the distributor. Decisions, decisions... :)

Cheers
- -- t
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.12 (GNU/Linux)

iEYEARECAAYFAloZI+oACgkQBcgs9XrR2kZTtgCdGC1OjLRt0nwN6h5GnzpwTwE8
kSIAn0e/p5zcF9cdGwTA/iFtWZ2wInhS
=Oxfk
-----END PGP SIGNATURE-----



^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: return first element in list with certain property
  2017-11-25  7:10                     ` tomas
@ 2017-11-25 17:11                       ` Emanuel Berg
  0 siblings, 0 replies; 54+ messages in thread
From: Emanuel Berg @ 2017-11-25 17:11 UTC (permalink / raw)
  To: help-gnu-emacs

t wrote:

> I disagree somewhat. At the moment, Emacs tip
> is compiling peacefully in the background
> (Debian GNU Linux user here). Compiling Emacs
> has never been so easy, especially on
> GNU/Linux.
>
> My strategy is this: There are some
> applications close to my heart (Emacs is one
> :) which I do compile myself (I have a strong
> opinion about things, and disagree on some
> choices made by the distributor). I try to
> script everything (e.g. the "configuration"
> is a script) and compile often. This keeps
> the build pipeline "warm".

Yes, it is not difficult to compile Emacs or
any other individual application from source.
If it is then something is wrong. To put the
process (procedure) in a script or shell
function is a good idea, if you didn't get
a script with the tarball. Even so you can
execute that script from your own script or
function :) What's difficult about compiling is
when multiple programs are involved and they
depend on each other in ways that are difficult
for a human to grasp. Luckily that is easy for
a computer to which is the basis for the by now
very successful packet managers.

-- 
underground experts united
http://user.it.uu.se/~embe8573




^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: return first element in list with certain property
  2017-11-25  3:54                   ` Robert Thorpe
                                       ` (2 preceding siblings ...)
  2017-11-25  7:46                     ` Eli Zaretskii
@ 2017-11-25 19:00                     ` John Mastro
  2017-11-25 19:45                       ` Emanuel Berg
  3 siblings, 1 reply; 54+ messages in thread
From: John Mastro @ 2017-11-25 19:00 UTC (permalink / raw)
  To: help-gnu-emacs@gnu.org; +Cc: Robert Thorpe

Robert Thorpe <rt@robertthorpeconsulting.com> wrote:
> John Mastro <john.b.mastro@gmail.com> writes:
> > Emacs 25 was released a bit over a year ago, in September 2016 :)
> >
> > I think it's perfectly reasonable to use seq.el in your package.
>
> I don't agree, 24 isn't that old.  Perhaps you use Microsoft Windows?

I am (un)lucky enough to use all three of GNU/Linux, MacOS, and Windows
on a regular basis.

> Those of us using *nix derivatives are in a different situation.
> Upgrading is risky.  If you use GNU/Linux (or whatever you call it) it
> makes sense to stick with one distribution (I use Xubuntu).  It makes
> sense not to upgrade too regularly.  Compiling Emacs is a non-starter
> because there are too many build options and nobody understands them
> except distro builders and the Emacs maintainers.  Unfortunately, that
> means not upgrading Emacs.

I agree that some users won't be comfortable compiling Emacs (or any
program) themselves. However, I don't agree that "upgrading [Emacs] is
risky", it's "a non-starter", or that "nobody understands [build
options]", especially not for users on GNU/Linux or Unix-like systems in
general.

> I use Emacs 25.2 at work on MS Windows.  At home I use Emacs 24.5.  I will
> continue to use it until I have to upgrade Ubuntu.

FWIW, I build Emacs's master branch (Emacs 27.0.50) on all three
platforms, and I'm neither a distro builder nor an Emacs maintainer.

> I consider this worthwhile because owning and updating a MS Windows
> machine would be much more troublesome and expensive.  That applies
> whatever you think about software licensing.  However, for Emacs it
> means using older versions.

More generally, I want to note that I didn't say "there are no downsides
to using seq.el in place of cl-lib" or "there's no case for supporting
Emacs versions < 25.1". However, particularly for a new package with no
existing users, I do think it's perfectly reasonable to use seq.el and
support only Emacs versions >= 25.1.

        John



^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: return first element in list with certain property
  2017-11-25 19:00                     ` John Mastro
@ 2017-11-25 19:45                       ` Emanuel Berg
  2017-11-27  3:44                         ` Michael Heerdegen
  0 siblings, 1 reply; 54+ messages in thread
From: Emanuel Berg @ 2017-11-25 19:45 UTC (permalink / raw)
  To: help-gnu-emacs

John Mastro wrote:

> I do think it's perfectly reasonable to use
> seq.el and support only Emacs versions >=
> 25.1.

So if I do, I don't need to "package-require"
it in the commented package header? It
will be enough with just a `require'?

However since the "package-require" was
supposed to be transparent, and not download
anything unless needed, doesn't that amount to
- if I put it there - it will be installed on
< 25.1, but not installed on version where seq
is part of vanilla Emacs?

Or is this "in theory" only?

> I agree that some users won't be comfortable
> compiling Emacs (or any program) themselves.
> However, I don't agree that "upgrading
> [Emacs] is risky", it's "a non-starter", or
> that "nobody understands [build options]",
> especially not for users on GNU/Linux or
> Unix-like systems in general.

I think the last quote was a way of saying "it
is difficult" - which you and I don't agree on
anyway :)

But as for the build options, what options is
it that are difficult to understand?
They should be documented somewhere if they are
not self-explanatory or conventional enough -
there should be comments in code at the very
least. Try understanding them one by one
instead of grouping them together claiming them
beyond mere users. And if everything fails,
just use the default ones and be a happy Emacs
user ever ever :)

> More generally, I want to note that I didn't
> say "there are no downsides to using seq.el
> in place of cl-lib" or "there's no case for
> supporting Emacs versions < 25.1". However,
> particularly for a new package with no
> existing users

Yes, one :) And not just anyone, either :))

-- 
underground experts united
http://user.it.uu.se/~embe8573




^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: return first element in list with certain property
  2017-11-25 19:45                       ` Emanuel Berg
@ 2017-11-27  3:44                         ` Michael Heerdegen
  0 siblings, 0 replies; 54+ messages in thread
From: Michael Heerdegen @ 2017-11-27  3:44 UTC (permalink / raw)
  To: help-gnu-emacs

Emanuel Berg <moasen@zoho.com> writes:

> John Mastro wrote:
>
> > I do think it's perfectly reasonable to use seq.el and support only
> > Emacs versions >= 25.1.
>
> So if I do, I don't need to "package-require" it in the commented
> package header? It will be enough with just a `require'?

Yes.

> However since the "package-require" was supposed to be transparent,
> and not download anything unless needed, doesn't that amount to - if I
> put it there - it will be installed on < 25.1, but not installed on
> version where seq is part of vanilla Emacs?

Exactly.  Have a look at the "beacon" package for example.  It depends
on "seq" - see the header.  If you install it in Emacs 24, the "seq"
Elpa package will be installed along with it.  In Emacs 25, only the
"beacon" package itself is installed.  Try it!


Michael.



^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: return first element in list with certain property
       [not found] ` <mailman.4093.1511127491.27995.help-gnu-emacs@gnu.org>
@ 2018-03-06  0:31   ` Robert L.
  2018-03-06  8:53     ` Emanuel Berg
  0 siblings, 1 reply; 54+ messages in thread
From: Robert L. @ 2018-03-06  0:31 UTC (permalink / raw)
  To: help-gnu-emacs

On 11/19/2017, Philipp Stephani wrote:

> Emanuel Berg <moasen@zoho.com> schrieb am So., 19. Nov. 2017 um 21:44 Uhr:
> 
> > What is considered the right way to return the
> > first element in list that has
> > a certain property?
> > 
> > The best way I've found so far is `cl-some' and
> > then `and'. While I don't consider the
> > "`and' hack" to be detrimental in any way I was
> > curious if there was a complete
> > "hack free" way...
> > 
> 
> cl-find-if


(defun list-find-if (pred xs)
  (while (and (consp xs) (not (funcall pred (car xs))))
    (pop xs))
  (car xs))

-- 
The report card by the American Society of Civil Engineers showed the national
infrastructure a single grade above failure, a step from declining to the point
where everyday things simply stop working the way people expect them to.
http://archive.org/details/nolies


^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: return first element in list with certain property
  2018-03-06  0:31   ` Robert L.
@ 2018-03-06  8:53     ` Emanuel Berg
  2018-03-06  9:29       ` Emanuel Berg
  0 siblings, 1 reply; 54+ messages in thread
From: Emanuel Berg @ 2018-03-06  8:53 UTC (permalink / raw)
  To: help-gnu-emacs

Robert L. wrote:

>> cl-find-if
>
> (defun list-find-if (pred xs)
>   (while (and (consp xs) (not (funcall pred (car xs))))
>     (pop xs))
>   (car xs))

OK, but without having tested it, is there any
reason to favor it to `cl-find-if'?

-- 
underground experts united
http://user.it.uu.se/~embe8573


^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: return first element in list with certain property
  2018-03-06  8:53     ` Emanuel Berg
@ 2018-03-06  9:29       ` Emanuel Berg
  0 siblings, 0 replies; 54+ messages in thread
From: Emanuel Berg @ 2018-03-06  9:29 UTC (permalink / raw)
  To: help-gnu-emacs

> OK, but without having tested it, is there
> any reason to favor it to `cl-find-if'?

Now I have tested it and it seems
"list-find-if" is a little faster than
`cl-find-if'!

So good job even tho I will stick to CL
thank you :)

(require 'cl-lib)

(defun list-find-if (pred xs)
  (while (and (consp xs)
              (not (funcall pred (car xs))) )
    (pop xs) )
  (car xs) )

(let*((max-value          1000000)
      (random-list        (create-random-list max-value max-value))
      (bigger-than-random (lambda (e) (> e (random max-value)))) )
  (message "Testing for %s" max-value)
  (message
   "Test list-find-if: %s"
   (measure-time (list-find-if bigger-than-random random-list)) )
  (message
   "Test cl-find-if: %s"
   (measure-time (cl-find-if   bigger-than-random random-list)) )
  )

"create-random-list" and "measure-time" here:

    http://user.it.uu.se/~embe8573/emacs-init/measure.el

-- 
underground experts united
http://user.it.uu.se/~embe8573


^ permalink raw reply	[flat|nested] 54+ messages in thread

end of thread, other threads:[~2018-03-06  9:29 UTC | newest]

Thread overview: 54+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2017-11-19 20:43 return first element in list with certain property Emanuel Berg
2017-11-19 20:51 ` Eric Abrahamsen
2017-11-19 21:37 ` Philipp Stephani
2017-11-19 22:55   ` Emanuel Berg
2017-11-20 18:51     ` John Mastro
2017-11-20 19:21       ` Michael Heerdegen
2017-11-20 21:20         ` Emanuel Berg
2017-11-20 21:40           ` John Mastro
2017-11-20 22:19           ` Michael Heerdegen
2017-11-20 20:52       ` Emanuel Berg
2017-11-20 20:12   ` Drew Adams
2017-11-20 20:49     ` Eric Abrahamsen
2017-11-20 21:16       ` Emanuel Berg
2017-11-20 22:02         ` Eric Abrahamsen
2017-11-21  1:54           ` Emanuel Berg
2017-11-21  2:18             ` Emanuel Berg
2017-11-21 17:34               ` Michael Heerdegen
2017-11-21 20:10                 ` Emanuel Berg
2017-11-21 21:33                   ` Michael Heerdegen
2017-11-22 21:30                     ` Nicolas Petton
2017-11-22 21:31                   ` Nicolas Petton
2017-11-21 18:01             ` Philipp Stephani
2017-11-21 18:37               ` Michael Heerdegen
2017-11-21 19:26               ` Drew Adams
2017-11-21 20:17                 ` Emanuel Berg
2017-11-21 20:47                   ` Drew Adams
2017-11-21 20:14               ` Emanuel Berg
     [not found]               ` <mailman.4260.1511289435.27995.help-gnu-emacs@gnu.org>
2017-11-22  3:52                 ` James K. Lowden
2017-11-22  5:04                   ` Michael Heerdegen
2017-11-22 14:06                   ` Emanuel Berg
2017-11-22 14:52                   ` Rusi
2017-11-22 21:28             ` Nicolas Petton
2017-11-23  0:56               ` Emanuel Berg
2017-11-23  1:17                 ` Michael Heerdegen
2017-11-23  1:30                   ` Emanuel Berg
2017-11-25  2:57                 ` John Mastro
2017-11-25  3:54                   ` Robert Thorpe
2017-11-25  4:44                     ` Alexis
2017-11-25  7:10                     ` tomas
2017-11-25 17:11                       ` Emanuel Berg
2017-11-25  7:46                     ` Eli Zaretskii
2017-11-25  8:03                       ` tomas
2017-11-25 19:00                     ` John Mastro
2017-11-25 19:45                       ` Emanuel Berg
2017-11-27  3:44                         ` Michael Heerdegen
2017-11-20 22:59         ` Drew Adams
2017-11-21  1:50           ` Emanuel Berg
     [not found] ` <mailman.4093.1511127491.27995.help-gnu-emacs@gnu.org>
2018-03-06  0:31   ` Robert L.
2018-03-06  8:53     ` Emanuel Berg
2018-03-06  9:29       ` Emanuel Berg
     [not found] <mailman.4086.1511124258.27995.help-gnu-emacs@gnu.org>
2017-11-19 21:19 ` Marco Wahl
2017-11-19 22:51   ` Emanuel Berg
2017-11-21  4:00   ` Emanuel Berg
2017-11-19 21:20 ` Marco Wahl

Code repositories for project(s) associated with this external index

	https://git.savannah.gnu.org/cgit/emacs.git
	https://git.savannah.gnu.org/cgit/emacs/org-mode.git

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.