From: "Ludwig, Mark" <ludwig.mark@siemens.com>
To: "Pascal J. Bourguignon" <pjb@informatimago.com>,
"help-gnu-emacs@gnu.org" <help-gnu-emacs@gnu.org>
Subject: RE: Compilation warnings of ELisp seem wrong and misleading
Date: Mon, 30 Mar 2015 15:40:21 +0000 [thread overview]
Message-ID: <BC5672F8AD4C054BAF167C9801500D1A0101AAF4E1@USSLMMBX003.net.plm.eds.com> (raw)
In-Reply-To: <87619iy2g9.fsf@kuiper.lan.informatimago.com>
"Pascal J. Bourguignon" wrote:
> "Ludwig, Mark" <ludwig.mark@siemens.com> writes:
>
> > Greetings,
> >
> > I've been using an ancient Emacs (19.29) on Solaris and finally
> > got around to installing a current one (24.4).
> >
> > I find my custom Elisp generates warnings that seem pretty stupid.
> > For example:
> >
> > emacs.el:255:10:Warning: reference to free variable `if'
> > emacs.el:219:8:Warning: reference to free variable `save-excursion'
> > emacs.el:331:41:Warning: reference to free variable `forward-char'
> > emacs.el:261:17:Warning: reference to free variable `insert'
> > emacs.el:261:17:Warning: reference to free variable `forward-sexp'
> >
> > Those are all valid functions. For example, here are lines 255-258:
> >
> > (if (not (= ans ?q))
> > (progn
> > (goto-char found-start)
> > (delete-region found-start found-end)))
> >
> > This is inside a large-ish "let*" form (111 lines).
> We cannot see either, because the meaning of a sexp is determined by its
> surrounding form, which you didn't provide.
>
> You probably have a parenthesis problem in your let* form which makes
> lisp interpret some parts as being variable names instead of operators.
No, I know how to balance parentheses. I've been
programming Emacs Lisp for almost 30 years. I rely on Emacs
for its outstanding job of showing structural problems
through its automatic indentation (in all programming
languages, but certainly within its own). By all means, if
there's anything wrong with that (if ...) form, please
explain.
For context, the "let*" is on line 239; the warning
(mentioned above as being on line 255 column 10) is
referring to the form after the comment "Make the
substitution." If you read the warnings carefully, you'll
note that it warns about two different things on line 261,
column 17. That line is the one with the comment, 'Now it's
"strlcpy" or whatever.' Clearly, the byte-compiler is
pretty confused....
(let* ((c1 (string-to-char to1))
(c2 (string-to-char to2))
(ans 0))
;; Get one of the first characters from the two substitutions
(while (and (not (= ans c1))
(not (= ans c2))
(not (= ans ?q))) ; Quit, don't substitute anything
(setq ans (read-char-exclusive
(concat "Replace " from " with "
to1 " (will truncate silently) or "
to2 " (dstat)? (" (char-to-string c1) "/" (char-to-string c2) "/q) "))))
;; Make the substitution
(if (not (= ans ?q))
(progn
(goto-char found-start)
(delete-region found-start found-end)))
(cond ((= ans c1)
(insert to1) ; Now it's "strlcpy" or whatever
)
((= ans c2)
(insert "dstat = " to2) ; Now it's "dstat = nlsStrLCpy" or whatever
(back-to-indentation)
(setq ans 0)
(while (and (not (= ans ?d))
(not (= ans ?e))
(not (= ans ?n)))
(setq ans (read-char-exclusive "Use DSOK/EXIT/no form? ")))
(let ((if-pos (point)))
(cond ((= ans ?d)
(insert "if (DSOK) ")
(forward-sexp 3) ; After the closing parenthesis for the function call
)
((= ans ?e)
(insert "if (")
(forward-sexp 3) ; After the closing parenthesis for the function call
(insert ")")
(newline-and-indent)
(insert "goto EXIT") ; The semi-colon should end up after "EXIT"
(c-indent-command) ; Make the "goto" be correctly indented under the "if"
)
((= ans ?n)
;; no form
)
)
;; Try to look ahead, in case the function call we just
;; modified was a one-statement "block" in an "if," so
;; we've just unintentionally modified the meaning of
;; that "if" statement
(if (not (= ans ?n))
(condition-case nil
(progn
(forward-sexp 1) ; Skip over "else" if it's there
(forward-sexp -1) ; Back in front of "else" if it's there
(if (looking-at "else")
(progn
(goto-char if-pos) ; Go back to where we inserted "if"
(cond ((= ans ?d)
;; Skip over: "if" "(DSOK)" "dstat" "= ..." "()"
(forward-sexp 5)
)
((= ans ?e)
;; Skip over:
;; "if" "(dstat = ...)" "goto" "EXIT"
(forward-sexp 4)
)
(if (not (looking-at ";"))
(error "First expected ';' not: \"%s\"" (buffer-substring (point)
(progn (end-of-line 1)
(point)))))
(save-excursion
(goto-char if-pos) ; Go back to where we inserted "if"
(insert "{
"))
(if (not (looking-at ";"))
(error "Second expected ';' not: \"%s\"" (buffer-substring (point)
(progn (end-of-line 1)
(point)))))
(forward-char 1)
;; We should be looking at the end of line
(if (not (looking-at "\\s-*$"))
(error "Second expected end of line, not: \"%s\"" (buffer-substring (point)
(progn (end-of-line 1)
(point)))))
(insert "
}")
(forward-sexp -1)
(c-indent-exp)
))))
(error nil) ;hand-rolled (ignore-errors ...)
)
)
)
)
)
)
>
> --
> __Pascal Bourguignon__ http://www.informatimago.com/
> “The factory of the future will have only two employees, a man and a
> dog. The man will be there to feed the dog. The dog will be there to
> keep the man from touching the equipment.” -- Carl Bass CEO Autodesk
next prev parent reply other threads:[~2015-03-30 15:40 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <mailman.3018.1427724507.31049.help-gnu-emacs@gnu.org>
2015-03-30 14:39 ` Compilation warnings of ELisp seem wrong and misleading Pascal J. Bourguignon
2015-03-30 15:40 ` Ludwig, Mark [this message]
2015-03-30 16:59 ` tomas
2015-03-30 19:09 ` Ludwig, Mark
[not found] ` <mailman.3032.1427730039.31049.help-gnu-emacs@gnu.org>
2015-03-30 17:08 ` Pascal J. Bourguignon
2015-03-31 0:53 ` Emanuel Berg
2015-04-01 11:45 ` Ludwig, Mark
2015-04-01 12:02 ` tomas
2015-04-02 10:20 ` Philipp Stephani
[not found] ` <mailman.3123.1427888711.31049.help-gnu-emacs@gnu.org>
2015-04-01 23:08 ` Emanuel Berg
2015-03-30 13:47 Ludwig, Mark
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: https://www.gnu.org/software/emacs/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=BC5672F8AD4C054BAF167C9801500D1A0101AAF4E1@USSLMMBX003.net.plm.eds.com \
--to=ludwig.mark@siemens.com \
--cc=help-gnu-emacs@gnu.org \
--cc=pjb@informatimago.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).