From: "Jose E. Marchesi" <jemarch@es.gnu.org>
Subject: eval to texinfo
Date: Mon, 8 Mar 2004 12:43:57 +0100 [thread overview]
Message-ID: <16460.23677.301949.198404@gnues.es.gnu.org> (raw)
Hi.
I wrote the following function for the writing of a book about emacs.
It dump a @lisp texinfo environment that describes the action.
It manages error conditions also.
(defun eval-to-texi (form &optional tostring)
"Evaluates FORM, dumping a @lisp texinfo environment that
describes action.
If TOSTRING is t, then the @lisp environment is returned into a string,
rather than being inserted into the buffer."
(interactive "sForm to evaluate: ")
(let (environment-text)
(setq environment-text
(with-temp-buffer
(condition-case error-description
(let (expression result output)
;; Begin of the sample
(insert "@lisp\n")
;; Dump the form itself into the sample
(let ((tform form))
(setq tform (replace-regexp-in-string "@" "@@" tform))
(setq tform (replace-regexp-in-string "{" "@{" tform))
(setq tform (replace-regexp-in-string "}" "@}" tform))
(insert tform "\n"))
;; Parse the form to a valid expression
(setq expression (read form))
;; Get the result of the eval, and the output if there is one
(setq output
(with-output-to-string
(setq result (prin1-to-string (eval expression)))))
;; If there is any output, dump a @print{} entry into the sample
(if (not (equal output ""))
(progn
;; Escape texinfo special characters on the output
(setq output (replace-regexp-in-string "@" "@@" output))
(setq output (replace-regexp-in-string "{" "@{" output))
(setq output (replace-regexp-in-string "}" "@}" output))
;; Indent multilines
(setq output (replace-regexp-in-string "\n" "\n " output))
(insert " @print{} " output "\n")))
;; If the expression is a macro, dump an @expansion{}
(let ((macroexp (macroexpand expression)))
(if (not (equal macroexp expression)) ; macro-p???
(let ((met (prin1-to-string macroexp)))
;; Escape texinfo special characters on the macro expansion text
(setq met (replace-regexp-in-string "@" "@@" met))
(setq met (replace-regexp-in-string "{" "@{" met))
(setq met (replace-regexp-in-string "}" "@}" met))
;; Indent multilines
(setq met (replace-regexp-in-string "\n" "\n " met))
(insert " @expansion{} " met "\n"))))
;; Escape texinfo special characters on the result
(setq result (replace-regexp-in-string "@" "@@" result))
(setq result (replace-regexp-in-string "{" "@{" result))
(setq result (replace-regexp-in-string "}" "@}" result))
;; Indent multilines
(setq result (replace-regexp-in-string "\n" "\n " result))
;; Dump the @result{} entry into the sample
(insert " @result{} " result "\n"))
;; Was an error => Dump an @error{} entry into the sample with the error
;; description from the interpreter
(error (insert " @error{} " (error-message-string error-description) "\n")))
;; End of the sample
(insert "@end lisp")
;; Return buffer's contents
(buffer-substring (point-min) (point-max))))
(if (not tostring)
(insert environment-text)
environment-text)))
reply other threads:[~2004-03-08 11:43 UTC|newest]
Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
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
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=16460.23677.301949.198404@gnues.es.gnu.org \
--to=jemarch@es.gnu.org \
/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.
Code repositories for project(s) associated with this external index
https://git.savannah.gnu.org/cgit/emacs.git
https://git.savannah.gnu.org/cgit/emacs/org-mode.git
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.