[plt-scheme] Improvement in paren-checker algorithm

From: Jim Witte (jswitte at bloomington.in.us)
Date: Thu Nov 6 17:22:32 EST 2003


   This may have already been addressed in the "syntax coloring and 
checker" thread that I haven't had time to read through, but I thought 
I'd mention it.  This is a (much condensed) piece of code that I'm 
working on  (it's not Scheme, it's ParentheC...)

(define-function (apply_th thnk)
                  (dbg "Apply-th")
                  (union-case thnk th
                              [(apply_literal k lit)  ;; **** line 1
                               (apply_k k lit)]         ;; **** line 2

                              [(apply_proc body arg env k)
                               (th_eval_exp body
                                            (envtype_extend arg env) k)]

                              [(eval_exp expr env k)
                               (dbg "Eval-exp-th")
                               (union-case expr exp
                                          ;; process throw
                                           [(throw varexp body) (apply_k 
k 0)
                                            ;; **
                                            ;; **
                                            ])]))    ;; **** line 3

Now, I had forgotten a close-parent on line (1).  This cause the 
close-bracket on line (2) to not match.  This causes a cascade, where 
*none* of the paren-pairs beyond there will match, all the way down to 
line (3) - which in the actual code is several screenfuls.  It didn't 
take me long to track down the missing paren by looking at what the 
largest bit that would match was, and where it broke down.  But it did 
leave me wondering a bit whether there was a bug in the algorithm, or 
strange characters getting in the file, or parens that weren't seen for 
some reason..  Not good thoughts to have.

   C is notorious for cascading errors (one missing semicolon on line 56 
and you get 1269 errors.  Add it back in, and you go down to *3* 
errors.  That's happened to me..)  Seeing as how DrScheme is a teaching 
environment (and the joke on LISP is that it's for "Lots of Insidious 
Silly Parentheses", the checker algorithm should be able to do the kind 
of "largest correct block" analysis that I did (starting from the 
beginning of the define-function block), to spot the root cause of the 

PS. I'm reminded again why I don't like Chez..  I'm currently writing 
this in DrScheme because I like the interface and paren checker better 
than SWL (which doesn't work under Panther anyway), and then I have to 
test it under Petite Chez on the MacOSX command-line because ParentheC 
doesn't work under DrScheme (yet, we're working on it)..  It just 
reminds me too much of the old edit-compile-run cycle.  That and the 
fact that command-line Chez has an almost non-existent debugger - won't 
even tell you which *line* an unbound variable is on..  Now I know why 
Friedman says he doesn't use the debugger - because *you can't*!!

Posted on the users mailing list.