[Top][All Lists]

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: debug declaration.

From: Lute Kamstra
Subject: Re: debug declaration.
Date: Fri, 25 Mar 2005 12:06:05 +0100
User-agent: Gnus/5.11 (Gnus v5.11) Emacs/22.0.50 (gnu/linux)

Stefan Monnier <address@hidden> writes:

>> (declare (debug (sexp form form form form form &optional stringp)))
>> X(define-generic-mode my-mode
>>   (list ?# ?% (+ 50 9))
>>   (list "abba" "ebbe" (concat "ob" "bo"))
>>   nil
>>   X(list "\\.mm\\'")X
>>   nil
>>   "This is My mode.")X
> That's because when you execute the call to define-generic-mode, only the
> fourth argument is actually evaluated.  All the others will only be
> evaluated when the defined function is actually called.  I.e. it's normal.
> OTOH, with your definition you'll get bugs when you actually call my-mode
> because the instrumented code that's then executed is executed in an
> environment where edebugging is not expected.  To fix this problem, you need
> to use `def-form' instead of `form' for them.

It's dawning on me now...

> Try (debug (sexp def-form def-form def-form form def-form [&optional 
> stringp]))

This does indeed work.  (The brackets are not necessary, are they?)
The node "Specification List" in the lisp manual says that def-form
can only be used after &define, however.  And when I do that, things
seem to break.

I used:

  (declare (debug (&define sexp def-form def-form def-form form def-form 
&optional stringp)))

for define-generic-mode.  Then I did C-u C-M-x on this call:

  (define-generic-mode my-mode
    (list ?# ?% (+ 50 9))
    (list "abba" "ebbe" (concat "ob" "bo"))
    (list "\\.mm\\'")
    "This is My mode.")

Now I get an error:

Debugger entered--Lisp error: (wrong-type-argument consp nil)
  (edebug-after (edebug-before 8) 9 (list "\\.mm\\'"))
  (let ((--dolist-temp-- ...) re) (while --dolist-temp-- (setq re ...) (setq 
--dolist-temp-- ...) (add-to-list ... ...)))
  (dolist (re (edebug-after ... 9 ...)) (add-to-list (quote auto-mode-alist) 
(cons re ...)))
  (progn (add-to-list (quote generic-mode-list) "my-mode") (dolist (re ...) 
(add-to-list ... ...)) (defun my-mode nil "This is My mode." (interactive) 
(generic-mode-internal ... ... ... ... ...)))
  (define-generic-mode my-mode (edebug-enter (quote my-mode) nil (function 
...)) (edebug-enter (quote my-mode) nil (function ...)) (edebug-enter (quote 
my-mode) nil (function ...)) (edebug-after (edebug-before 8) 9 (list 
"\\.mm\\'")) (edebug-enter (quote my-mode) nil (function ...)) "This is My 
  eval((define-generic-mode my-mode (edebug-enter (quote my-mode) nil (function 
...)) (edebug-enter (quote my-mode) nil (function ...)) (edebug-enter (quote 
my-mode) nil (function ...)) (edebug-after (edebug-before 8) 9 (list 
"\\.mm\\'")) (edebug-enter (quote my-mode) nil (function ...)) "This is My 

> Another option is to evaluate those arguments before you plug them in the
> body of your major mode function, so they're only evaluated once, when
> the major mode is defined, thus reproducing the "pre-macro" behavior.

Considering backward compatibility, that's probably the right thing to do.

Thanks for the help,


reply via email to

[Prev in Thread] Current Thread [Next in Thread]