From 5ef6b01420fe68f40c266cec62c5b4a7931420f1 Mon Sep 17 00:00:00 2001 From: Kaz Kylheku Date: Mon, 17 Jun 2019 06:54:47 -0700 Subject: carray-sub: improved accessor. * share/txr/stdlib/ffi.tl (carray-sub): We use defset to define a carray-sub place that updates via carray-replace, rather than using a place macro to defer to the generic sub accessor. This results in a more efficient implementation. This new accessor doesn't require the carray argument to be a place; unlike sub, it doesn't have to capture the return value of carray-replace and store it back into the carray variable. * txr.1: Updated doc. --- share/txr/stdlib/ffi.tl | 4 ++-- txr.1 | 15 ++++++++++++--- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/share/txr/stdlib/ffi.tl b/share/txr/stdlib/ffi.tl index ed8ad06d..6bbd43a9 100644 --- a/share/txr/stdlib/ffi.tl +++ b/share/txr/stdlib/ffi.tl @@ -145,8 +145,8 @@ (define-accessor carray-ref carray-refset) -(define-place-macro carray-sub (carray : (from 0) (to t)) - ^(sub ,carray ,from ,to)) +(defset carray-sub (carray : (from 0) (to t)) items + ^(progn (carray-replace ,carray ,items ,from ,to) ,items)) (defmacro znew (type . pairs) (if (oddp (length pairs)) diff --git a/txr.1 b/txr.1 index 4ecbc011..9de125f1 100644 --- a/txr.1 +++ b/txr.1 @@ -65108,9 +65108,18 @@ and modifications in the original are not reflected in the subrange. If .code carray-sub -is used as a syntactic place, behaves exactly like the -.code sub -accessor, via a place macro substitution to that form. +is used as a syntactic place, the argument expressions +.metn carray , +.metn from , +.meta to +and +.meta new-val +are evaluated just once. The prior value, if required, is accessed by calling +.code carray-sub +and +.meta new-val +is then stored via +.codn carray-replace . .coNP Function @ carray-replace .synb -- cgit v1.2.3