diff options
author | dkf <donal.k.fellows@manchester.ac.uk> | 2003-04-05 01:03:17 (GMT) |
---|---|---|
committer | dkf <donal.k.fellows@manchester.ac.uk> | 2003-04-05 01:03:17 (GMT) |
commit | 677e85edc90d09942a06fc0f7ee0885669caa5e0 (patch) | |
tree | 70bc631e14f429e3b51bb74b0255039b2c2966c7 /doc | |
parent | 44a33beffe1974f4d12cf92f2938a03e42b6b091 (diff) | |
download | tcl-677e85edc90d09942a06fc0f7ee0885669caa5e0.zip tcl-677e85edc90d09942a06fc0f7ee0885669caa5e0.tar.gz tcl-677e85edc90d09942a06fc0f7ee0885669caa5e0.tar.bz2 |
The bulk of the TIP#111 implementation. Still need to finish plumbing this
into the rest of the core, but that won't take long...
Diffstat (limited to 'doc')
-rw-r--r-- | doc/DictObj.3 | 184 | ||||
-rw-r--r-- | doc/dict.n | 183 |
2 files changed, 367 insertions, 0 deletions
diff --git a/doc/DictObj.3 b/doc/DictObj.3 new file mode 100644 index 0000000..24f41dd --- /dev/null +++ b/doc/DictObj.3 @@ -0,0 +1,184 @@ +'\" +'\" Copyright (c) 2003 Donal K. Fellows +'\" +'\" See the file "license.terms" for information on usage and redistribution +'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. +'\" +'\" RCS: @(#) $Id: DictObj.3,v 1.1 2003/04/05 01:03:20 dkf Exp $ +'\" +.so man.macros +.TH Tcl_DictObj 3 8.5 Tcl "Tcl Library Procedures" +.BS +'\" Note: do not modify the .SH NAME line immediately below! +.SH NAME +Tcl_NewDictObj, Tcl_DictObjPut, Tcl_DictObjGet, Tcl_DictObjRemove, Tcl_DictObjSize, Tcl_DictObjFirst, Tcl_DictObjNext, Tcl_DictObjDone, Tcl_DictObjPutKeyList, Tcl_DictObjRemoveKeyList \- manipulate Tcl objects as dictionaries +.SH SYNOPSIS +.nf +\fB#include <tcl.h>\fR +.sp +Tcl_Obj * +\fBTcl_NewDictObj\fR() +.sp +int +\fBTcl_DictObjGet\fR(\fIinterp, dictPtr, keyPtr, valuePtrPtr\fR) +.sp +int +\fBTcl_DictObjPut\fR(\fIinterp, dictPtr, keyPtr, valuePtr\fR) +.sp +int +\fBTcl_DictObjRemove\fR(\fIinterp, dictPtr, keyPtr\fR) +.sp +int +\fBTcl_DictObjSize\fR(\fIinterp, dictPtr, sizePtr\fR) +.sp +int +\fBTcl_DictObjFirst\fR(\fIinterp, dictPtr, searchPtr, keyPtrPtr, valuePtrPtr, donePtr\fR) +.sp +void +\fBTcl_DictObjNext\fR(\fIsearchPtr, keyPtrPtr, valuePtrPtr, donePtr\fR) +.sp +void +\fBTcl_DictObjDone\fR(\fIsearchPtr\fR) +.sp +int +\fBTcl_DictObjPutKeyList\fR(\fIinterp, dictPtr, keyc, keyv, valuePtr\fR) +.sp +int +\fBTcl_DictObjRemoveKeyList\fR(\fIinterp, dictPtr, keyc, keyv\fR) +.SH ARGUMENTS +.AS Tcl_DictSearch "**valuePtrPtr" out +.AP Tcl_Interp *interp in +If an error occurs while converting an object to be a dictionary object, +an error message is left in the interpreter's result object +unless \fIinterp\fR is NULL. +.AP Tcl_Obj *dictPtr in/out +Points to the dictionary object to be manipulated. +If \fIdictPtr\fR does not already point to a dictionary object, +an attempt will be made to convert it to one. +.AP Tcl_Obj *keyPtr in +Points to the key for the key/value pair being manipulated within the +dictionary object. +.AP Tcl_Obj *valuePtr in +Points to the value for the key/value pair being manipulate within the +dictionary object (or sub-object, in the case of +\fBTcl_DictObjPutKeyList\fR.) +.AP Tcl_Obj **valuePtrPtr out +Points to a variable that will have the value from a key/value pair +placed within it. For \fBTcl_DictObjFirst\fR and +\fBTcl_DictObjNext\fR, this may be NULL to indicate that the caller is +not interested in the value. +.AP Tcl_Obj **valuePtrPtr out +Points to a variable that will have the key from a key/value pair +placed within it. May be NULL to indicate that the caller is not +interested in the key. +.AP int *sizePtr out +Points to a variable that will have the number of key/value pairs +contained within the dictionary placed within it. +.AP Tcl_DictSearch *searchPtr in/out +Pointer to record to use to keep track of progress in enumerating all +key/value pairs in a dictionary. The contents of the record will be +initialised by the call to \fBTcl_DictObjFirst\fR. If the enumerating +is to be terminated before all values in the dictionary have been +returned, the search record \fImust\fR be passed to +\fBTcl_DictObjDone\fR to enable the internal locks to be released. +.AP int *donePtr out +Points to a variable that will have a non-zero value written into it +when the enumeration of the key/value pairs in a dictionary has +completed, and a zero otherwise. +.AP int keyc in +Indicates the number of keys that will be supplied in the \fIkeyv\fR +array. +.AP "Tcl_Obj *CONST" *keyv in +Array of \fIkeyc\fR pointers to objects that +\fBTcl_DictObjPutKeyList\fR and \fBTcl_DictObjRemoveKeyList\fR will +use to locate the key/value pair to manipulate within the +sub-dictionaries of the main dictionary object passed to them. +.BE + +.SH DESCRIPTION +.PP +Tcl dict objects have an internal representation that supports +efficient mapping from keys to values. +The procedures described in this man page are used to +create, modify, index, and iterate over Tcl dict objects from C code. +.PP +\fBTcl_NewDictObj\fR creates a new, empty dictionary object. The +string representation of the object will be invalid, and the reference +count of the object will be zero. +.PP +\fBTcl_DictObjGet\fR looks up the given key within the given +dictionary and writes a pointer to the value associated with that key +into the variable pointed to by \fIvaluePtrPtr\fR, or a NULL if the +key has no mapping within the dictionary. The result of this +procedure is TCL_OK, or TCL_ERROR if the \fIdictPtr\fR cannot be +converted to a dictionary. +.PP +\fBTcl_DictObjPut\fR updates the given dictionary so that the given +key maps to the given value; any key may exist at most once in any +particular dictionary. The dictionary must not be shared, but the key +and value may be. This procedure may increase the reference count of +both key and value if it proves necessary to store them. Neither key +nor value should be NULL. The result of this procedure is TCL_OK, or +TCL_ERROR if the \fIdictPtr\fR cannot be converted to a dictionary. +.PP +\fBTcl_DictObjRemove\fR updates the given dictionary so that the given +key has no mapping to any value. The dictionary must not be shared, +but the key may be. The key actually stored in the dictionary will +have its reference count decremented if it was present. It is not an +error if the key did not previously exist. The result of this +procedure is TCL_OK, or TCL_ERROR if the \fIdictPtr\fR cannot be +converted to a dictionary. +.PP +\fBTcl_DictObjSize\fR updates the given variable with the number of +key/value pairs currently in the given dictionary.The result of this +procedure is TCL_OK, or TCL_ERROR if the \fIdictPtr\fR cannot be +converted to a dictionary. +.PP +\fBTcl_DictObjFirst\fR commences an iteration across all the key/value +pairs in the given dictionary, placing the key and value in the +variables pointed to by the \fIkeyPtrPtr\fR and \fIvaluePtrPtr\fR +arguments (which may be NULL to indicate that the caller is +uninterested in they key or variable respectively.) The next +key/value pair in the dictionary may be retrieved with +\fBTcl_DictObjNext\fR. Concurrent updates of the dictionary's +internal representation will not modify the iteration processing +unless the dictionary is unshared, when this will trigger premature +termination of the iteration instead (which Tcl scripts cannot trigger +via the \fBdict\fR command.) The \fIsearchPtr\fR argument points to a +piece of context that is used to identify which particular iteration +is being performed, and is initialised by the call to +\fBTcl_DictObjFirst\fR. The \fIdonePtr\fR argument points to a +variable that is updated to be zero of there are further key/value +pairs to be iterated over, or non-zero if the iteration is complete. +The order of iteration is implementation-defined. If the +\fIdictPtr\fR argument cannot be converted to a dictionary, +\fBTcl_DictObjFirst\fR returns TCL_ERROR and the iteration is not +commenced, and otherwise it returns TCL_OK. +.PP +If the last call to \fBTcl_DictObjFirst\fR or \fBTcl_DictObjNext\fR +(for a particular \fIsearchPtr\fR) set the variable indicated by the +\fIdonePtr\fR argument to zero but no further key/value pairs are +desired from that particular iteration, the \fIsearchPtr\fR argument +must be passed to \fBTcl_DictObjDone\fR to release any internal locks +held by the searching process. +.PP +The procedures \fBTcl_DictObjPutKeyList\fR and +\fBTcl_DictObjRemoveKeyList\fR are the close analogues of +\fBTcl_DictObjPut\fR and \fBTcl_DictObjRemove\fR respectively, except +that instead of working with a single dictionary, they are designed to +operate on a nested tree of dictionaries, with inner dictionaries +stored as values inside outer dictionaries. The \fIkeyc\fR and +\fIkeyv\fR arguments specify a list of keys (with outermost keys +first) that acts as a path to the key/value pair to be affected. Note +that there is no corresponding operation for reading a value for a +path as this is easy to construct from repeated use of +\fBTcl_DictObjGet\fR. + +'\" TODO: Example of using Tcl_DictObj{First,Next,Done} + +.SH "SEE ALSO" +Tcl_NewObj, Tcl_DecrRefCount, Tcl_IncrRefCount, Tcl_InitObjHashTable + +.SH KEYWORDS +dict, dict object, dictionary, hash table, iteration, object + diff --git a/doc/dict.n b/doc/dict.n new file mode 100644 index 0000000..70c4db3 --- /dev/null +++ b/doc/dict.n @@ -0,0 +1,183 @@ +'\" +'\" Copyright (c) 2003 Donal K. Fellows +'\" +'\" See the file "license.terms" for information on usage and + \" redistribution +'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. +'\" +'\" RCS: @(#) $Id: dict.n,v 1.1 2003/04/05 01:03:20 dkf Exp $ +'\" +.so man.macros +.TH dict n 8.5 Tcl "Tcl Built-In Commands" +.BS +'\" Note: do not modify the .SH NAME line immediately below! +.SH NAME +dict \- Manipulate dictionaries. +.SH SYNOPSIS +\fBdict \fIoption arg \fR?\fIarg ...\fR? +.BE + +.SH DESCRIPTION +.PP +Performs one of several operations on dictionary values or variables +containing dictionary values, depending on \fIoption\fR. The legal +\fIoption\fRs (which may be abbreviated) are: +.TP +\fBdict append \fIdictionaryVariable key \fR?\fIstring ...\fR? +This appends the given string (or strings) to the value that the given +key maps to in the dictionary value contained in the given variable, +writing the resulting dictionary value back to that variable. +Non-existent keys are treated as if they map to an empty string. +.TP +\fBdict create \fR?\fIkey value ...\fR? +Create a new dictionary that contains each of the key/value mappings +listed as arguments (keys and values alternating, with each key being +followed by its associated value.) +.TP +\fBdict exists \fIdictionaryValue key \fR?\fIkey ...\fR? +This returns a boolean value indicating whether the given key (or path +of keys through a set of nested dictionaries) exists in the given +dictionary value. This returns a true value exactly when \fBdict +get\fR on that path will succeed. +.TP +\fBdict filter \fIdictionaryValue filterType arg \fR?\fIarg ...\fR? +This takes a dictionary value and returns a new dictionary that +contains just those key/value pairs that match the specified filter +type (which may be abbreviated.) Supported filter types are: +.RS +.TP +\fBdict filter \fIdictionaryValue \fBkey \fIglobPattern\fR +The key rule only matches those key/value pairs whose keys match the +given pattern (in the style of \fBstring match\fR.) +.TP +\fBdict filter \fIdictionaryValue \fBscript {\fIkeyVar valueVar\fB} \fIscript\fR +The script rule tests for matching by assigning the key to the +\fIkeyVar\fR and the value to the \fIvalueVar\fR, and then evaluating +the given script which should return a boolean value (with the +key/value pair only being included in the result of the \fBdict +filter\fR when a true value is returned.) Note that the first +argument after the rule selection word is a two-element list. If the +\fIscript\fR returns with a condition of TCL_BREAK, no further +key/value pairs are considered for inclusion in the resulting +dictionary, and a condition of TCL_CONTINUE is equivalent to a false +result. +.TP +\fBdict filter \fIdictionaryValue \fBvalue \fIglobPattern\fR +The value rule only matches those key/value pairs whose values match +the given pattern (in the style of \fBstring match\fR.) +.RE +.TP +\fBdict for {\fIkeyVar valueVar\fB} \fIdictionaryValue body\fR +This command takes three arguments, the first a two-element list of +variable names (for the key and value respectively of each mapping in +the dictionary), the second the dictionary value to iterate across, +and the third a script to be evaluated for each mapping with the key +and value variables set appropriately (in the manner of \fBforeach\fR.) +The result of the command is an empty string. If any evaluation of the +body generates a TCL_BREAK result, no further pairs from the +dictionary will be iterated over and the \fBdict for\fR command will +terminate successfully immediately. If any evaluation of the body +generates a TCL_CONTINUE result, this shall be treated exactly like a +normal TCL_OK result. The order of iteration is undefined. +.TP +\fBdict get \fIdictionaryValue \fR?\fIkey ...\fR? +Given a dictionary value (first argument) and a key (second argument), +this will retrieve the value for that key. Where several keys are +supplied, the behaviour of the command shall be as if the result of +\fBdict get $dictVal $key\fR was passed as the first argument to +\fBdict get\fR with the remaining arguments as second (and possibly +subsequent) arguments. This facilitates lookups in nested +dictionaries. For example, the following two commands are equivalent: +.RS +.CS +dict get $dict foo bar spong +dict get [dict get [dict get $dict foo] bar] spong +.CE +If no keys are provided, dict would return a list containing pairs of +elements in a manner similar to \fBarray get\fR. That is, the first +element of each pair would be the key and the second element would be +the value for that key. + +It is an error to attempt to retrieve a value for a key that is not +present in the dictionary. +.RE +.TP +\fBdict incr \fIdictionaryVariable key \fR?\fIincrement\fR? +This adds the given increment value (an integer that defaults to 1 if +not specified) to the value that the given key maps to in the +dictionary value contained in the given variable, writing the +resulting dictionary value back to that variable. Non-existent keys +are treated as if they map to 0. It is an error to increment a value +for an existing key if that value is not an integer. +.TP +\fBdict info \fIdictionaryValue\fR +This returns information (intended for display to people) about the +given dictionary though the format of this data is dependent on the +implementation of the dictionary. For dictionaries that are +implemented by hash tables, it is expected that this will return the +string produced by \fBTcl_HashStats\fR, similar to \fBarray info\fR. +.TP +\fBdict keys \fIdictionaryValue \fR?\fIglobPattern\fR? +Return a list of all keys in the given dictionary value. If a pattern +is supplied, only those keys that match it (according to the rules of +\fBstring match\fR) will be returned. The returned keys will be in an +arbitrary implementation-specific order, though where no pattern is +supplied the i'th key returned by \fBdict keys\fR will be the key for +the i'th value returned by \fBdict values\fR applied to the same +dictionary value. +.TP +\fBdict lappend \fIdictionaryVariable key \fR?\fIvalue ...\fR? +This appends the given items to the list value that the given key maps +to in the dictionary value contained in the given variable, writing +the resulting dictionary value back to that variable. Non-existent +keys are treated as if they map to an empty list, and it is legal for +there to be no items to append to the list. It is an error for the +value that the key maps to to not be representable as a list. +.TP +\fBdict remove \fIdictionaryValue \fR?\fIkey ...\fR? +Return a new dictionary that is a copy of an old one passed in as +first argument except without mappings for each of the keys listed. +It is legal for there to be no keys to remove, and it also legal for +any of the keys to be removed to not be present in the input +dictionary in the first place. +.TP +\fBdict replace \fIdictionaryValue \fR?\fIkey value ...\fR? +Return a new dictionary that is a copy of an old one passed in as +first argument except with some values different or some extra +key/value pairs added. It is legal for this command to be called with +no key/value pairs, but illegal for this command to be called with a +key but no value. +.TP +\fBdict set \fIdictionaryVariable key \fR?\fIkey ...\fR? \fIvalue\fR +This operation takes the name of a variable containing a dictionary +value and places an updated dictionary value in that variable +containing a mapping from the given key to the given value. In a +manner analogous to \fBlset\fR, where multiple keys are present, they +do indexing into nested dictionaries. +.TP +\fBdict size \fIdictionaryValue\fR +Return the number of key/value mappings in the given dictionary value. +.TP +\fBdict unset \fIdictionaryVariable key \fR?\fIkey ...\fR? +This operation (the companion to \fBdict set\fR) takes the name of a +variable containing a dictionary value and places an updated +dictionary value in that variable that does not contain a mapping for +the given key. Where multiple keys are present, this describes a path +through nested dictionaries to the mapping to remove. At least one key +must be specified, but the last key on the key-path need not exist. +All other components on the path must exist. +.TP +\fBdict values \fIdictionaryValue \fR?\fIglobPattern\fR? +Return a list of all values in the given dictionary value. If a +pattern is supplied, only those values that match it (according to the +rules of \fBstring match\fR) will be returned. The returned values +will be in an arbitrary implementation-specific order, though where no +pattern is supplied the i'th key returned by \fBdict keys\fR will be +the key for the i'th value returned by \fBdict values\fR applied to +the same dictionary value. + +.SH "SEE ALSO" +append(n), array(n), foreach(n), incr(n), list(n), lappend(n), set(n) + +.SH KEYWORDS +dictionary, create, update, lookup, iterate, filter |