tabexpand.scm: Tab Character Expansion in Scheme

tabexpand.scm: Tab Character Expansion in Scheme

Version 0.2, 2005-02-25, `'

by Neil W. Van Dyke <>

     Copyright (C) 2004 - 2005 Neil W. Van Dyke.  This program is Free
     Software; you can redistribute it and/or modify it under the terms
     of the GNU Lesser General Public License as published by the Free
     Software Foundation; either version 2.1 of the License, or (at
     your option) any later version.  This program is distributed in
     the hope that it will be useful, but without any warranty; without
     even the implied warranty of merchantability or fitness for a
     particular purpose.  See the GNU Lesser General Public License
     [LGPL] for details.  For other license options and commercial
     consulting, contact the author.


There is no denying that ASCII tab characters are an archaic abomination
[JWZ].  Savvy Emacs users might have noticed that the [Quack] option
variable `quack-tabs-are-evil-p' defaults to true.  Note also that
`quack-tidy' gladly slays any tab in sight, laughing maniacally as only
the truly righteous can.  Sadly, not all strings in the universe are
Scheme code subject to the wrath of Quack, therefore...

   This very simple Scheme library provides procedures for expanding tab
characters.  It was written early one Sunday morning to complement the
plethora of PLT-specific solutions being offered to the problem on the
nascent Schematics cookbook Wiki.  Its source code is a bit verbose,
but it tries not to generate much garbage, it supports non-zero
starting columns, and it should work with any R5RS Scheme
implementation that supports [SRFI-6].  (A future edition of this
continuing epic might remove the dependency on SRFI-6, should we bother
to benchmark and find that some implementations are not as efficient as
we'd like.)

   At time of this writing, the author notes with no small amount of
interest that the Internet domain name `' has not yet been


Three procedures are provided.  Most applications will use the simple

> (tabexpand/stop/col str stop col)
> (tabexpand/stop str stop)
> (tabexpand str)
     Yields a new string that is equivalent to string STR except that
     any ASCII tab characters have been expanded to space characters.
     STOP, a positive integer defaulting to `8', is used as the tabstop.
     COL, a nonnegative integer defaulting to `0', is the context
     starting column for the beginning of the string, with respect to
     which tabs positions should be calculated.  All characters other
     than tab are treated as if they were normal printable characters
     with no special effect on the column.


The `tabexpand.scm' test suite can be enabled by editing the source
code file and loading [Testeez]; the test suite is disabled by default.


Version 0.2 -- 2005-02-24
     Added Testeez test cases.  Packaged for PLaneT.

Version 0.1 -- 2004-05-09
     Wrote as a joke that also made a point about code patterns vs.


     Jamie Zawinski, "Tabs versus Spaces: An Eternal Holy War," 2000.
     Free Software Foundation, "GNU Lesser General Public License,"
     Version 2.1, 1999-02, 59 Temple Place, Suite 330, Boston, MA
     02111-1307 USA.


     William D. Clinger, "Basic String Ports," SRFI 6, 1999-07-01.

     Neil W. Van Dyke, "Testeez: Simple Test Mechanism for Scheme,"
     Version 0.1.