diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2016-10-31 06:49:22 -0700 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2016-10-31 06:49:22 -0700 |
commit | 4b4ef6dfcf12e1db846b26a3b812aa010360d62f (patch) | |
tree | a80e4d82757e2385fa731f4fc07beb362e41d7d9 /txr.1 | |
parent | e7523b22158785bcd542f2abfe3a3e0d96b7b1ab (diff) | |
download | txr-4b4ef6dfcf12e1db846b26a3b812aa010360d62f.tar.gz txr-4b4ef6dfcf12e1db846b26a3b812aa010360d62f.tar.bz2 txr-4b4ef6dfcf12e1db846b26a3b812aa010360d62f.zip |
Relax restrictions on dwim places.
No longer require the leftmost expression in a dwim place to
itself be a place, except when the expression evaluates to
a list, and the list is subject to an element deletion or
a range operation.
* eval.c (eval_init): Register dwim-set and dwim-del with
one additional argument that the C functions now take.
* lib.c (dwim_set, dwim_del): Take a new place_p argument
which informs these functions whether the object they
are operating on came from a syntactic place. The forbidden
situations are diagnosed based on this flag: modification
of the subrange of a list, or deletion of a list ref.
Some error messages reworded.
* lib.h (dwim_set, dwim_del): Declarations updated.
* share/txr/stdlib/place.tl (defplace dwim): Produce a
different update, clobber and delete expansion when
the obj-place form isn't a place. In the non-place case,
do not assign the result of the sys:dwim-set or
sys:dwim-del operation back obj-place. Furthermore,
pass a Boolean flag to sys:dwim-set and sys:dwim-del
indicating which situation is the case: did the object
argument come from a place or non-place.
* txr.1: Documentation updated.
Diffstat (limited to 'txr.1')
-rw-r--r-- | txr.1 | 26 |
1 files changed, 15 insertions, 11 deletions
@@ -12634,14 +12634,18 @@ at the specified .metn index , which is a nonnegative integer. -This form is also a place if the -.meta sequence -subform is a place. If a value is stored to this place, it replaces the +This form is also a syntactic place. +If a value is stored to this place, it replaces the element. The place may also be deleted, which has the effect of removing the element from the sequence, shifting the elements at higher indices, if any, down one element position, and shortening the sequence by one. +If the place is deleted, and if +.meta sequence +is a list, then the +.meta sequence +form itself must be a place. .meIP >> [ sequence << from-index..to-below-index ] Retrieve the specified range of elements. @@ -12655,14 +12659,17 @@ fields of a range object. The .code rcons function. See the section on Range Indexing below. -This form is also a syntactic place, if the -.meta sequence -subform is a place. Storing a value in this place +This form is also a syntactic place. Storing a value in this place has the effect of replacing the subsequence with a new subsequence. Deleting the place has the effect of removing the specified subsequence from .metn sequence . +If +.meta sequence +is a list, then the +.meta sequence +form must itself be a place. The .meta new-value argument in a range assignment can be a string, vector or list, @@ -22519,7 +22526,7 @@ This has an effect which can be described by the following code: .cblk (progn - (set s s.(lambda-set a b c d v)) + s s.(lambda-set a b c d v) v) .cble @@ -22560,10 +22567,7 @@ arguments. The return value of .code lambda-set -is significant. Unless there is a very good reason for the method to -do otherwise, it should return the structure itself. This is because -the place-mutating operators store this returned value back to the place -which holds the structure itself. +is ignored. .TP* Example |