How can I spot subtle Lisp syntax mistakes?
        Posted  
        
            by Marius Andersen
        on Stack Overflow
        
        See other posts from Stack Overflow
        
            or by Marius Andersen
        
        
        
        Published on 2009-05-22T14:53:56Z
        Indexed on 
            2010/04/30
            10:37 UTC
        
        
        Read the original article
        Hit count: 250
        
I'm a newbie playing around with Lisp (actually, Emacs Lisp). It's a lot of fun, except when I seem to run into the same syntax mistakes again and again.
For instance, here's something I've encountered several times. I have some cond form, like
(cond
 ((foo bar)
  (qux quux))
 ((or corge
      (grault warg))
  (fred)
  (t
   xyzzy)))
and the default clause, which returns xyzzy, is never carried out, because it's actually nested inside the previous clause:
(cond
 ((foo bar)
  (qux quux))
 ((or corge
      (grault warg))
  (fred))
 (t
  xyzzy))
It's difficult for me to see such errors when the difference in indentation is only one space. Does this get easier with time?
I also have problems when there's a large distance between the (mal-)indented line and the line it should be indented against. let forms with a lot of complex bindings, for example, or an unless form with a long conditional:
(defun test ()
  (unless (foo bar
               (qux quux)
               (or corge
                   (grault warg)
                   (fred))))
  xyzzy)
It turns out xyzzy was never inside the unless form at all:
(defun test ()
  (unless (foo bar
               (qux quux)
               (or corge
                   (grault warg)
                   (fred)))
    xyzzy))
I auto-indent habitually and use parenthesis highlighting to avoid counting parentheses. For the most part it works like a breeze, but occasionally, I discover my syntax mistakes only by debugging. What can I do?
© Stack Overflow or respective owner