all messages for Emacs-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
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.