While other languages of the kind are often based on the notion of regular expressions (like Perl and awk), Tensile is based on a much more powerful concept of push-down transducers (PDT). In brief, it is an abstract device having a stack-based memory which can accept input signals and react to the by changing its internal state and/or producing output signals. BTW, from the formal point of view, regular expressions are just a particular case of PDTs. On the other hand, using PDTs is much less obvious than regular expressions and may require some experience. PDTs are described in more details in sla(1)
Another distinct feature of Tensile is that it operates not on plain text files, but on streams which from the application's point of view have HTML/XML-like structure (i. e. text interlaced with tags with attributes), while their external layout may be at all different. Internally Tensile supports only plain-text and HTML/XML streams (and `application/x-www-form-urlencoded' for CGI applications), but other types may be defined by the user. Note, that the type of a stream determines only its logical structure and the way of accessing stream data is determined by the type of a flow related to the stream. Flows are distinguished in an URL fashion: file:// means ordinary file (this is default if no type is given], pipe:// means piping to/from an external application and inline:// means reading from the rest of the argument or writing to a variable whose name is the rest of the argument.
Tensile has no data types – all data are represented by strings. However, structured data types are modelled by storages – abstract key/value pair sets. Their physical representation may vary greatly, but the access is made uniformly. Predefined storages include arrays, ordered tables, property lists and sequences. SQL support is implemented via storages too, but this will soon be moved to a separate module. User may define its own stream types as well.
The last but not the least major feature of Tensile is that pluggable modules may be attached to it. They may provide wrappers to any library functions.
This reference describes Tensile v0.9.