
Practical Emacs Lisp - brudgers
http://ergoemacs.org/emacs/elisp.html
======
dfan
Inexperienced Emacs Lisp programmers coming to this site for the first time
should be aware that Xah Lee's code is generally not very idiomatic. He
discusses it himself here:
[http://ergoemacs.org/misc/emacs_lisp_coding_style_language_i...](http://ergoemacs.org/misc/emacs_lisp_coding_style_language_idioms_controversy.html)

~~~
kazinator
I'm an experienced Lisp programmer and most of it looks fine to me from a
random sampling, as far as formatting goes.

Sometimes a closing parenthesis is on a line by itself:

    
    
       (defun foo ()
          ...
       )
    
       (let ((x y)
             (z w)
            )
          ...)
    

Historically, it's not been unheard of that Lisp experts (even implementors)
do this sort of thing. Exhibit A, randomly picked source file inside CLISP:

[http://sourceforge.net/p/clisp/clisp/ci/default/tree/src/clo...](http://sourceforge.net/p/clisp/clisp/ci/default/tree/src/clos-
class0.lisp)

Some of Xah's indentation is inconsistent:

    
    
       (function
        (one space)
        indent like data)
    
       (function
         (two space indent)
         like code))
    

Not too much stands out otherwise; the code is readable.

I'd have to read deeper to see whether things that are usually done one way
are done differently for no good reason. What I would consider "unidiomatic"
would be, for instance:

    
    
      (if (not (null list)) ...)
    

rather than

    
    
      (if list ...)
    

(Any Lisp dialect _requiring_ code such the former is labelled differently,
namely "idiotic".)

~~~
PuercoPop
I perused a couple of links. This code [0] is pretty much unidiomatic. Closing
parens one per line and using setq all over the place.

[0]:
[http://ergoemacs.org/emacs/elisp_grep_string_inside_tag.html](http://ergoemacs.org/emacs/elisp_grep_string_inside_tag.html)

~~~
xahlee
hi PuercoPop, that code is meant to be run as a script (emacs --script
filename), so i used setq is possibly more proper. But, this is just post-fact
defense, as lots my pages began as quick blogs. As you know, CL has
controversial status in gnu emacs dev community. e.g.
[http://ergoemacs.org/emacs/elisp_common_lisp_in_emacs.html](http://ergoemacs.org/emacs/elisp_common_lisp_in_emacs.html)
I myself avoid it, because i don't like CL. I'm going to tuck in the hanging
parens in a few days. Thank you for the criticism. (thanks to many others here
too)

~~~
kazinator
But stuff like

    
    
       (let (var1 (var2 0))
         (when condition
           (setq var1 (var1-initializer-form))
            ...)))
    

is just silly. Only the inner scope of the when uses var1, or any of the vars;
it could just be:

    
    
       (when condition
         (let ((var1 (var1-initializer-form))
               (var2 0))
            ...))
    

Never do two-step initialization of a variable without an excellent reason;
it's just sloppy otherwise.

------
catern
I much prefer "An Introduction to Programming in Emacs Lisp", which is
available both from inside emacs in M-x info, and on the web at
[https://www.gnu.org/software/emacs/manual/eintr.html](https://www.gnu.org/software/emacs/manual/eintr.html)

------
numbnuts
OP's link covers more topics but I prefer Steve Yegge's emergency elisp for
quick and dirty things.

[http://steve-yegge.blogspot.com/2008/01/emergency-elisp.html](http://steve-
yegge.blogspot.com/2008/01/emergency-elisp.html)

------
Supraperplex
"Each page is self contained." Allright, I guess it's an Emacs site then.

~~~
brudgers
T'wer we speaking of Python not Emacs, the "one true way" idiom would be
deemed virtuous.

------
lispm
Xah Lee can't program a line of Lisp on his own. Most of that code is
collected from elsewhere.

There are much better resources to learn Emacs Lisp from.

~~~
xahlee
what a malicious lie. I have written some 10 packages, at least hundred
thousand lines of emacs lisp since 2005, all public in github or on my
website.
[http://ergoemacs.org/emacs/xah_emacs_modes.html](http://ergoemacs.org/emacs/xah_emacs_modes.html)

the only borrowed code i can think of now, now named xah-extend-selection in
xah-fly-keys, by Nikolaj Schumacher, fully credited in the inline doc still.
(and that function is also in ergoemacs-mode, fully credited still, now lead
by Matt F.)

Any code, that possibly may be considered borrowed, i'm painstaking to give
credit, often taking sometimes a hour to find the person's REAL NAME correctly
(as opposed to nicknames) (if public), personal site url or blog url or social
network url if any, to link to, painstakingly ask the which url he prefers,
and often ask permission too when it is clearly not necessary. One can find
lots of “i learned this from xyz” in my website.

I learned emacs lisp, starting in 2005, the first 5 years with much help from
comp.emacs or gnu.emacs.help newsgroup, and freenode's irc emacs channel, and
emacs wiki. This is also fully credited. Xah's Emacs Tutorial: Acknowledgment
[http://ergoemacs.org/emacs/thanks.html](http://ergoemacs.org/emacs/thanks.html)
linked at the bottom of my emacs tutorial.

I know lisp before. Read entire Scheme r4rs and 75% of SICP in 1998, 1999.
These can be verified in newsgroup. I coded Wolfram Language for 6 years
before 1999, and worked at Wolfram Research for half a year. I have several
eassys documentinging these facts. For example: Xah Lee's Computing Experience
(Impression Of Lisp from Mathematica)
[http://xahlee.org/PageTwo_dir/Personal_dir/xah_comp_exp.html](http://xahlee.org/PageTwo_dir/Personal_dir/xah_comp_exp.html)

personally, i generally don't borrow code, because i'm rather one of those
weird or aloof guy with meticulous control of things, down to every character
placement. In my elisp life since 2005 to today, i must have stolen ideas,
concepts. I can't recall explicitly which at the moment, but i can say in good
faith that any non-trivial concepts i've used in my project i've given
acknowledgement.

Note: i've been considered a troll in comp.lang.lisp and other newsgroups from
about 2000 to 2010. There were many heated arguments, and there are some who
will say negative things about me wherever my name is mentioned. I do not
think of myself as a troll, and have written many essays on this. Netiquette
Anthropology: a Tale of Tech Geekers
[http://xahlee.info/Netiquette_dir/troll.html](http://xahlee.info/Netiquette_dir/troll.html)

PS unrelated but instead of a separate post: I want to thank many people who
have helped a year ago. That was a big help. Thank you. I do dish-washing
part-time, and am ok.

~~~
brudgers
I am truly glad to hear that things have improved in the past year. Your site
clearly demonstrates your integrity and good will. My deep thanks for your
many contributions that make the internet better.

