436.md at [805329c8d9]

Login

File tip/436.md artifact 793a737178 part of check-in 805329c8d9


# TIP 436: Improve TclOO isa Introspection
	State:		Final
	Type:		Project
	Tcl-Version:	8.6.5
	Vote:		Done
	Post-History:	
	Author:		Donal Fellows <[email protected]>
	Created:	30-Jun-2015
	Implementation-URL: https://core.tcl-lang.org/tcloo/info/5fa1374aa026d4c7
-----

# Abstract

The various **info object isa** introspectors should not produce errors when
given a non-object; the set membership tests should simply return boolean
false in those cases.

# Rationale

The **info object isa** command is intended to be used to allow asking
whether some object is a member of a general set of entities; for example,
**info object isa object** allows querying whether you actually have a
handle to an object at all. However, the other membership sets all throw an
error when given a non-object. This complicates the use of the API when all
that is really needed is to return a **false** value in those cases.

Motivating example \(with thanks to Will Duquette\): is the **proc** a class?
No. It's not even an object, so it clearly cannot be a class and so the
following command should produce false \(or 0\) and not an error:

	 info object isa class proc

# Proposed Change

Where one of the **info object isa** introspectors:

 * **info object isa** _class object_

 * **info object isa metaclass** _object_

 * **info object isa mixin** _object class_

 * **info object isa object** _object_

 * **info object isa typeof** _object class_

Would produce an error due to either the _object_ or \(where appropriate\) the
_class_ object not passing some critical precondition to the test, the
result of the command will be **0** \(i.e., boolean false\). Errors will be
still generated when the wrong number of arguments are supplied.

Note that this rule is already followed by **info object isa object**.

# Copyright

This document has been placed in the public domain.