Back to library index.
Package std-list (in std.i) - list objects (deprecated, use oxy)
Index of documented functions or symbols:
SEE: _lst
SEE: _lst
SEE: _lst
SEE: _lst
SEE: _lst
DOCUMENT list= _lst(item1, item2, item3, ...)
list= _cat(item_or_list1, item_or_list2, item_or_list3, ...)
list= _cpy(list)
list= _cpy(list, i)
length= _len(list)
item= _car(list)
item_i= _car(list, i)
_car, list, i, new_item_i
list= _cdr(list)
list= _cdr(list, i)
_cdr, list, i, new_list_i
**** DEPRECATED, object extensions in new code, see help,oxy
implement rudimentary Lisp-like list handling in Yorick.
However, in Yorick, a list must have a simple tree structure
- no loops or rings are allowed (loops break Yorick's memory
manager - beware). You need to be careful not to do this as
the error will not be detected.
Lists are required in Yorick whenever you need to hold an
indeterminate amount of non-array data, such as file handles,
bookmarks, functions, index ranges, etc. Note that Yorick
pointers cannot point to these objects. For array data, you have
a choice between a list and a struct or an array of pointers.
Note that a list cannot be written into a file with the save
function, since it may contain unsaveable items.
The _lst (list), _cat (catenate), and _cpy (copy) functions
are the principal means for creating and maintaining lists.
_lst makes a list out of its arguments, so that each argument
becomes one item of the new list. Unlike Yorick array data
types, a statement like x=list does not make a copy of the
list, it merely makes an additional reference to the list.
You must explicitly use the _cpy function to copy a list. Note
that _cpy only copies the outermost list itself, not the items
in the list (even if those items are lists). With the second
argument i, _cpy copies only the first i items in the list.
The _cat function concatentates several lists together,
"promoting" any arguments which are not lists. This operation
changes the values of list arguments to _cat, except for the
final argument, since after _cat(list, item), the variable list
will point to the new longer list returned by _cat.
Nil, or [], functions as an empty list. This leads to ambiguity
in the argument list for _cat, since _cat "promotes" non-list
arguments to lists; _cat treats [] as an empty list, not as a
non-list item. Also, _lst() or _lst([]) returns a single item list,
not [] itself.
The _len function returns the number of items in a list, or 0
for [].
The _car and _cdr functions (the names are taken from Lisp,
where they originally stood for something like "address register"
and "data register" of some long forgotten machine) provide
access to the items stored in a list. _car(list,i) returns the
i-th item of the list, and i defaults to 1, so _car(list) is the
first item. Also, _car,list,i,new_item_i sets the i-th item
of the list. Finally, _cdr(list,i) returns a list of all the
items beyond the i-th, where i again defaults to 1. The form
_cdr,list,i,new_list_i can be used to reset all list items
beyond the i-th to new values. In the _cdr function, i=0 is
allowed. When used to set values, both _car and _cdr can also
be called as functions, in which case they return the item or
list which has been replaced. The _cdr(list) function returns
nil if and only if LIST contains only a single item; this is
the usual means of halting a loop over items in a list.
DOCUMENT _map(f, list)
return a list of the results of applying function F to each
element of the input LIST in turn, as if by
_lst(f(_car(list,1)),f(_car(list,2)),...)
SEE ALSO: _lst
DOCUMENT item= _nxt(list) return first item in LIST, and set LIST to list of remaining items. If you are iterating through a list, this is the way to do it, since a loop on _car(list,i) with i varying from 1 to _len(list) scales quadratically with the length of the list, while a loop on _nxt(list) scales linearly.
DOCUMENT _prt, list print every item in a list, recursing if some item is itself a list.
SEE ALSO: _lst
