unofficial mirror of help-gnu-emacs@gnu.org
 help / color / mirror / Atom feed
* shorter form of frequently-seen lisp idiom?
@ 2005-02-19 18:33 Joe Corneli
  0 siblings, 0 replies; 15+ messages in thread
From: Joe Corneli @ 2005-02-19 18:33 UTC (permalink / raw)


Is there a shorter way to concatenate a list of strings
than this?

 (eval (append (list 'concat) list-of-strings))

Or more generally, 

 (eval (append (list 'function-that-acts-on-foos) list-of-foos))

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

* Re: shorter form of frequently-seen lisp idiom?
       [not found] <mailman.680.1108839059.32256.help-gnu-emacs@gnu.org>
@ 2005-02-19 18:43 ` David Kastrup
  2005-02-19 23:31   ` August
       [not found]   ` <mailman.714.1108857188.32256.help-gnu-emacs@gnu.org>
  2005-02-22 14:44 ` Stefan Monnier
  1 sibling, 2 replies; 15+ messages in thread
From: David Kastrup @ 2005-02-19 18:43 UTC (permalink / raw)


Joe Corneli <jcorneli@math.utexas.edu> writes:

> Is there a shorter way to concatenate a list of strings
> than this?
>
>  (eval (append (list 'concat) list-of-strings))
>
> Or more generally, 
>
>  (eval (append (list 'function-that-acts-on-foos) list-of-foos))

(apply #'concat list-of-strings)


-- 
David Kastrup, Kriemhildstr. 15, 44793 Bochum

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

* Re: shorter form of frequently-seen lisp idiom?
  2005-02-19 18:43 ` shorter form of frequently-seen lisp idiom? David Kastrup
@ 2005-02-19 23:31   ` August
       [not found]   ` <mailman.714.1108857188.32256.help-gnu-emacs@gnu.org>
  1 sibling, 0 replies; 15+ messages in thread
From: August @ 2005-02-19 23:31 UTC (permalink / raw)


On lör, 2005-02-19 at 19:43 +0100, David Kastrup wrote:
> Joe Corneli <jcorneli@math.utexas.edu> writes:
> 
> > Is there a shorter way to concatenate a list of strings
> > than this?
> >
> >  (eval (append (list 'concat) list-of-strings))
> >
> > Or more generally, 
> >
> >  (eval (append (list 'function-that-acts-on-foos) list-of-foos))
> 
> (apply #'concat list-of-strings)
> 
> 

What's the purpose of the hash sign? `(apply 'concat list-of-strings)'
works too.

-- 
August

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

* Re: shorter form of frequently-seen lisp idiom?
       [not found]   ` <mailman.714.1108857188.32256.help-gnu-emacs@gnu.org>
@ 2005-02-19 23:55     ` David Kastrup
  2005-02-21  0:07       ` Denis Bueno
       [not found]       ` <mailman.835.1108945397.32256.help-gnu-emacs@gnu.org>
  0 siblings, 2 replies; 15+ messages in thread
From: David Kastrup @ 2005-02-19 23:55 UTC (permalink / raw)


August <fusionfive@comhem.se> writes:

> On lör, 2005-02-19 at 19:43 +0100, David Kastrup wrote:
>> Joe Corneli <jcorneli@math.utexas.edu> writes:
>> 
>> > Is there a shorter way to concatenate a list of strings
>> > than this?
>> >
>> >  (eval (append (list 'concat) list-of-strings))
>> >
>> > Or more generally, 
>> >
>> >  (eval (append (list 'function-that-acts-on-foos) list-of-foos))
>> 
>> (apply #'concat list-of-strings)
>> 
>
> What's the purpose of the hash sign? `(apply 'concat
> list-of-strings)' works too.

'concat is short for (quote concat), #'concat is short for
(function concat).

It tells the byte compiler that it is ok to compile the function.  For
example,

'(lambda nil (if))

is a perfectly valid list and if used in function context even in
compiled Elisp files, will be evaled the slow way at run time.
#'(lambda nil (if)) in contrast gets byte-compiled (and the byte
compiler will probably barf).


-- 
David Kastrup, Kriemhildstr. 15, 44793 Bochum

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

* Re: shorter form of frequently-seen lisp idiom?
  2005-02-19 23:55     ` David Kastrup
@ 2005-02-21  0:07       ` Denis Bueno
  2005-02-21  0:17         ` Denis Bueno
       [not found]       ` <mailman.835.1108945397.32256.help-gnu-emacs@gnu.org>
  1 sibling, 1 reply; 15+ messages in thread
From: Denis Bueno @ 2005-02-21  0:07 UTC (permalink / raw)


On Sun, 20 Feb 2005 00:55:53 +0100, David Kastrup <dak@gnu.org> wrote:
> August <fusionfive@comhem.se> writes:
> 
> > On lör, 2005-02-19 at 19:43 +0100, David Kastrup wrote:
> >> Joe Corneli <jcorneli@math.utexas.edu> writes:
> >>
> >> > Is there a shorter way to concatenate a list of strings
> >> > than this?
> >> >
> >> >  (eval (append (list 'concat) list-of-strings))
> >> >
> >> > Or more generally,
> >> >
> >> >  (eval (append (list 'function-that-acts-on-foos) list-of-foos))

Or even:

  (reduce #'function-that-acts-on-2-foos list-of-foos)

Like:

  (reduce #'concat '("aoeu" "1234" "htns")) =>
  "aoeu1234htns"

--
Denis Bueno

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

* Re: shorter form of frequently-seen lisp idiom?
  2005-02-21  0:07       ` Denis Bueno
@ 2005-02-21  0:17         ` Denis Bueno
  0 siblings, 0 replies; 15+ messages in thread
From: Denis Bueno @ 2005-02-21  0:17 UTC (permalink / raw)


You might need to (require 'cl) first.


On Sun, 20 Feb 2005 19:07:11 -0500, Denis Bueno <dbueno@gmail.com> wrote:
> On Sun, 20 Feb 2005 00:55:53 +0100, David Kastrup <dak@gnu.org> wrote:
> > August <fusionfive@comhem.se> writes:
> >
> > > On lör, 2005-02-19 at 19:43 +0100, David Kastrup wrote:
> > >> Joe Corneli <jcorneli@math.utexas.edu> writes:
> > >>
> > >> > Is there a shorter way to concatenate a list of strings
> > >> > than this?
> > >> >
> > >> >  (eval (append (list 'concat) list-of-strings))
> > >> >
> > >> > Or more generally,
> > >> >
> > >> >  (eval (append (list 'function-that-acts-on-foos) list-of-foos))
> 
> Or even:
> 
>   (reduce #'function-that-acts-on-2-foos list-of-foos)
> 
> Like:
> 
>   (reduce #'concat '("aoeu" "1234" "htns")) =>
>   "aoeu1234htns"
> 
> --
> Denis Bueno
> 


-- 
Denis Bueno

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

* Re: shorter form of frequently-seen lisp idiom?
       [not found]       ` <mailman.835.1108945397.32256.help-gnu-emacs@gnu.org>
@ 2005-02-21  0:28         ` David Kastrup
  0 siblings, 0 replies; 15+ messages in thread
From: David Kastrup @ 2005-02-21  0:28 UTC (permalink / raw)


Denis Bueno <dbueno@gmail.com> writes:

> On Sun, 20 Feb 2005 00:55:53 +0100, David Kastrup <dak@gnu.org> wrote:
>> August <fusionfive@comhem.se> writes:
>> 
>> > On lör, 2005-02-19 at 19:43 +0100, David Kastrup wrote:
>> >> Joe Corneli <jcorneli@math.utexas.edu> writes:
>> >>
>> >> > Is there a shorter way to concatenate a list of strings
>> >> > than this?
>> >> >
>> >> >  (eval (append (list 'concat) list-of-strings))
>> >> >
>> >> > Or more generally,
>> >> >
>> >> >  (eval (append (list 'function-that-acts-on-foos) list-of-foos))
>
> Or even:
>
>   (reduce #'function-that-acts-on-2-foos list-of-foos)
>
> Like:
>
>   (reduce #'concat '("aoeu" "1234" "htns")) =>
>   "aoeu1234htns"

Why should one do that?  Quite less efficient than using "apply", and
only available if cl has been loaded.

-- 
David Kastrup, Kriemhildstr. 15, 44793 Bochum

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

* Re: shorter form of frequently-seen lisp idiom?
       [not found] <mailman.680.1108839059.32256.help-gnu-emacs@gnu.org>
  2005-02-19 18:43 ` shorter form of frequently-seen lisp idiom? David Kastrup
@ 2005-02-22 14:44 ` Stefan Monnier
  2005-02-22 18:29   ` rgb
  1 sibling, 1 reply; 15+ messages in thread
From: Stefan Monnier @ 2005-02-22 14:44 UTC (permalink / raw)


> Is there a shorter way to concatenate a list of strings than this?

>  (eval (append (list 'concat) list-of-strings))

Rule of thumb: if your solution uses `eval' it's either buggy or clunky.

Other than the best solution using `apply', you may also want to use
`mapconcat', depending on the specific circumstance.


        Stefan

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

* Re: shorter form of frequently-seen lisp idiom?
  2005-02-22 14:44 ` Stefan Monnier
@ 2005-02-22 18:29   ` rgb
  2005-02-22 18:51     ` Thien-Thi Nguyen
  2005-02-22 21:20     ` Oliver Scholz
  0 siblings, 2 replies; 15+ messages in thread
From: rgb @ 2005-02-22 18:29 UTC (permalink / raw)


> Rule of thumb: if your solution uses `eval' it's either buggy or
clunky.

Interesting, I've never heard this.
My elisp isn't all that great yet so I looked for instances where
I use it.

(defun tacl-eldoc-function ()
  "Returns a documentation string for context near point or nil"
  (let ((word (thing-at-point 'symbol)))
    (if word
        (eval (intern-soft (upcase word) tacl-eldoc-obarray)))))

tacl-eldoc-obarray is populated like this.

(set (intern "FOO" tacl-eldoc-obarray) "FOO help text here")
(set (intern "BAR" tacl-eldoc-obarray) "BAR help text")
...

I thought this might be an exception to your rule because apply
doesn't apply.  But then it occured to me that symbol-value is
probably what I should have coded.

Is there a collection of more such tips someplace?

Thanks
Rick

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

* Re: shorter form of frequently-seen lisp idiom?
  2005-02-22 18:29   ` rgb
@ 2005-02-22 18:51     ` Thien-Thi Nguyen
  2005-02-23 16:29       ` rgb
  2005-02-22 21:20     ` Oliver Scholz
  1 sibling, 1 reply; 15+ messages in thread
From: Thien-Thi Nguyen @ 2005-02-22 18:51 UTC (permalink / raw)


"rgb" <rbielaws@i1.net> writes:

> [code]
> symbol-value is
> probably what I should have coded.

instead of obarray + set + eval,
why not use hash table + puthash + gethash?

thi

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

* Re: shorter form of frequently-seen lisp idiom?
  2005-02-22 18:29   ` rgb
  2005-02-22 18:51     ` Thien-Thi Nguyen
@ 2005-02-22 21:20     ` Oliver Scholz
  2005-02-22 22:16       ` Drew Adams
       [not found]       ` <mailman.1159.1109113137.32256.help-gnu-emacs@gnu.org>
  1 sibling, 2 replies; 15+ messages in thread
From: Oliver Scholz @ 2005-02-22 21:20 UTC (permalink / raw)


"rgb" <rbielaws@i1.net> writes:

>> Rule of thumb: if your solution uses `eval' it's either buggy or
> clunky.
>
> Interesting, I've never heard this.
> My elisp isn't all that great yet so I looked for instances where
> I use it.

I use `eval' only when not using it would be tantamount to
implementing a metacircular lisp interpreter.

>
> Is there a collection of more such tips someplace?

ISTR that some tips like that (i.e. using `funcall' or `apply' instead
of `eval') are in the (old?) FAQ for comp.lang.lisp. But it's rather
for common lisp.

    Oliver
-- 
4 Ventôse an 213 de la Révolution
Liberté, Egalité, Fraternité!

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

* RE: shorter form of frequently-seen lisp idiom?
  2005-02-22 21:20     ` Oliver Scholz
@ 2005-02-22 22:16       ` Drew Adams
       [not found]       ` <mailman.1159.1109113137.32256.help-gnu-emacs@gnu.org>
  1 sibling, 0 replies; 15+ messages in thread
From: Drew Adams @ 2005-02-22 22:16 UTC (permalink / raw)


    > Is there a collection of more such tips someplace?
    
    ISTR that some tips like that (i.e. using `funcall' or `apply' instead
    of `eval') are in the (old?) FAQ for comp.lang.lisp. But it's rather
    for common lisp.


You might find some info here:

1. EmacsWiki: http://www.emacswiki.org/cgi-bin/wiki/CategoryCode.
2. Emacs Lisp Manual (Info), node Tips.

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

* Re: shorter form of frequently-seen lisp idiom?
  2005-02-22 18:51     ` Thien-Thi Nguyen
@ 2005-02-23 16:29       ` rgb
  2005-02-23 18:03         ` Thien-Thi Nguyen
  0 siblings, 1 reply; 15+ messages in thread
From: rgb @ 2005-02-23 16:29 UTC (permalink / raw)



Thien-Thi Nguyen wrote:
> "rgb" <rbielaws@i1.net> writes:
>
> > [code]
> > symbol-value is
> > probably what I should have coded.
>
> instead of obarray + set + eval,
> why not use hash table + puthash + gethash?
>
Using obarray let me copy exactly what the lisp modes
were doing to get eldoc working.
I've never used the hash functions.  Being unfamiliar, I
didn't realize they might be useful to this situation.
Now that I look at them, I see what you mean.
Thanks for the suggestion.

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

* Re: shorter form of frequently-seen lisp idiom?
  2005-02-23 16:29       ` rgb
@ 2005-02-23 18:03         ` Thien-Thi Nguyen
  0 siblings, 0 replies; 15+ messages in thread
From: Thien-Thi Nguyen @ 2005-02-23 18:03 UTC (permalink / raw)


"rgb" <rbielaws@i1.net> writes:

> Using obarray let me copy exactly what the lisp modes
> were doing to get eldoc working.

it's probably a good idea to retain that congruence,
at least if you wish the code to be usable on old emacsen;
builtin hash tables aren't yet widely available.

i see that eldoc.el implements a hash table anyway.
perhaps it will be revised One of These Days...

thi

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

* Re: shorter form of frequently-seen lisp idiom?
       [not found]       ` <mailman.1159.1109113137.32256.help-gnu-emacs@gnu.org>
@ 2005-02-23 18:48         ` rgb
  0 siblings, 0 replies; 15+ messages in thread
From: rgb @ 2005-02-23 18:48 UTC (permalink / raw)



Drew Adams wrote:
> > Is there a collection of more such tips someplace?
>
> You might find some info here:
>
> 1. EmacsWiki: http://www.emacswiki.org/cgi-bin/wiki/CategoryCode.
> 2. Emacs Lisp Manual (Info), node Tips.

Duuuh.  RTFM.  I actually read that section a long time ago and
forgot it was there.  Probably because I didn't understand most
of it.  This time most of the tips made good sense.

Thanks for the reminder.

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

end of thread, other threads:[~2005-02-23 18:48 UTC | newest]

Thread overview: 15+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
     [not found] <mailman.680.1108839059.32256.help-gnu-emacs@gnu.org>
2005-02-19 18:43 ` shorter form of frequently-seen lisp idiom? David Kastrup
2005-02-19 23:31   ` August
     [not found]   ` <mailman.714.1108857188.32256.help-gnu-emacs@gnu.org>
2005-02-19 23:55     ` David Kastrup
2005-02-21  0:07       ` Denis Bueno
2005-02-21  0:17         ` Denis Bueno
     [not found]       ` <mailman.835.1108945397.32256.help-gnu-emacs@gnu.org>
2005-02-21  0:28         ` David Kastrup
2005-02-22 14:44 ` Stefan Monnier
2005-02-22 18:29   ` rgb
2005-02-22 18:51     ` Thien-Thi Nguyen
2005-02-23 16:29       ` rgb
2005-02-23 18:03         ` Thien-Thi Nguyen
2005-02-22 21:20     ` Oliver Scholz
2005-02-22 22:16       ` Drew Adams
     [not found]       ` <mailman.1159.1109113137.32256.help-gnu-emacs@gnu.org>
2005-02-23 18:48         ` rgb
2005-02-19 18:33 Joe Corneli

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).