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: 193

Filed under:
|
|
|
|

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

Related posts about lisp

Related posts about syntax