[Python-ideas] Transportable indent level markers. >>>===<<<

Nick Coghlan ncoghlan at gmail.com
Thu Dec 15 04:40:13 CET 2011

On Thu, Dec 15, 2011 at 1:19 PM, Ron Adam <ron3200 at gmail.com> wrote:
>> You'd probably also want an explicit ";;" token to force a
>> token.NEWLINE into the token stream.
> That isn't needed.  Any of these in the middle of a line will add a new
> line and back up, so the next call to tok_get() will find it, and so on.

OK, take the way you're thinking (indent +1, indent 0, indent -1) and
instead think in terms of starting a suite, terminating a statement
and terminating a suite:

/// -> {:
;;; -> ;;
\\\ -> :}

Now do you see why I'm saying you're needlessly complicating things?
Suite delimiters and statement terminators (or separators) are the way
full whitespace insensitivity is normally handled when designing a
language syntax. There's no reason to get creative here when the
standard terminology and conventions would work just fine.

For example, it shouldn't be difficult to create a variant of the
tokenize module's tokeniser that adds the following rules:

{: -> emits OP(':'), NEWLINE, INDENT and increments the parenlevel
;; -> emits NEWLINE
:} -> emits NEWLINE, DEDENT and decrements the parenlevel

and a variant of the untokenizer() that looks ahead and *emits* those
character sequences when applicable.

That should be enough to let you use Python code in whitespace
insensitive environments without changing the semantics:

Encoding for transport: tokenize() normally, untokenize() with suite delimiters
Decoding from transport: tokenize() with suite delimiter support,
untokenize() normally


Nick Coghlan   |   ncoghlan at gmail.com   |   Brisbane, Australia

More information about the Python-ideas mailing list