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 /eval.c | |
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 'eval.c')
-rw-r--r-- | eval.c | 4 |
1 files changed, 2 insertions, 2 deletions
@@ -5347,8 +5347,8 @@ void eval_init(void) reg_fun(intern(lit("ref"), user_package), func_n2(ref)); reg_fun(intern(lit("refset"), user_package), func_n3(refset)); reg_fun(intern(lit("replace"), user_package), func_n4o(replace, 2)); - reg_fun(intern(lit("dwim-set"), system_package), func_n1v(dwim_set)); - reg_fun(intern(lit("dwim-del"), system_package), func_n2(dwim_del)); + reg_fun(intern(lit("dwim-set"), system_package), func_n2v(dwim_set)); + reg_fun(intern(lit("dwim-del"), system_package), func_n3(dwim_del)); reg_fun(intern(lit("update"), user_package), func_n2(update)); reg_fun(intern(lit("search"), user_package), func_n4o(search, 2)); reg_fun(intern(lit("rsearch"), user_package), func_n4o(rsearch, 2)); |