TIP 201: Add 'in' Operator to [expr]

Login
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.
Author:         Jeff Hobbs <jeffh@activestate.com>
State:          Final
Type:           Project
Vote:           Done
Created:        21-May-2004
Post-History:   
Keywords:       Tk,list membership,sets
Tcl-Version:    8.5

Abstract

This TIP proposes new expr operators "in" and "ni" that simplifies the standard "does this item exist in list" lsearch case in expressions, with "ni" being "not in".

Rationale

The addition of in and ni operators is syntactic sugar for the verbose lsearch operation that checks for a single items existence (or non-existence) in a list. It serves to simplify the reading and writing of code that requires this comparatively-common operation. The operators will do lsearch -exact searching as well, which would correct an inadvertant bug that many users introduce into their code when they write:

 if {[lsearch $list $item] != -1} { ... }

as lsearch does -glob matching by default. I have found this error repeated often in user code.

Note that [133] uses an in operator as a motivating case, but is actually proposing a much more general alteration.

Specification

A new infix expr operators in and ni will be added, making the following pairs of commands equivalent (assuming nobody has redefined lsearch of course):

Comments

There was a proposal to add a separate operator "!in" to do negated membership testing, but that significantly complicates the expression parser and is likely to be harder to teach to newcomers to Tcl, since it looks like the application of an operator to another operator.

notin and ni were also suggested, and ni was accepted as a reasonable pair for "not in", similar to ne being "not equal". There was some concern about ni in that TeX has a different interpretation, but that is unlikely to confuse the majority of Tcl users.

Reference Implementation

[To Follow]

Copyright

This document has been placed in the public domain.

History