[R] code to turn T into TRUE

Martin Maechler maechler at stat.math.ethz.ch
Fri Oct 18 08:58:59 CEST 2002

>>>>> "Mark" == Mark Bravington <Mark.Bravington at csiro.au>
>>>>>     on Fri, 18 Oct 2002 14:58:04 +1100 writes:

    Mark> Does anyone have code that will methodically process R
    Mark> sourcecode, turning T's into TRUE and F's into FALSE?
    Mark> I got bored doing this by hand, after the first 30-odd
    Mark> functions-- there are hundreds left to do. I don't
    Mark> want to simply deparse everything, because that would
    Mark> destroy my beautiful formatting.

Same boat ("beautiful formatting") here.

Yes, ESS has had code for several year to do this 
{CC to ESS-help, since people there might be interested additionally} :

  M-x R-fix-T-F            (guess who wrote it)

which does it very quickly for one file.
Note that the emacs-lisp code we put in ESS is somewhat smart;
we only replace T/F when *not* inside a string or comment.

If anybody has time & knowledge to translate the Emacs-Lisp code to perl
or python or... we could provide it (from CRAN or so) :

(defun R-fix-T-F (&optional from quietly)
  "Fix T/F into TRUE and FALSE --- CAUTIOUSLY"
  (interactive "d\nP"); point and prefix (C-u)
    (goto-char from)
    (ess-rep-regexp "\\(\\([][=,()]\\|<-\\|_\\) *\\)T\\>" "\\1TRUE"
		    'fixcase nil (not quietly))
    (goto-char from)
    (ess-rep-regexp "\\(\\([][=,()]\\|<-\\|_\\\) *\\)F\\>" "\\1FALSE"
		    'fixcase nil (not quietly))))

(defun ess-rep-regexp (regexp to-string &optional fixedcase literal verbose)
  "Instead of (replace-regexp..) -- do NOT replace in strings or comments.
 If FIXEDCASE is non-nil, do *not* alter case of replacement text.
 If LITERAL   is non-nil, do *not* treat `\\' as special.
 If VERBOSE   is non-nil, (message ..) about replacements."
  (let ((case-fold-search (and case-fold-search
			       (not fixedcase))); t  <==> ignore case in search
	(pl) (p))
    (while (setq p (re-search-forward regexp nil t))
      (cond ((not (inside-string/comment-p (1- p)))
	     (if verbose
		 (let ((beg (match-beginning 0)))
		   (message "(beg,p)= (%d,%d) = %s"
			    beg p (buffer-substring beg p) )))
	     (replace-match to-string fixedcase literal)
	     ;;or (if verbose (setq pl (append pl (list p))))
    ;;or (if (and verbose pl)
    ;;or  (message "s/%s/%s/ at %s" regexp to-string pl))
    ) )

(defun inside-string/comment-p (pos)
  "Return non-nil if POSition [defaults to (point) is inside string or comment
 (according to syntax). NOT OKAY for multi-line comments!!"
  ;;FIXME (defun S-calculate-indent ..) in ./essl-s.el can do that ...
  (interactive "d");point by default
  (let ((pps (save-excursion
		(save-excursion (beginning-of-line) (point))
    (or (nth 3 pps) (nth 4 pps)))); 3: string,  4: comment


Martin Maechler <maechler at stat.math.ethz.ch>	http://stat.ethz.ch/~maechler/
Seminar fuer Statistik, ETH-Zentrum  LEO C16	Leonhardstr. 27
ETH (Federal Inst. Technology)	8092 Zurich	SWITZERLAND
phone: x-41-1-632-3408		fax: ...-1228			<><
ess-help mailing list -- To (un)subscribe, send
subscribe	or	unsubscribe
(in the "body", not the subject !)  To: ess-help-request at stat.math.ethz.ch

More information about the ESS-help mailing list