## Version 4 of identity function

Updated 2014-05-29 04:55:28 by AMG

The identity function accepts one value and simply returns that value .

## Reference

Identity function , Wikipedia

## Description

PYK: The identity function is trivial to implement in Tcl :

`proc identity val {return \$val}`

return -level 0 \$x is the canonical built-in identity function . It simply sets the interpreter result to \$x , and returns to the current level , allowing Tcl to continue processing the script at the current level . It's an unusual , but often quite useful, way to employ return .

AMG: Does return -level 0 \$x have any advantage over lindex \$x? Why do you say it is the canonical identity function?

PYK: Various built-in commands simply return their argument and can also be used as an identity function .

```set x {some\{value}

#the following all act as identity functions
return -level 0 \$x
lindex \$x
apply {x {set x}} \$x

#brace-quoted for safety
expr {\$x}
subst {\$x}

K \$x {}
K* \$x

# Works as identity functions, but only due to a bug
dict remove \$x
dict replace \$x```

AMG: Let's say you have to pass a script to eval, and the value eval returns is used somehow. What script do you pass if you want eval to simply return a constant, the result of a substitution, or a concatenated combination thereof? All of the above methods work, and return -level 0 avoids the need for extra quoting or proc wrappers. This all can be quite useful in functional contexts.

An example use from the if page:

`set y [if {\$x} {lindex a} else {lindex b}]`

Another approach, on the switch page, thanks to RS (2005-05-30):

```proc is x {set x}
set type [switch -- \$num {
1 - 9         {is odd}
2 - 3 - 5 - 7 {is prime}
0 - 4 - 6 - 8 {is even}
}]```

It's possible to delete the proc line and replace is with "lindex" or "return -level 0".