TIP 105: Add Prefix Matching for Switch

Bounty program for improvements to Tcl and certain Tcl packages.
Tcl 2017 Conference, Houston/TX, US, Oct 16-20
Send your abstracts to tclconference@googlegroups.com
by Aug 21.
State:		Withdrawn
Type:		Project
Tcl-Version:	8.5
Vote:		Pending
Author:		Donal K. Fellows <fellowsd@cs.man.ac.uk>
Created:	03-Jul-2002
Obsoleted-By:	195


This TIP adds a new option to the [switch] command to support matching of strings to unique prefixes of patterns, similar to Tcl's existing subcommand-name matching or Tk's option-name matching.


When code (particularly in script libraries) wants to support shortest unique prefix matching in the manner of the Tcl core (as provided by Tcl_GetIndexFromObj) currently either the prefixes have to be precomputed (by hand or by script) or the matching has to be done backwards. In the first case, this is either error-prone or requires an extra piece of code that has to be developed by the programmer. In the second case, the code has to be converted into a pattern which is matched against the list of supported options in some way, which is either inefficient or has hazards if the string being matched contains characters that are meaningful to the matching engine being used. Instead, it would be far nicer if we could make the core support this directly, so that script authors could just say what they mean.

Proposed Change

To support this, I propose modifying the switch command to take an extra option -prefix (which should be mutually exclusive with -exact, -glob and -regexp of course) to enable prefix matching. When prefix matching is enabled, the arm chosen for execution will be the one such that the switch value is identical to or an unambiguous prefix of its pattern (i.e. it will not be a prefix of any other pattern listed, unless the pattern of the arm chosen is exactly equal to the switch value.) If there is no arm whose pattern is an unambiguous prefix of the switch value, the default arm will be selected for execution, or if there is no default arm, the switch command will terminate without an error and with an empty result (this is in contrast to the behaviour of Tcl_GetIndexFromObj.)


The command:

switch -prefix f {
   foo {
      puts "matched foo"
   bar {
      puts "matched bar"

prints "matched foo". The command:

switch -prefix b {
   bar {
      puts "matched bar"
   boo {
      puts "matched boo"
   default {
      puts "the default action"

prints "the default action" ("b" is a prefix of two patterns.) The command:

switch -prefix tcl {
   tcl {
      puts "The Tool Command Language"
   tk {
      puts "The Tk Toolkit"
   tcl/tk {
      puts "A cool combination"

prints "The Tool Command Language" (although "tcl" is a prefix of two patterns, it matches one of them exactly.)


This document has been placed in the public domain.