From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: Lute Kamstra Newsgroups: gmane.emacs.devel Subject: Re: debug declaration. Date: Fri, 25 Mar 2005 12:06:05 +0100 Message-ID: <87wtrwf0iq.fsf@xs4all.nl> References: <87br9a8ijc.fsf@xs4all.nl> NNTP-Posting-Host: main.gmane.org Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-Trace: sea.gmane.org 1111750561 31287 80.91.229.2 (25 Mar 2005 11:36:01 GMT) X-Complaints-To: usenet@sea.gmane.org NNTP-Posting-Date: Fri, 25 Mar 2005 11:36:01 +0000 (UTC) Cc: emacs-devel@gnu.org Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Fri Mar 25 12:36:00 2005 Original-Received: from lists.gnu.org ([199.232.76.165]) by ciao.gmane.org with esmtp (Exim 4.43) id 1DEn6P-00031D-6J for ged-emacs-devel@m.gmane.org; Fri, 25 Mar 2005 12:35:45 +0100 Original-Received: from localhost ([127.0.0.1] helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1DEnLs-0003gG-EK for ged-emacs-devel@m.gmane.org; Fri, 25 Mar 2005 06:51:44 -0500 Original-Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1DEn6j-0006kd-S4 for emacs-devel@gnu.org; Fri, 25 Mar 2005 06:36:06 -0500 Original-Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1DEn6K-0006fx-VC for emacs-devel@gnu.org; Fri, 25 Mar 2005 06:36:03 -0500 Original-Received: from [199.232.76.173] (helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1DEmtF-0005hv-Tx for emacs-devel@gnu.org; Fri, 25 Mar 2005 06:22:12 -0500 Original-Received: from [194.109.24.28] (helo=smtp-vbr8.xs4all.nl) by monty-python.gnu.org with esmtp (Exim 4.34) id 1DEmdu-0003Ti-Iy for emacs-devel@gnu.org; Fri, 25 Mar 2005 06:06:18 -0500 Original-Received: from pijl (a80-127-67-124.adsl.xs4all.nl [80.127.67.124]) by smtp-vbr8.xs4all.nl (8.12.11/8.12.11) with ESMTP id j2PB6CDD057258; Fri, 25 Mar 2005 12:06:15 +0100 (CET) (envelope-from Lute.Kamstra@xs4all.nl) Original-Received: from lute by pijl with local (Exim 3.36 #1 (Debian)) id 1DEmdi-0007J1-00; Fri, 25 Mar 2005 12:06:06 +0100 Original-To: Stefan Monnier In-Reply-To: (Stefan Monnier's message of "Wed, 23 Mar 2005 13:18:32 -0500") User-Agent: Gnus/5.11 (Gnus v5.11) Emacs/22.0.50 (gnu/linux) Original-Lines: 66 X-Virus-Scanned: by XS4ALL Virus Scanner X-BeenThere: emacs-devel@gnu.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "Emacs development discussions." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Original-Sender: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Errors-To: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org X-MailScanner-To: ged-emacs-devel@m.gmane.org Xref: news.gmane.org gmane.emacs.devel:35143 X-Report-Spam: http://spam.gmane.org/gmane.emacs.devel:35143 Stefan Monnier 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")) nil (list "\\.mm\\'") nil "This is My mode.") Now I get an error: Debugger entered--Lisp error: (wrong-type-argument consp nil) edebug-before(8) (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 mode.") 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 mode.")) eval-defun((4)) call-interactively(eval-defun) > 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, Lute.