From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: Daniel Llorens Newsgroups: gmane.lisp.guile.devel Subject: [PATCH] Re: Patchset related to array functions Date: Thu, 14 Jul 2016 17:41:45 +0200 Message-ID: <26F2BB49-7AD1-4DEC-87F4-0C4705A27378@bluewin.ch> References: <7EFBBC0B-FF29-418A-96DA-D1A323B66C95@bluewin.ch> <87twfv0wvm.fsf@pobox.com> <87poqg1rj5.fsf@pobox.com> NNTP-Posting-Host: plane.gmane.org Mime-Version: 1.0 (Mac OS X Mail 7.3 \(1878.6\)) Content-Type: multipart/mixed; boundary="Apple-Mail=_C05A2854-9EDB-476D-AE5C-EF5B1F5E02F5" X-Trace: ger.gmane.org 1468511149 785 80.91.229.3 (14 Jul 2016 15:45:49 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Thu, 14 Jul 2016 15:45:49 +0000 (UTC) Cc: guile-devel To: Andy Wingo Original-X-From: guile-devel-bounces+guile-devel=m.gmane.org@gnu.org Thu Jul 14 17:45:39 2016 Return-path: Envelope-to: guile-devel@m.gmane.org Original-Received: from lists.gnu.org ([208.118.235.17]) by plane.gmane.org with esmtp (Exim 4.69) (envelope-from ) id 1bNipV-0002Rb-A3 for guile-devel@m.gmane.org; Thu, 14 Jul 2016 17:45:38 +0200 Original-Received: from localhost ([::1]:55051 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bNipP-0008Oj-HI for guile-devel@m.gmane.org; Thu, 14 Jul 2016 11:45:31 -0400 Original-Received: from eggs.gnu.org ([2001:4830:134:3::10]:34440) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bNilx-0004rt-NY for guile-devel@gnu.org; Thu, 14 Jul 2016 11:41:59 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1bNilt-0006YR-8T for guile-devel@gnu.org; Thu, 14 Jul 2016 11:41:56 -0400 Original-Received: from zhhdzmsp-smta18.bluewin.ch ([195.186.227.133]:57609) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bNils-0006W1-5d for guile-devel@gnu.org; Thu, 14 Jul 2016 11:41:53 -0400 Original-Received: from [195.186.99.131] ([195.186.99.131:64970] helo=zhbdzmsp-smta13.bluewin.ch) by zhhdzmsp-smta18.bluewin.ch (envelope-from ) (ecelerity 3.5.10.45038 r(Core:3.5.10.0)) with ESMTP id 09/99-02404-CB2B7875; Thu, 14 Jul 2016 15:41:48 +0000 Original-Received: from 4box.hq.corp.viasat.com (62.2.203.131) by zhbdzmsp-smta13.bluewin.ch (8.5.142) (authenticated as dll@bluewin.ch) id 5757CE92021408E2; Thu, 14 Jul 2016 15:41:48 +0000 In-Reply-To: <87poqg1rj5.fsf@pobox.com> X-Mailer: Apple Mail (2.1878.6) X-detected-operating-system: by eggs.gnu.org: Windows NT kernel [generic] [fuzzy] X-Received-From: 195.186.227.133 X-BeenThere: guile-devel@gnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: "Developers list for Guile, the GNU extensibility library" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: guile-devel-bounces+guile-devel=m.gmane.org@gnu.org Original-Sender: "guile-devel" Xref: news.gmane.org gmane.lisp.guile.devel:18494 Archived-At: --Apple-Mail=_C05A2854-9EDB-476D-AE5C-EF5B1F5E02F5 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset=windows-1252 On 14 Jul 2016, at 11:46, Andy Wingo wrote: > Thanks for the update. >=20 > On Tue 12 Jul 2016 19:16, Daniel Llorens = writes: >=20 >> Subject: [PATCH 01/12] Compile in C99 mode >=20 > This could be a good change but it is not the fastest path to patch > review :) There are three considerations here: >=20 > (1) Can we support C99 on all targets we care about? The manual doesn't seem to list which platforms we support, or I can't = find it. I know that bugs are reported on the list occasionally for = Solaris etc. which I guess counts as exotic nowadays. The wiki mentions GNU, GNU/Linux, BSD, MinGW and Cygwin. All those = systems have C99 compilers. Apparently the list of supported platforms = for Emacs (future versions at least) is the same, plus a few proprietary = Unixes all of which I assume have C99 compilers (plus gcc runs in all of = them). > (2) Can we use C99 in our public interface, or just internally? If = we > use it publically, what should we change? No more scm_t_uint8 I > hope, besides for back-compat? This patch set does not have to > include these changes, but we should have a plan. I think we'd want C89/C90 users to still be able to #include = . Dunno. > (3) Most importantly, what is the impact on inlining? See the = comment > in __scm.h around line 165. Apparently the standard practice in C99 is to put inline definition in = the header and extern declaration in the .c, while with =91Guile inline=92= both SCM_INLINE and SCM_INLINE_IMPLEMENTATION are in the header. I can = try to fix Guile to follow the C99 practice and remove most of the = #define guards. Would a patch doing this be accepted? I'd welcome advice = on how to test such a patch. E.g. with both -O2 and -O0 or so. I'm = mostly a C++ programmer and I don't want to mess anything up. The source has a lot of guarding against the compiler landscape of the = 90s that might not be necessary today. > If you want your patch set to depend on C99 that's fine, but you have = to > answer these questions first for the project as a whole and get some > consensus. That is a very reasonable viewpoint. Since C99 was just a minor = convenience to me, I withdraw that particular patch. I have rebased = everything to avoid the C99 requirement. Revised patchset attached. --Apple-Mail=_C05A2854-9EDB-476D-AE5C-EF5B1F5E02F5 Content-Disposition: attachment; filename=0001-Fix-compilation-of-rank-0-typed-array-literals.patch Content-Type: application/octet-stream; name="0001-Fix-compilation-of-rank-0-typed-array-literals.patch" Content-Transfer-Encoding: quoted-printable =46rom=20e657d1f11aad8a9d37eec5ac13007bfcc88300fe=20Mon=20Sep=2017=20= 00:00:00=202001=0AFrom:=20Daniel=20Llorens=20=0A= Date:=20Thu,=2012=20Feb=202015=2013:02:24=20+0100=0ASubject:=20[PATCH=20= 01/11]=20Fix=20compilation=20of=20rank=200=20typed=20array=20literals=0A=0A= *=20module/system/vm/assembler.scm=20(simple-uniform-vector?):=20= array-length=0A=20=20fails=20for=20rank=200=20arrays;=20fix=20the=20= shape=20condition.=0A=0A*=20test-suite/tests/arrays.test:=20Test=20= reading=20of=20#0f64(x)=20in=20compilation=0A=20=20context.=0A---=0A=20= module/system/vm/assembler.scm=20|=204=20+++-=0A=20= test-suite/tests/arrays.test=20=20=20|=208=20+++++++-=0A=202=20files=20= changed,=2010=20insertions(+),=202=20deletions(-)=0A=0Adiff=20--git=20= a/module/system/vm/assembler.scm=20b/module/system/vm/assembler.scm=0A= index=2020a652c..f6b3caa=20100644=0A---=20= a/module/system/vm/assembler.scm=0A+++=20= b/module/system/vm/assembler.scm=0A@@=20-995,7=20+995,9=20@@=20= immediate,=20and=20@code{#f}=20otherwise."=0A=20(define=20= (simple-uniform-vector?=20obj)=0A=20=20=20(and=20(array?=20obj)=0A=20=20=20= =20=20=20=20=20(symbol?=20(array-type=20obj))=0A-=20=20=20=20=20=20=20= (equal?=20(array-shape=20obj)=20(list=20(list=200=20(1-=20(array-length=20= obj)))))))=0A+=20=20=20=20=20=20=20(match=20(array-shape=20obj)=0A+=20=20= =20=20=20=20=20=20=20(((0=20n))=20#t)=0A+=20=20=20=20=20=20=20=20=20= (else=20#f))))=0A=20=0A=20(define=20(statically-allocatable?=20x)=0A=20=20= =20"Return=20@code{#t}=20if=20a=20non-immediate=20constant=20can=20be=20= allocated=0Adiff=20--git=20a/test-suite/tests/arrays.test=20= b/test-suite/tests/arrays.test=0Aindex=20e76c699..20cb78b=20100644=0A---=20= a/test-suite/tests/arrays.test=0A+++=20b/test-suite/tests/arrays.test=0A= @@=20-204,7=20+204,13=20@@=0A=20(with-test-prefix/c&e=20"array-equal?"=0A= =20=0A=20=20=20(pass-if=20"#s16(...)"=0A-=20=20=20=20(array-equal?=20= #s16(1=202=203)=20#s16(1=202=203))))=0A+=20=20=20=20(array-equal?=20= #s16(1=202=203)=20#s16(1=202=203)))=0A+=0A+=20=20(pass-if=20"#0f64(...)"=0A= +=20=20=20=20(array-equal?=20#0f64(99)=20(make-typed-array=20'f64=20= 99)))=0A+=0A+=20=20(pass-if=20"#0(...)"=0A+=20=20=20=20(array-equal?=20= #0(99)=20(make-array=2099))))=0A=20=0A=20;;;=0A=20;;;=20= make-shared-array=0A--=20=0A2.7.3=0A=0A= --Apple-Mail=_C05A2854-9EDB-476D-AE5C-EF5B1F5E02F5 Content-Disposition: attachment; filename=0002-Remove-scm_from_contiguous_array-array-contiguous-fl.patch Content-Type: application/octet-stream; name="0002-Remove-scm_from_contiguous_array-array-contiguous-fl.patch" Content-Transfer-Encoding: quoted-printable =46rom=2056deb6ae1da4edd28a461fd2a01bf682391dfb62=20Mon=20Sep=2017=20= 00:00:00=202001=0AFrom:=20Daniel=20Llorens=20=0A= Date:=20Mon,=209=20Feb=202015=2017:27:33=20+0100=0ASubject:=20[PATCH=20= 02/11]=20Remove=20scm_from_contiguous_array,=20array=20'contiguous'=0A=20= flag=0A=0Ascm_from_contiguous_array()=20is=20undocumented,=20unused=20= within=20Guile,=20and=0Acan=20be=20trivially=20replaced=20by=20= make-array=20+=20array-copy=20without=20requiring=0Acontiguity.=0A=0AThe=20= related=20SCM_I_ARRAY_FLAG_CONTIGUOUS=20(arrays.h)=20was=20set=20by=20= all=0Aarray-creating=20functions=20(make-typed-array,=20transpose-array,=0A= make-shared-array)=20but=20it=20was=20only=20used=20by=20array-contents,=20= which=20needed=0Ato=20traverse=20the=20dimensions=20anyway.=0A=0A*=20= libguile/arrays.h=20(scm_from_contiguous_array):=20Remove=20declaration.=0A= =0A*=20libguile/arrays.c=20(scm_from_contiguous_array):=20Remove.=0A=0A=20= =20(scm_make_typed_array,=20scm_from_contiguous_typed_array):=20Don't=20= set=20the=0A=20=20contiguous=20flag.=0A=0A=20=20(scm_transpose_array,=20= scm_make_shared_array):=20Don't=20call=0A=20=20scm_i_ra_set_contp.=0A=0A=20= =20(scm_array_contents):=20Inline=20scm_i_ra_set_contp()=20here.=20Adopt=20= uniform=0A=20=20type=20check=20order.=20Remove=20redundant=20comments.=0A= =0A=20=20(scm_i_ra_set_contp):=20Remove.=0A=0A*=20= test-suite/tests/arrays.test:=20Test=20array-contents=20with=20rank=200=20= array.=0A---=0A=20libguile/arrays.c=20=20=20=20=20=20=20=20=20=20=20=20|=20= 112=20+++++++++++--------------------------------=0A=20libguile/arrays.h=20= =20=20=20=20=20=20=20=20=20=20=20|=20=20=204=20+-=0A=20= test-suite/tests/arrays.test=20|=20=20=206=20+++=0A=203=20files=20= changed,=2036=20insertions(+),=2086=20deletions(-)=0A=0Adiff=20--git=20= a/libguile/arrays.c=20b/libguile/arrays.c=0Aindex=2052fe90a..3cb547f=20= 100644=0A---=20a/libguile/arrays.c=0A+++=20b/libguile/arrays.c=0A@@=20= -188,7=20+188,6=20@@=20SCM_DEFINE=20(scm_make_typed_array,=20= "make-typed-array",=202,=200,=201,=0A=20=20=20SCM=20ra;=0A=20=0A=20=20=20= ra=20=3D=20scm_i_shap2ra=20(bounds);=0A-=20=20= SCM_SET_ARRAY_CONTIGUOUS_FLAG=20(ra);=0A=20=20=20s=20=3D=20= SCM_I_ARRAY_DIMS=20(ra);=0A=20=20=20k=20=3D=20SCM_I_ARRAY_NDIM=20(ra);=0A= =20=0A@@=20-225,7=20+224,6=20@@=20scm_from_contiguous_typed_array=20(SCM=20= type,=20SCM=20bounds,=20const=20void=20*bytes,=0A=20=20=20size_t=20sz;=0A= =20=0A=20=20=20ra=20=3D=20scm_i_shap2ra=20(bounds);=0A-=20=20= SCM_SET_ARRAY_CONTIGUOUS_FLAG=20(ra);=0A=20=20=20s=20=3D=20= SCM_I_ARRAY_DIMS=20(ra);=0A=20=20=20k=20=3D=20SCM_I_ARRAY_NDIM=20(ra);=0A= =20=0A@@=20-270,41=20+268,6=20@@=20scm_from_contiguous_typed_array=20= (SCM=20type,=20SCM=20bounds,=20const=20void=20*bytes,=0A=20}=0A=20#undef=20= FUNC_NAME=0A=20=0A-SCM=0A-scm_from_contiguous_array=20(SCM=20bounds,=20= const=20SCM=20*elts,=20size_t=20len)=0A-#define=20FUNC_NAME=20= "scm_from_contiguous_array"=0A-{=0A-=20=20size_t=20k,=20rlen=20=3D=201;=0A= -=20=20scm_t_array_dim=20*s;=0A-=20=20SCM=20ra;=0A-=20=20= scm_t_array_handle=20h;=0A-=0A-=20=20ra=20=3D=20scm_i_shap2ra=20= (bounds);=0A-=20=20SCM_SET_ARRAY_CONTIGUOUS_FLAG=20(ra);=0A-=20=20s=20=3D=20= SCM_I_ARRAY_DIMS=20(ra);=0A-=20=20k=20=3D=20SCM_I_ARRAY_NDIM=20(ra);=0A-=0A= -=20=20while=20(k--)=0A-=20=20=20=20{=0A-=20=20=20=20=20=20s[k].inc=20=3D=20= rlen;=0A-=20=20=20=20=20=20SCM_ASSERT_RANGE=20(1,=20bounds,=20s[k].lbnd=20= <=3D=20s[k].ubnd=20+=201);=0A-=20=20=20=20=20=20rlen=20=3D=20(s[k].ubnd=20= -=20s[k].lbnd=20+=201)=20*=20s[k].inc;=0A-=20=20=20=20}=0A-=20=20if=20= (rlen=20!=3D=20len)=0A-=20=20=20=20SCM_MISC_ERROR=20("element=20length=20= and=20dimensions=20do=20not=20match",=20SCM_EOL);=0A-=0A-=20=20= SCM_I_ARRAY_SET_V=20(ra,=20scm_c_make_vector=20(rlen,=20SCM_UNDEFINED));=0A= -=20=20scm_array_get_handle=20(ra,=20&h);=0A-=20=20memcpy=20= (h.writable_elements,=20elts,=20rlen=20*=20sizeof(SCM));=0A-=20=20= scm_array_handle_release=20(&h);=0A-=0A-=20=20if=20(1=20=3D=3D=20= SCM_I_ARRAY_NDIM=20(ra)=20&&=200=20=3D=3D=20SCM_I_ARRAY_BASE=20(ra))=0A-=20= =20=20=20if=20(0=20=3D=3D=20s->lbnd)=0A-=20=20=20=20=20=20return=20= SCM_I_ARRAY_V=20(ra);=0A-=20=20return=20ra;=0A-}=0A-#undef=20FUNC_NAME=0A= -=0A=20SCM_DEFINE=20(scm_make_array,=20"make-array",=201,=200,=201,=0A=20= =09=20=20=20=20(SCM=20fill,=20SCM=20bounds),=0A=20=09=20=20=20=20"Create=20= and=20return=20an=20array.")=0A@@=20-314,27=20+277,6=20@@=20SCM_DEFINE=20= (scm_make_array,=20"make-array",=201,=200,=201,=0A=20}=0A=20#undef=20= FUNC_NAME=0A=20=0A-static=20void=0A-scm_i_ra_set_contp=20(SCM=20ra)=0A-{=0A= -=20=20size_t=20k=20=3D=20SCM_I_ARRAY_NDIM=20(ra);=0A-=20=20if=20(k)=0A-=20= =20=20=20{=0A-=20=20=20=20=20=20ssize_t=20inc=20=3D=20SCM_I_ARRAY_DIMS=20= (ra)[k=20-=201].inc;=0A-=20=20=20=20=20=20while=20(k--)=0A-=09{=0A-=09=20= =20if=20(inc=20!=3D=20SCM_I_ARRAY_DIMS=20(ra)[k].inc)=0A-=09=20=20=20=20= {=0A-=09=20=20=20=20=20=20SCM_CLR_ARRAY_CONTIGUOUS_FLAG=20(ra);=0A-=09=20= =20=20=20=20=20return;=0A-=09=20=20=20=20}=0A-=09=20=20inc=20*=3D=20= (SCM_I_ARRAY_DIMS=20(ra)[k].ubnd=0A-=09=09=20=20-=20SCM_I_ARRAY_DIMS=20= (ra)[k].lbnd=20+=201);=0A-=09}=0A-=20=20=20=20}=0A-=20=20= SCM_SET_ARRAY_CONTIGUOUS_FLAG=20(ra);=0A-}=0A-=0A=20=0A=20SCM_DEFINE=20= (scm_make_shared_array,=20"make-shared-array",=202,=200,=201,=0A=20=20=20= =20=20=20=20=20=20=20=20=20(SCM=20oldra,=20SCM=20mapfunc,=20SCM=20dims),=0A= @@=20-448,7=20+390,6=20@@=20SCM_DEFINE=20(scm_make_shared_array,=20= "make-shared-array",=202,=200,=201,=0A=20=09return=20= scm_make_generalized_vector=20(scm_array_type=20(ra),=20SCM_INUM0,=0A=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20SCM_UNDEFINED);=0A=20= =20=20=20=20}=0A-=20=20scm_i_ra_set_contp=20(ra);=0A=20=20=20return=20= ra;=0A=20}=0A=20#undef=20FUNC_NAME=0A@@=20-547,16=20+488,12=20@@=20= SCM_DEFINE=20(scm_transpose_array,=20"transpose-array",=201,=200,=201,=0A= =20=09}=0A=20=20=20=20=20=20=20if=20(ndim=20>=200)=0A=20=09= SCM_MISC_ERROR=20("bad=20argument=20list",=20SCM_EOL);=0A-=20=20=20=20=20= =20scm_i_ra_set_contp=20(res);=0A=20=20=20=20=20=20=20return=20res;=0A=20= =20=20=20=20}=0A=20}=0A=20#undef=20FUNC_NAME=0A=20=0A-/*=20attempts=20to=20= unroll=20an=20array=20into=20a=20one-dimensional=20array.=0A-=20=20=20= returns=20the=20unrolled=20array=20or=20#f=20if=20it=20can't=20be=20= done.=20=20*/=0A-/*=20if=20strict=20is=20true,=20return=20#f=20if=20= returned=20array=0A-=20=20=20wouldn't=20have=20contiguous=20elements.=20=20= */=0A+=0A=20SCM_DEFINE=20(scm_array_contents,=20"array-contents",=201,=20= 1,=200,=0A=20=20=20=20=20=20=20=20=20=20=20=20(SCM=20ra,=20SCM=20= strict),=0A=20=09=20=20=20=20"If=20@var{ra}=20may=20be=20@dfn{unrolled}=20= into=20a=20one=20dimensional=20shared\n"=0A@@=20-566,31=20+503,38=20@@=20= SCM_DEFINE=20(scm_array_contents,=20"array-contents",=201,=201,=200,=0A=20= =09=20=20=20=20"@code{make-array}=20and=20@code{make-uniform-array}=20= may=20be=20unrolled,\n"=0A=20=09=20=20=20=20"some=20arrays=20made=20by=20= @code{make-shared-array}=20may=20not=20be.=20=20If\n"=0A=20=09=20=20=20=20= "the=20optional=20argument=20@var{strict}=20is=20provided,=20a=20shared=20= array\n"=0A-=09=20=20=20=20"will=20be=20returned=20only=20if=20its=20= elements=20are=20stored=20internally\n"=0A-=09=20=20=20=20"contiguous=20= in=20memory.")=0A+=09=20=20=20=20"will=20be=20returned=20only=20if=20its=20= elements=20are=20stored=20contiguously\n"=0A+=09=20=20=20=20"in=20= memory.")=0A=20#define=20FUNC_NAME=20s_scm_array_contents=0A=20{=0A-=20=20= if=20(!scm_is_array=20(ra))=0A-=20=20=20=20scm_wrong_type_arg_msg=20= (NULL,=200,=20ra,=20"array");=0A-=20=20else=20if=20(SCM_I_ARRAYP=20(ra))=0A= +=20=20if=20(SCM_I_ARRAYP=20(ra))=0A=20=20=20=20=20{=0A=20=20=20=20=20=20= =20SCM=20v;=0A-=20=20=20=20=20=20size_t=20k,=20ndim=20=3D=20= SCM_I_ARRAY_NDIM=20(ra),=20len=20=3D=201;=0A-=20=20=20=20=20=20if=20= (!SCM_I_ARRAY_CONTP=20(ra))=0A-=09return=20SCM_BOOL_F;=0A-=20=20=20=20=20= =20for=20(k=20=3D=200;=20k=20<=20ndim;=20k++)=0A-=09len=20*=3D=20= SCM_I_ARRAY_DIMS=20(ra)[k].ubnd=20-=20SCM_I_ARRAY_DIMS=20(ra)[k].lbnd=20= +=201;=0A+=20=20=20=20=20=20size_t=20ndim=20=3D=20SCM_I_ARRAY_NDIM=20= (ra);=0A+=20=20=20=20=20=20scm_t_array_dim=20*s=20=3D=20SCM_I_ARRAY_DIMS=20= (ra);=0A+=20=20=20=20=20=20size_t=20k=20=3D=20ndim;=0A+=20=20=20=20=20=20= size_t=20len=20=3D=201;=0A+=0A+=20=20=20=20=20=20if=20(k)=0A+=20=20=20=20= =20=20=20=20{=0A+=20=20=20=20=20=20=20=20=20=20ssize_t=20last_inc=20=3D=20= s[k=20-=201].inc;=0A+=20=20=20=20=20=20=20=20=20=20while=20(k--)=0A+=20=20= =20=20=20=20=20=20=20=20=20=20{=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20= =20if=20(len*last_inc=20!=3D=20s[k].inc)=0A+=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20return=20SCM_BOOL_F;=0A+=20=20=20=20=20=20=20=20=20=20=20= =20=20=20len=20*=3D=20(s[k].ubnd=20-=20s[k].lbnd=20+=201);=0A+=20=20=20=20= =20=20=20=20=20=20=20=20}=0A+=20=20=20=20=20=20=20=20}=0A+=0A=20=20=20=20= =20=20=20if=20(!SCM_UNBNDP=20(strict)=20&&=20scm_is_true=20(strict))=0A=20= =09{=0A-=09=20=20if=20(ndim=20&&=20(1=20!=3D=20SCM_I_ARRAY_DIMS=20= (ra)[ndim=20-=201].inc))=0A+=09=20=20if=20(ndim=20&&=20(1=20!=3D=20= s[ndim=20-=201].inc))=0A=20=09=20=20=20=20return=20SCM_BOOL_F;=0A-=09=20=20= if=20(scm_is_bitvector=20(SCM_I_ARRAY_V=20(ra)))=0A-=09=20=20=20=20{=0A-=09= =20=20=20=20=20=20if=20(len=20!=3D=20scm_c_bitvector_length=20= (SCM_I_ARRAY_V=20(ra))=20||=0A-=09=09=20=20SCM_I_ARRAY_BASE=20(ra)=20%=20= SCM_LONG_BIT=20||=0A-=09=09=20=20len=20%=20SCM_LONG_BIT)=0A-=09=09return=20= SCM_BOOL_F;=0A-=09=20=20=20=20}=0A+=09=20=20if=20(scm_is_bitvector=20= (SCM_I_ARRAY_V=20(ra))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20&&=20= (len=20!=3D=20scm_c_bitvector_length=20(SCM_I_ARRAY_V=20(ra))=20||=0A+=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20SCM_I_ARRAY_BASE=20= (ra)=20%=20SCM_LONG_BIT=20||=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20len=20%=20SCM_LONG_BIT))=0A+=20=20=20=20=20=20=20=20=20=20=20= =20return=20SCM_BOOL_F;=0A=20=09}=0A=20=0A=20=20=20=20=20=20=20v=20=3D=20= SCM_I_ARRAY_V=20(ra);=0A@@=20-607,8=20+551,10=20@@=20SCM_DEFINE=20= (scm_array_contents,=20"array-contents",=201,=201,=200,=0A=20=20=20=20=20= =20=20=20=20=20=20return=20sra;=0A=20=20=20=20=20=20=20=20=20}=0A=20=20=20= =20=20}=0A-=20=20else=0A+=20=20else=20if=20(scm_is_array=20(ra))=0A=20=20= =20=20=20return=20ra;=0A+=20=20else=0A+=20=20=20=20= scm_wrong_type_arg_msg=20(NULL,=200,=20ra,=20"array");=0A=20}=0A=20= #undef=20FUNC_NAME=0A=20=0Adiff=20--git=20a/libguile/arrays.h=20= b/libguile/arrays.h=0Aindex=205f40597..4baa51e=20100644=0A---=20= a/libguile/arrays.h=0A+++=20b/libguile/arrays.h=0A@@=20-37,8=20+37,6=20= @@=0A=20/**=20Arrays=20*/=0A=20=0A=20SCM_API=20SCM=20scm_make_array=20= (SCM=20fill,=20SCM=20bounds);=0A-SCM_API=20SCM=20= scm_from_contiguous_array=20(SCM=20bounds,=20const=20SCM=20*elts,=0A-=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20size_t=20len);=0A=20SCM_API=20SCM=20= scm_make_typed_array=20(SCM=20type,=20SCM=20fill,=20SCM=20bounds);=0A=20= SCM_API=20SCM=20scm_from_contiguous_typed_array=20(SCM=20type,=20SCM=20= bounds,=0A=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= const=20void=20*bytes,=0A@@=20-54,7=20+52,7=20@@=20SCM_API=20SCM=20= scm_list_to_typed_array=20(SCM=20type,=20SCM=20ndim,=20SCM=20lst);=0A=20=0A= =20/*=20internal.=20*/=0A=20=0A-#define=20SCM_I_ARRAY_FLAG_CONTIGUOUS=20= (1=20<<=200)=0A+#define=20SCM_I_ARRAY_FLAG_CONTIGUOUS=20(1=20<<=200)=20=20= /*=20currently=20unused=20*/=0A=20=0A=20#define=20SCM_I_ARRAYP(a)=09=20=20= =20=20SCM_TYP16_PREDICATE=20(scm_tc7_array,=20a)=0A=20#define=20= SCM_I_ARRAY_NDIM(x)=20=20((size_t)=20(SCM_CELL_WORD_0=20(x)>>17))=0Adiff=20= --git=20a/test-suite/tests/arrays.test=20b/test-suite/tests/arrays.test=0A= index=2020cb78b..6f37196=20100644=0A---=20a/test-suite/tests/arrays.test=0A= +++=20b/test-suite/tests/arrays.test=0A@@=20-294,6=20+294,12=20@@=0A=20=0A= =20(with-test-prefix/c&e=20"array-contents"=0A=20=0A+=20=20(pass-if=20= "0-rank=20array"=0A+=20=20=20=20(let=20((a=20(make-vector=201=2077)))=0A= +=20=20=20=20=20=20(and=0A+=20=20=20=20=20=20=20(eq?=20a=20= (array-contents=20(make-shared-array=20a=20(const=20'(0)))))=0A+=20=20=20= =20=20=20=20(eq?=20a=20(array-contents=20(make-shared-array=20a=20(const=20= '(0)))=20#t)))))=0A+=0A=20=20=20(pass-if=20"simple=20vector"=0A=20=20=20=20= =20(let*=20((a=20(make-array=200=204)))=0A=20=20=20=20=20=20=20(eq?=20a=20= (array-contents=20a))))=0A--=20=0A2.7.3=0A=0A= --Apple-Mail=_C05A2854-9EDB-476D-AE5C-EF5B1F5E02F5 Content-Disposition: attachment; filename=0003-Avoid-unneeded-internal-use-of-array-handles.patch Content-Type: application/octet-stream; name="0003-Avoid-unneeded-internal-use-of-array-handles.patch" Content-Transfer-Encoding: quoted-printable =46rom=202d00cf1571d4f82f5945df266732b6046858a849=20Mon=20Sep=2017=20= 00:00:00=202001=0AFrom:=20Daniel=20Llorens=20=0A= Date:=20Mon,=209=20Feb=202015=2012:11:52=20+0100=0ASubject:=20[PATCH=20= 03/11]=20Avoid=20unneeded=20internal=20use=20of=20array=20handles=0A=0A*=20= libguile/arrays.c=20(scm_shared_array_root):=20Adopt=20uniform=20check=20= order.=0A=0A=20=20(scm_shared_array_offset,=20= scm_shared_array_increments):=20Use=20the=20array=0A=20=20fields=20= directly=20just=20as=20scm_shared_array_root=20does.=0A=0A=20=20= (scm_c_array_rank):=20Moved=20from=20libguile/generalized-arrays.c.=20= Don't=0A=20=20use=20array=20handles,=20but=20follow=20the=20same=20type=20= check=20sequence=20as=20the=0A=20=20other=20array=20functions=20= (shared-array-root,=20etc).=0A=0A=20=20(scm_array_rank):=20Moved=20from=20= libguile/generalized-arrays.h.=0A=0A*=20libguile/arrays.h:=20Move=20= prototypes=20here.=0A=0A*=20test-suite/tests/arrays.test:=20Tests=20for=20= shared-array-offset,=0A=20=20shared-array-increments.=0A---=0A=20= libguile/arrays.c=20=20=20=20=20=20=20=20=20=20=20=20=20|=2065=20= +++++++++++++++++++++++-------------=0A=20libguile/arrays.h=20=20=20=20=20= =20=20=20=20=20=20=20=20|=20=203=20++=0A=20libguile/generalized-arrays.c=20= |=2021=20------------=0A=20libguile/generalized-arrays.h=20|=20=203=20--=0A= =20test-suite/tests/arrays.test=20=20|=2076=20= +++++++++++++++++++++++++++++++++++--------=0A=205=20files=20changed,=20= 109=20insertions(+),=2059=20deletions(-)=0A=0Adiff=20--git=20= a/libguile/arrays.c=20b/libguile/arrays.c=0Aindex=203cb547f..fb522e1=20= 100644=0A---=20a/libguile/arrays.c=0A+++=20b/libguile/arrays.c=0A@@=20= -64,6=20+64,27=20@@=0A=20=20=20(SCM_SET_CELL_WORD_0=20((x),=20= SCM_CELL_WORD_0=20(x)=20&=20~(SCM_I_ARRAY_FLAG_CONTIGUOUS=20<<=2016)))=0A= =20=0A=20=0A+size_t=0A+scm_c_array_rank=20(SCM=20array)=0A+{=0A+=20=20if=20= (SCM_I_ARRAYP=20(array))=0A+=20=20=20=20return=20SCM_I_ARRAY_NDIM=20= (array);=0A+=20=20else=20if=20(scm_is_array=20(array))=0A+=20=20=20=20= return=201;=0A+=20=20else=0A+=20=20=20=20scm_wrong_type_arg_msg=20= ("array-rank",=20SCM_ARG1,=20array,=20"array");=0A+}=0A+=0A+SCM_DEFINE=20= (scm_array_rank,=20"array-rank",=201,=200,=200,=0A+=20=20=20=20=20=20=20=20= =20=20=20(SCM=20array),=0A+=09=20=20=20=20"Return=20the=20number=20of=20= dimensions=20of=20the=20array=20@var{array.}\n")=0A+#define=20FUNC_NAME=20= s_scm_array_rank=0A+{=0A+=20=20return=20scm_from_size_t=20= (scm_c_array_rank=20(array));=0A+}=0A+#undef=20FUNC_NAME=0A+=0A+=0A=20= SCM_DEFINE=20(scm_shared_array_root,=20"shared-array-root",=201,=200,=20= 0,=0A=20=20=20=20=20=20=20=20=20=20=20=20(SCM=20ra),=0A=20=09=20=20=20=20= "Return=20the=20root=20vector=20of=20a=20shared=20array.")=0A@@=20-71,10=20= +92,10=20@@=20SCM_DEFINE=20(scm_shared_array_root,=20= "shared-array-root",=201,=200,=200,=0A=20{=0A=20=20=20if=20(SCM_I_ARRAYP=20= (ra))=0A=20=20=20=20=20return=20SCM_I_ARRAY_V=20(ra);=0A-=20=20else=20if=20= (!scm_is_array=20(ra))=0A-=20=20=20=20scm_wrong_type_arg_msg=20= (FUNC_NAME,=20SCM_ARG1,=20ra,=20"array");=0A-=20=20else=0A+=20=20else=20= if=20(scm_is_array=20(ra))=0A=20=20=20=20=20return=20ra;=0A+=20=20else=0A= +=20=20=20=20scm_wrong_type_arg_msg=20(FUNC_NAME,=20SCM_ARG1,=20ra,=20= "array");=0A=20}=0A=20#undef=20FUNC_NAME=0A=20=0A@@=20-84,13=20+105,12=20= @@=20SCM_DEFINE=20(scm_shared_array_offset,=20"shared-array-offset",=20= 1,=200,=200,=0A=20=09=20=20=20=20"Return=20the=20root=20vector=20index=20= of=20the=20first=20element=20in=20the=20array.")=0A=20#define=20= FUNC_NAME=20s_scm_shared_array_offset=0A=20{=0A-=20=20scm_t_array_handle=20= handle;=0A-=20=20SCM=20res;=0A-=0A-=20=20scm_array_get_handle=20(ra,=20= &handle);=0A-=20=20res=20=3D=20scm_from_size_t=20(handle.base);=0A-=20=20= scm_array_handle_release=20(&handle);=0A-=20=20return=20res;=0A+=20=20if=20= (SCM_I_ARRAYP=20(ra))=0A+=20=20=20=20return=20scm_from_size_t=20= (SCM_I_ARRAY_BASE=20(ra));=0A+=20=20else=20if=20(scm_is_array=20(ra))=0A= +=20=20=20=20return=20scm_from_size_t=20(0);=0A+=20=20else=0A+=20=20=20=20= scm_wrong_type_arg_msg=20(FUNC_NAME,=20SCM_ARG1,=20ra,=20"array");=0A=20= }=0A=20#undef=20FUNC_NAME=0A=20=0A@@=20-100,18=20+120,19=20@@=20= SCM_DEFINE=20(scm_shared_array_increments,=20"shared-array-increments",=20= 1,=200,=200,=0A=20=09=20=20=20=20"For=20each=20dimension,=20return=20the=20= distance=20between=20elements=20in=20the=20root=20vector.")=0A=20#define=20= FUNC_NAME=20s_scm_shared_array_increments=0A=20{=0A-=20=20= scm_t_array_handle=20handle;=0A-=20=20SCM=20res=20=3D=20SCM_EOL;=0A-=20=20= size_t=20k;=0A-=20=20scm_t_array_dim=20*s;=0A-=0A-=20=20= scm_array_get_handle=20(ra,=20&handle);=0A-=20=20k=20=3D=20= scm_array_handle_rank=20(&handle);=0A-=20=20s=20=3D=20= scm_array_handle_dims=20(&handle);=0A-=20=20while=20(k--)=0A-=20=20=20=20= res=20=3D=20scm_cons=20(scm_from_ssize_t=20(s[k].inc),=20res);=0A-=20=20= scm_array_handle_release=20(&handle);=0A-=20=20return=20res;=0A+=20=20if=20= (SCM_I_ARRAYP=20(ra))=0A+=20=20=20=20{=0A+=20=20=20=20=20=20size_t=20k=20= =3D=20SCM_I_ARRAY_NDIM=20(ra);=0A+=20=20=20=20=20=20SCM=20res=20=3D=20= SCM_EOL;=0A+=20=20=20=20=20=20scm_t_array_dim=20*dims=20=3D=20= SCM_I_ARRAY_DIMS=20(ra);=0A+=20=20=20=20=20=20while=20(k--)=0A+=20=20=20=20= =20=20=20=20res=20=3D=20scm_cons=20(scm_from_ssize_t=20(dims[k].inc),=20= res);=0A+=20=20=20=20=20=20return=20res;=0A+=20=20=20=20}=0A+=20=20else=20= if=20(scm_is_array=20(ra))=0A+=20=20=20=20return=20scm_list_1=20= (scm_from_ssize_t=20(1));=0A+=20=20else=0A+=20=20=20=20= scm_wrong_type_arg_msg=20(FUNC_NAME,=20SCM_ARG1,=20ra,=20"array");=0A=20= }=0A=20#undef=20FUNC_NAME=0A=20=0Adiff=20--git=20a/libguile/arrays.h=20= b/libguile/arrays.h=0Aindex=204baa51e..d3e409f=20100644=0A---=20= a/libguile/arrays.h=0A+++=20b/libguile/arrays.h=0A@@=20-50,6=20+50,9=20= @@=20SCM_API=20SCM=20scm_array_contents=20(SCM=20ra,=20SCM=20strict);=0A=20= SCM_API=20SCM=20scm_list_to_array=20(SCM=20ndim,=20SCM=20lst);=0A=20= SCM_API=20SCM=20scm_list_to_typed_array=20(SCM=20type,=20SCM=20ndim,=20= SCM=20lst);=0A=20=0A+SCM_API=20size_t=20scm_c_array_rank=20(SCM=20ra);=0A= +SCM_API=20SCM=20scm_array_rank=20(SCM=20ra);=0A+=0A=20/*=20internal.=20= */=0A=20=0A=20#define=20SCM_I_ARRAY_FLAG_CONTIGUOUS=20(1=20<<=200)=20=20= /*=20currently=20unused=20*/=0Adiff=20--git=20= a/libguile/generalized-arrays.c=20b/libguile/generalized-arrays.c=0A= index=209a001eb..fdbdb4a=20100644=0A---=20= a/libguile/generalized-arrays.c=0A+++=20b/libguile/generalized-arrays.c=0A= @@=20-104,27=20+104,6=20@@=20SCM_DEFINE=20(scm_typed_array_p,=20= "typed-array?",=202,=200,=200,=0A=20}=0A=20#undef=20FUNC_NAME=0A=20=0A= -size_t=0A-scm_c_array_rank=20(SCM=20array)=0A-{=0A-=20=20= scm_t_array_handle=20handle;=0A-=20=20size_t=20res;=0A-=0A-=20=20= scm_array_get_handle=20(array,=20&handle);=0A-=20=20res=20=3D=20= scm_array_handle_rank=20(&handle);=0A-=20=20scm_array_handle_release=20= (&handle);=0A-=20=20return=20res;=0A-}=0A-=0A-SCM_DEFINE=20= (scm_array_rank,=20"array-rank",=201,=200,=200,=20=0A-=20=20=20=20=20=20=20= =20=20=20=20(SCM=20array),=0A-=09=20=20=20=20"Return=20the=20number=20of=20= dimensions=20of=20the=20array=20@var{array.}\n")=0A-#define=20FUNC_NAME=20= s_scm_array_rank=0A-{=0A-=20=20return=20scm_from_size_t=20= (scm_c_array_rank=20(array));=0A-}=0A-#undef=20FUNC_NAME=0A-=0A=20=0A=20= size_t=0A=20scm_c_array_length=20(SCM=20array)=0Adiff=20--git=20= a/libguile/generalized-arrays.h=20b/libguile/generalized-arrays.h=0A= index=20dfdb8bd..cfa6905=20100644=0A---=20= a/libguile/generalized-arrays.h=0A+++=20b/libguile/generalized-arrays.h=0A= @@=20-41,9=20+41,6=20@@=20SCM_INTERNAL=20SCM=20scm_array_p_2=20(SCM);=0A=20= SCM_API=20int=20scm_is_typed_array=20(SCM=20obj,=20SCM=20type);=0A=20= SCM_API=20SCM=20scm_typed_array_p=20(SCM=20v,=20SCM=20type);=0A=20=0A= -SCM_API=20size_t=20scm_c_array_rank=20(SCM=20ra);=0A-SCM_API=20SCM=20= scm_array_rank=20(SCM=20ra);=0A-=0A=20SCM_API=20size_t=20= scm_c_array_length=20(SCM=20ra);=0A=20SCM_API=20SCM=20scm_array_length=20= (SCM=20ra);=0A=20=0Adiff=20--git=20a/test-suite/tests/arrays.test=20= b/test-suite/tests/arrays.test=0Aindex=206f37196..c40457b=20100644=0A---=20= a/test-suite/tests/arrays.test=0A+++=20b/test-suite/tests/arrays.test=0A= @@=20-23,9=20+23,13=20@@=0A=20=20=20#:use-module=20(srfi=20srfi-4)=0A=20=20= =20#:use-module=20(srfi=20srfi-4=20gnu))=0A=20=0A-;;;=0A-;;;=20array?=0A= -;;;=0A+(define=20(array-row=20a=20i)=0A+=20=20(make-shared-array=20a=20= (lambda=20(j)=20(list=20i=20j))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20(cadr=20(array-dimensions=20a))))=0A+=0A+(define=20= (array-col=20a=20j)=0A+=20=20(make-shared-array=20a=20(lambda=20(i)=20= (list=20i=20j))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20(car=20(array-dimensions=20a))))=0A=20=0A=20(define=20= exception:wrong-num-indices=0A=20=20=20(cons=20'misc-error=20"^wrong=20= number=20of=20indices.*"))=0A@@=20-33,6=20+37,15=20@@=0A=20(define=20= exception:length-non-negative=0A=20=20=20(cons=20'read-error=20".*array=20= length=20must=20be=20non-negative.*"))=0A=20=0A+(define=20= exception:wrong-type-arg=0A+=20=20(cons=20#t=20"Wrong=20type"))=0A+=0A= +(define=20exception:mapping-out-of-range=0A+=20=20(cons=20'misc-error=20= "^mapping=20out=20of=20range"))=20=20;;=20per=20scm_make_shared_array=0A= +=0A+;;;=0A+;;;=20array?=0A+;;;=0A=20=0A=20(with-test-prefix=20"array?"=0A= =20=0A@@=20-216,9=20+229,6=20@@=0A=20;;;=20make-shared-array=0A=20;;;=0A=20= =0A-(define=20exception:mapping-out-of-range=0A-=20=20(cons=20= 'misc-error=20"^mapping=20out=20of=20range"))=20=20;;=20per=20= scm_make_shared_array=0A-=0A=20(with-test-prefix/c&e=20= "make-shared-array"=0A=20=0A=20=20=20;;=20this=20failed=20in=20guile=20= 1.8.0=0A@@=20-404,13=20+414,57=20@@=0A=20=20=20=20=20=20=20(eq?=20= (shared-array-root=20a)=20(shared-array-root=20b)=20(array-contents=20= a)))))=0A=20=0A=20;;;=0A+;;;=20shared-array-offset=0A+;;;=0A+=0A= +(with-test-prefix/c&e=20"shared-array-offset"=0A+=0A+=20=20(pass-if=20= "plain=20vector"=0A+=20=20=20=20(zero?=20(shared-array-offset=20= (make-vector=204=200))))=0A+=0A+=20=20(pass-if=20"plain=20array=20rank=20= 2"=0A+=20=20=20=20(zero?=20(shared-array-offset=20(make-array=200=204=20= 4))))=0A+=0A+=20=20(pass-if=20"row=20of=20rank-2=20array,=20I"=0A+=20=20=20= =20(=3D=200=20(shared-array-offset=20(array-row=20(make-array=200=205=20= 3)=200))))=0A+=0A+=20=20(pass-if=20"row=20of=20rank-2=20array,=20II"=0A+=20= =20=20=20(=3D=204=20(shared-array-offset=20(array-row=20(make-array=200=20= 6=204)=201))))=0A+=0A+=20=20(pass-if=20"col=20of=20rank-2=20array,=20I"=0A= +=20=20=20=20(=3D=200=20(shared-array-offset=20(array-col=20(make-array=20= 0=205=203)=200))))=0A+=0A+=20=20(pass-if=20"col=20of=20rank-2=20array,=20= II"=0A+=20=20=20=20(=3D=201=20(shared-array-offset=20(array-col=20= (make-array=200=206=204)=201)))))=0A+=0A+=0A+;;;=0A+;;;=20= shared-array-increments=0A+;;;=0A+=0A+(with-test-prefix/c&e=20= "shared-array-increments"=0A+=0A+=20=20(pass-if=20"plain=20vector"=0A+=20= =20=20=20(equal?=20'(1)=20(shared-array-increments=20(make-vector=204=20= 0))))=0A+=0A+=20=20(pass-if=20"plain=20array=20rank=202"=0A+=20=20=20=20= (equal?=20'(4=201)=20(shared-array-increments=20(make-array=200=203=20= 4))))=0A+=0A+=20=20(pass-if=20"plain=20array=20rank=203"=0A+=20=20=20=20= (equal?=20'(20=205=201)=20(shared-array-increments=20(make-array=200=203=20= 4=205))))=0A+=0A+=20=20(pass-if=20"row=20of=20rank-2=20array"=0A+=20=20=20= =20(equal?=20'(1)=20(shared-array-increments=20(array-row=20(make-array=20= 0=205=203)=200))))=0A+=0A+=20=20(pass-if=20"col=20of=20rank-2=20array"=0A= +=20=20=20=20(equal?=20'(3)=20(shared-array-increments=20(array-col=20= (make-array=200=205=203)=200)))))=0A+=0A+=0A+;;;=0A=20;;;=20= transpose-array=0A=20;;;=0A=20=0A=20;=20see=20strings.test.=0A-(define=20= exception:wrong-type-arg=0A-=20=20(cons=20#t=20"Wrong=20type"))=0A-=0A=20= (with-test-prefix/c&e=20"transpose-array"=0A=20=0A=20=20=20= (pass-if-exception=20"non=20array=20argument"=20exception:wrong-type-arg=0A= @@=20-821,10=20+875,6=20@@=0A=20;;;=20slices=20as=20generalized=20= vectors=0A=20;;;=0A=20=0A-(define=20(array-row=20a=20i)=0A-=20=20= (make-shared-array=20a=20(lambda=20(j)=20(list=20i=20j))=0A-=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(cadr=20= (array-dimensions=20a))))=0A-=0A=20(with-test-prefix/c&e=20"generalized=20= vector=20slices"=0A=20=20=20(pass-if=20(equal?=20(array-row=20#2u32((0=20= 1)=20(2=203))=201)=0A=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20#u32(2=203)))=0A--=20=0A2.7.3=0A=0A= --Apple-Mail=_C05A2854-9EDB-476D-AE5C-EF5B1F5E02F5 Content-Disposition: attachment; filename=0004-Reuse-SCM_BYTEVECTOR_TYPED_LENGTH-in-scm_array_get_h.patch Content-Type: application/octet-stream; name="0004-Reuse-SCM_BYTEVECTOR_TYPED_LENGTH-in-scm_array_get_h.patch" Content-Transfer-Encoding: quoted-printable =46rom=20a2583cc04f034df90a804740d178ab92ff6a0c02=20Mon=20Sep=2017=20= 00:00:00=202001=0AFrom:=20Daniel=20Llorens=20=0A= Date:=20Wed,=2011=20Feb=202015=2012:58:01=20+0100=0ASubject:=20[PATCH=20= 04/11]=20Reuse=20SCM_BYTEVECTOR_TYPED_LENGTH=20in=0A=20= scm_array_get_handle=0A=0A*=20libguile/bytevectors.h=20= (SCM_BYTEVECTOR_TYPE_SIZE,=0A=20=20SCM_BYTEVECTOR_TYPED_LENGTH):=20Moved=20= from=20libguile/bytevectors.c.=0A=0A*=20libguile/array-handle.c=20= (scm_array_get_handle):=20Reuse=0A=20=20SCM_BYTEVECTOR_TYPED_LENGTH.=0A= ---=0A=20libguile/array-handle.c=20|=206=20++----=0A=20= libguile/bytevectors.c=20=20|=205=20-----=0A=20libguile/bytevectors.h=20=20= |=205=20+++++=0A=203=20files=20changed,=207=20insertions(+),=209=20= deletions(-)=0A=0Adiff=20--git=20a/libguile/array-handle.c=20= b/libguile/array-handle.c=0Aindex=202252ecc..3595266=20100644=0A---=20= a/libguile/array-handle.c=0A+++=20b/libguile/array-handle.c=0A@@=20= -185,15=20+185,13=20@@=20scm_array_get_handle=20(SCM=20array,=20= scm_t_array_handle=20*h)=0A=20=20=20=20=20=20=20break;=0A=20=20=20=20=20= case=20scm_tc7_bytevector:=0A=20=20=20=20=20=20=20{=0A-=20=20=20=20=20=20= =20=20size_t=20byte_length,=20length,=20element_byte_size;=0A+=20=20=20=20= =20=20=20=20size_t=20length;=0A=20=20=20=20=20=20=20=20=20= scm_t_array_element_type=20element_type;=0A=20=20=20=20=20=20=20=20=20= scm_t_vector_ref=20vref;=0A=20=20=20=20=20=20=20=20=20scm_t_vector_set=20= vset;=0A=20=0A-=20=20=20=20=20=20=20=20byte_length=20=3D=20= scm_c_bytevector_length=20(array);=0A=20=20=20=20=20=20=20=20=20= element_type=20=3D=20SCM_BYTEVECTOR_ELEMENT_TYPE=20(array);=0A-=20=20=20=20= =20=20=20=20element_byte_size=20=3D=20= scm_i_array_element_type_sizes[element_type]=20/=208;=0A-=20=20=20=20=20=20= =20=20length=20=3D=20byte_length=20/=20element_byte_size;=0A+=20=20=20=20= =20=20=20=20length=20=3D=20SCM_BYTEVECTOR_TYPED_LENGTH=20(array);=0A=20=0A= =20=20=20=20=20=20=20=20=20switch=20(element_type)=0A=20=20=20=20=20=20=20= =20=20=20=20{=0Adiff=20--git=20a/libguile/bytevectors.c=20= b/libguile/bytevectors.c=0Aindex=20e426ae3..cf247dc=20100644=0A---=20= a/libguile/bytevectors.c=0A+++=20b/libguile/bytevectors.c=0A@@=20-192,11=20= +192,6=20@@=0A=20#define=20SCM_BYTEVECTOR_SET_PARENT(_bv,=20_parent)=09\=0A= =20=20=20SCM_SET_CELL_OBJECT_3=20((_bv),=20(_parent))=0A=20=0A-#define=20= SCM_BYTEVECTOR_TYPE_SIZE(var)=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20\=0A-=20=20= (scm_i_array_element_type_sizes[SCM_BYTEVECTOR_ELEMENT_TYPE=20(var)]/8)=0A= -#define=20SCM_BYTEVECTOR_TYPED_LENGTH(var)=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20\=0A-=20=20= (SCM_BYTEVECTOR_LENGTH=20(var)=20/=20SCM_BYTEVECTOR_TYPE_SIZE=20(var))=0A= -=0A=20/*=20The=20empty=20bytevector.=20=20*/=0A=20SCM=20= scm_null_bytevector=20=3D=20SCM_UNSPECIFIED;=0A=20=0Adiff=20--git=20= a/libguile/bytevectors.h=20b/libguile/bytevectors.h=0Aindex=20= a5eeaea..af4ac1c=20100644=0A---=20a/libguile/bytevectors.h=0A+++=20= b/libguile/bytevectors.h=0A@@=20-129,6=20+129,11=20@@=20SCM_API=20SCM=20= scm_utf32_to_string=20(SCM,=20SCM);=0A=20#define=20= SCM_BYTEVECTOR_CONTIGUOUS_P(_bv)=09\=0A=20=20=20(SCM_BYTEVECTOR_FLAGS=20= (_bv)=20>>=208UL)=0A=20=0A+#define=20SCM_BYTEVECTOR_TYPE_SIZE(var)=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= \=0A+=20=20(scm_i_array_element_type_sizes[SCM_BYTEVECTOR_ELEMENT_TYPE=20= (var)]/8)=0A+#define=20SCM_BYTEVECTOR_TYPED_LENGTH(var)=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20\=0A+=20=20= (SCM_BYTEVECTOR_LENGTH=20(var)=20/=20SCM_BYTEVECTOR_TYPE_SIZE=20(var))=0A= +=0A=20/*=20Hint=20that=20is=20passed=20to=20`scm_gc_malloc=20()'=20and=20= friends.=20=20*/=0A=20#define=20SCM_GC_BYTEVECTOR=20"bytevector"=0A=20=0A= --=20=0A2.7.3=0A=0A= --Apple-Mail=_C05A2854-9EDB-476D-AE5C-EF5B1F5E02F5 Content-Disposition: attachment; filename=0005-Remove-deprecated-array-functions.patch Content-Type: application/octet-stream; name="0005-Remove-deprecated-array-functions.patch" Content-Transfer-Encoding: quoted-printable =46rom=203248c26c6891cbcdc2cc89015d0afb9942b1383d=20Mon=20Sep=2017=20= 00:00:00=202001=0AFrom:=20Daniel=20Llorens=20=0A= Date:=20Fri,=2013=20Feb=202015=2016:45:21=20+0100=0ASubject:=20[PATCH=20= 05/11]=20Remove=20deprecated=20array=20functions=0A=0A*=20= libguile/array-map.c=20(scm_array_fill_int,=20scm_array_fill_int,=0A=20=20= =20=20scm_ra_eqp,=20scm_ra_lessp=20scm_ra_leqp,=20scm_ra_grp,=20= scm_ra_greqp,=0A=20=20=20=20scm_ra_sum,=20scm_ra_difference,=20= scm_ra_product,=20scm_ra_divide,=0A=20=20=20=20scm_array_identity):=20= Remove=20deprecated=20functions.=0A=0A*=20libguile/array-map.h:=20Remove=20= declaration=20of=20deprecated=20functions.=0A=0A*=20= libguile/generalized-vectors.h,=20libguile/generalized-vectors.c=0A=20=20= (scm_is_generalized_vector,=20scm_c_generalized_vector_length,=0A=20=20= scm_c_generalized_vector_ref,=20scm_c_generalized_vector_set_x):=20These=0A= =20=20functions=20were=20deprecated=20in=202.0.9.=20Remove.=0A=0A*=20= doc/ref/api-compound.texi:=20Remove=20uniform-array-read!,=0A=20=20= uniform-array-write=20from=20the=20manual.=20These=20procedures=20where=20= removed=20in=0A=20=20fc7bd367ab4b5027a7f80686b1e229c62e43c90b=20= (2011-05-12).=0A---=0A=20doc/ref/api-compound.texi=20=20=20=20=20=20|=20=20= 33=20------=0A=20libguile/array-map.c=20=20=20=20=20=20=20=20=20=20=20|=20= 261=20-----------------------------------------=0A=20= libguile/array-map.h=20=20=20=20=20=20=20=20=20=20=20|=20=2016=20---=0A=20= libguile/generalized-vectors.c=20|=20=2031=20-----=0A=20= libguile/generalized-vectors.h=20|=20=20=204=20-=0A=205=20files=20= changed,=20345=20deletions(-)=0A=0Adiff=20--git=20= a/doc/ref/api-compound.texi=20b/doc/ref/api-compound.texi=0Aindex=20= b4ae79c..cc9eef4=20100644=0A---=20a/doc/ref/api-compound.texi=0A+++=20= b/doc/ref/api-compound.texi=0A@@=20-1568,39=20+1568,6=20@@=20= $\left(\matrix{%=0A=20@end=20example=0A=20@end=20deffn=0A=20=0A-@deffn=20= {Scheme=20Procedure}=20uniform-array-read!=20ra=20[port_or_fd=20[start=20= [end]]]=0A-@deffnx=20{C=20Function}=20scm_uniform_array_read_x=20(ra,=20= port_or_fd,=20start,=20end)=0A-Attempt=20to=20read=20all=20elements=20of=20= array=20@var{ra},=20in=20lexicographic=20order,=20as=0A-binary=20objects=20= from=20@var{port_or_fd}.=0A-If=20an=20end=20of=20file=20is=20= encountered,=0A-the=20objects=20up=20to=20that=20point=20are=20put=20= into=20@var{ra}=0A-(starting=20at=20the=20beginning)=20and=20the=20= remainder=20of=20the=20array=20is=0A-unchanged.=0A-=0A-The=20optional=20= arguments=20@var{start}=20and=20@var{end}=20allow=0A-a=20specified=20= region=20of=20a=20vector=20(or=20linearized=20array)=20to=20be=20read,=0A= -leaving=20the=20remainder=20of=20the=20vector=20unchanged.=0A-=0A= -@code{uniform-array-read!}=20returns=20the=20number=20of=20objects=20= read.=0A-@var{port_or_fd}=20may=20be=20omitted,=20in=20which=20case=20it=20= defaults=20to=20the=20value=0A-returned=20by=20= @code{(current-input-port)}.=0A-@end=20deffn=0A-=0A-@deffn=20{Scheme=20= Procedure}=20uniform-array-write=20ra=20[port_or_fd=20[start=20[end]]]=0A= -@deffnx=20{C=20Function}=20scm_uniform_array_write=20(ra,=20port_or_fd,=20= start,=20end)=0A-Writes=20all=20elements=20of=20@var{ra}=20as=20binary=20= objects=20to=0A-@var{port_or_fd}.=0A-=0A-The=20optional=20arguments=20= @var{start}=0A-and=20@var{end}=20allow=0A-a=20specified=20region=20of=20= a=20vector=20(or=20linearized=20array)=20to=20be=20written.=0A-=0A-The=20= number=20of=20objects=20actually=20written=20is=20returned.=0A= -@var{port_or_fd}=20may=20be=0A-omitted,=20in=20which=20case=20it=20= defaults=20to=20the=20value=20returned=20by=0A= -@code{(current-output-port)}.=0A-@end=20deffn=0A-=0A=20@node=20Shared=20= Arrays=0A=20@subsubsection=20Shared=20Arrays=0A=20=0Adiff=20--git=20= a/libguile/array-map.c=20b/libguile/array-map.c=0Aindex=20= 938f0a7..587df02=20100644=0A---=20a/libguile/array-map.c=0A+++=20= b/libguile/array-map.c=0A@@=20-307,267=20+307,6=20@@=20SCM_DEFINE=20= (scm_array_copy_x,=20"array-copy!",=202,=200,=200,=0A=20#undef=20= FUNC_NAME=0A=20=0A=20=0A-#if=20SCM_ENABLE_DEPRECATED=20=3D=3D=201=0A-=0A= -/*=20to=20be=20used=20as=20cproc=20in=20scm_ramapc=20to=20fill=20an=20= array=20dimension=20with=0A-=20=20=20"fill".=20*/=0A-int=0A= -scm_array_fill_int=20(SCM=20ra,=20SCM=20fill,=20SCM=20ignore=20= SCM_UNUSED)=0A-{=0A-=20=20unsigned=20long=20i;=0A-=20=20unsigned=20long=20= n=20=3D=20SCM_I_ARRAY_DIMS=20(ra)->ubnd=20-=20SCM_I_ARRAY_DIMS=20= (ra)->lbnd=20+=201;=0A-=20=20long=20inc=20=3D=20SCM_I_ARRAY_DIMS=20= (ra)->inc;=0A-=20=20unsigned=20long=20base=20=3D=20SCM_I_ARRAY_BASE=20= (ra);=0A-=0A-=20=20ra=20=3D=20SCM_I_ARRAY_V=20(ra);=0A-=0A-=20=20for=20= (i=20=3D=20base;=20n--;=20i=20+=3D=20inc)=0A-=20=20=20=20ASET=20(ra,=20= i,=20fill);=0A-=0A-=20=20return=201;=0A-}=0A-=0A-/*=20Functions=20= callable=20by=20ARRAY-MAP!=20*/=0A-=0A-int=0A-scm_ra_eqp=20(SCM=20ra0,=20= SCM=20ras)=0A-{=0A-=20=20SCM=20ra1=20=3D=20SCM_CAR=20(ras),=20ra2=20=3D=20= SCM_CAR=20(SCM_CDR=20(ras));=0A-=20=20scm_t_array_handle=20ra0_handle;=0A= -=20=20scm_t_array_dim=20*ra0_dims;=0A-=20=20size_t=20n;=0A-=20=20= ssize_t=20inc0;=0A-=20=20size_t=20i0=20=3D=200;=0A-=20=20unsigned=20long=20= i1=20=3D=20SCM_I_ARRAY_BASE=20(ra1),=20i2=20=3D=20SCM_I_ARRAY_BASE=20= (ra2);=0A-=20=20long=20inc1=20=3D=20SCM_I_ARRAY_DIMS=20(ra1)->inc;=0A-=20= =20long=20inc2=20=3D=20SCM_I_ARRAY_DIMS=20(ra1)->inc;=0A-=20=20ra1=20=3D=20= SCM_I_ARRAY_V=20(ra1);=0A-=20=20ra2=20=3D=20SCM_I_ARRAY_V=20(ra2);=0A-=0A= -=20=20scm_array_get_handle=20(ra0,=20&ra0_handle);=0A-=20=20ra0_dims=20= =3D=20scm_array_handle_dims=20(&ra0_handle);=0A-=20=20n=20=3D=20= ra0_dims[0].ubnd=20-=20ra0_dims[0].lbnd=20+=201;=0A-=20=20inc0=20=3D=20= ra0_dims[0].inc;=0A-=0A-=20=20{=0A-=20=20=20=20for=20(;=20n--=20>=200;=20= i0=20+=3D=20inc0,=20i1=20+=3D=20inc1,=20i2=20+=3D=20inc2)=0A-=20=20=20=20= =20=20if=20(scm_is_true=20(scm_array_handle_ref=20(&ra0_handle,=20i0)))=0A= -=09if=20(!scm_is_eq=20(AREF=20(ra1,=20i1),=20AREF=20(ra2,=20i2)))=0A-=09= =20=20scm_array_handle_set=20(&ra0_handle,=20i0,=20SCM_BOOL_F);=0A-=20=20= }=0A-=0A-=20=20scm_array_handle_release=20(&ra0_handle);=0A-=20=20return=20= 1;=0A-}=0A-=0A-/*=20opt=200=20means=20<,=20nonzero=20means=20>=3D=20*/=0A= -=0A-static=20int=0A-ra_compare=20(SCM=20ra0,=20SCM=20ra1,=20SCM=20ra2,=20= int=20opt)=0A-{=0A-=20=20scm_t_array_handle=20ra0_handle;=0A-=20=20= scm_t_array_dim=20*ra0_dims;=0A-=20=20size_t=20n;=0A-=20=20ssize_t=20= inc0;=0A-=20=20size_t=20i0=20=3D=200;=0A-=20=20unsigned=20long=20i1=20=3D=20= SCM_I_ARRAY_BASE=20(ra1),=20i2=20=3D=20SCM_I_ARRAY_BASE=20(ra2);=0A-=20=20= long=20inc1=20=3D=20SCM_I_ARRAY_DIMS=20(ra1)->inc;=0A-=20=20long=20inc2=20= =3D=20SCM_I_ARRAY_DIMS=20(ra1)->inc;=0A-=20=20ra1=20=3D=20SCM_I_ARRAY_V=20= (ra1);=0A-=20=20ra2=20=3D=20SCM_I_ARRAY_V=20(ra2);=0A-=0A-=20=20= scm_array_get_handle=20(ra0,=20&ra0_handle);=0A-=20=20ra0_dims=20=3D=20= scm_array_handle_dims=20(&ra0_handle);=0A-=20=20n=20=3D=20= ra0_dims[0].ubnd=20-=20ra0_dims[0].lbnd=20+=201;=0A-=20=20inc0=20=3D=20= ra0_dims[0].inc;=0A-=0A-=20=20{=0A-=20=20=20=20for=20(;=20n--=20>=200;=20= i0=20+=3D=20inc0,=20i1=20+=3D=20inc1,=20i2=20+=3D=20inc2)=0A-=20=20=20=20= =20=20if=20(scm_is_true=20(scm_array_handle_ref=20(&ra0_handle,=20i0)))=0A= -=09if=20(opt=20?=0A-=09=20=20=20=20scm_is_true=20(scm_less_p=20(AREF=20= (ra1,=20i1),=20AREF=20(ra2,=20i2)))=20:=0A-=09=20=20=20=20scm_is_false=20= (scm_less_p=20(AREF=20(ra1,=20i1),=20AREF=20(ra2,=20i2))))=0A-=09=20=20= scm_array_handle_set=20(&ra0_handle,=20i0,=20SCM_BOOL_F);=0A-=20=20}=0A-=0A= -=20=20scm_array_handle_release=20(&ra0_handle);=0A-=20=20return=201;=0A= -}=0A-=0A-=0A-=0A-int=0A-scm_ra_lessp=20(SCM=20ra0,=20SCM=20ras)=0A-{=0A= -=20=20return=20ra_compare=20(ra0,=20SCM_CAR=20(ras),=20SCM_CAR=20= (SCM_CDR=20(ras)),=200);=0A-}=0A-=0A-=0A-int=0A-scm_ra_leqp=20(SCM=20= ra0,=20SCM=20ras)=0A-{=0A-=20=20return=20ra_compare=20(ra0,=20SCM_CAR=20= (SCM_CDR=20(ras)),=20SCM_CAR=20(ras),=201);=0A-}=0A-=0A-=0A-int=0A= -scm_ra_grp=20(SCM=20ra0,=20SCM=20ras)=0A-{=0A-=20=20return=20ra_compare=20= (ra0,=20SCM_CAR=20(SCM_CDR=20(ras)),=20SCM_CAR=20(ras),=200);=0A-}=0A-=0A= -=0A-int=0A-scm_ra_greqp=20(SCM=20ra0,=20SCM=20ras)=0A-{=0A-=20=20return=20= ra_compare=20(ra0,=20SCM_CAR=20(ras),=20SCM_CAR=20(SCM_CDR=20(ras)),=20= 1);=0A-}=0A-=0A-=0A-int=0A-scm_ra_sum=20(SCM=20ra0,=20SCM=20ras)=0A-{=0A= -=20=20long=20n=20=3D=20SCM_I_ARRAY_DIMS=20(ra0)->ubnd=20-=20= SCM_I_ARRAY_DIMS=20(ra0)->lbnd=20+=201;=0A-=20=20unsigned=20long=20i0=20= =3D=20SCM_I_ARRAY_BASE=20(ra0);=0A-=20=20long=20inc0=20=3D=20= SCM_I_ARRAY_DIMS=20(ra0)->inc;=0A-=20=20ra0=20=3D=20SCM_I_ARRAY_V=20= (ra0);=0A-=20=20if=20(!scm_is_null(ras))=0A-=20=20=20=20{=0A-=20=20=20=20= =20=20SCM=20ra1=20=3D=20SCM_CAR=20(ras);=0A-=20=20=20=20=20=20unsigned=20= long=20i1=20=3D=20SCM_I_ARRAY_BASE=20(ra1);=0A-=20=20=20=20=20=20long=20= inc1=20=3D=20SCM_I_ARRAY_DIMS=20(ra1)->inc;=0A-=20=20=20=20=20=20ra1=20=3D= =20SCM_I_ARRAY_V=20(ra1);=0A-=20=20=20=20=20=20switch=20(SCM_TYP7=20= (ra0)=20=3D=3D=20SCM_TYP7=20(ra1)=20?=20SCM_TYP7=20(ra0)=20:=200)=0A-=09= {=0A-=09default:=0A-=09=20=20{=0A-=09=20=20=20=20for=20(;=20n--=20>=200;=20= i0=20+=3D=20inc0,=20i1=20+=3D=20inc1)=0A-=09=20=20=20=20=20=20ASET=20= (ra0,=20i0,=20scm_sum=20(AREF(ra0,=20i0),=20AREF(ra1,=20i1)));=0A-=09=20=20= =20=20break;=0A-=09=20=20}=0A-=09}=0A-=20=20=20=20}=0A-=20=20return=201;=0A= -}=0A-=0A-=0A-=0A-int=0A-scm_ra_difference=20(SCM=20ra0,=20SCM=20ras)=0A= -{=0A-=20=20long=20n=20=3D=20SCM_I_ARRAY_DIMS=20(ra0)->ubnd=20-=20= SCM_I_ARRAY_DIMS=20(ra0)->lbnd=20+=201;=0A-=20=20unsigned=20long=20i0=20= =3D=20SCM_I_ARRAY_BASE=20(ra0);=0A-=20=20long=20inc0=20=3D=20= SCM_I_ARRAY_DIMS=20(ra0)->inc;=0A-=20=20ra0=20=3D=20SCM_I_ARRAY_V=20= (ra0);=0A-=20=20if=20(scm_is_null=20(ras))=0A-=20=20=20=20{=0A-=20=20=20=20= =20=20switch=20(SCM_TYP7=20(ra0))=0A-=09{=0A-=09default:=0A-=09=20=20{=0A= -=09=20=20=20=20for=20(;=20n--=20>=200;=20i0=20+=3D=20inc0)=0A-=09=20=20=20= =20=20=20ASET=20(ra0,=20i0,=20scm_difference=20(AREF(ra0,=20i0),=20= SCM_UNDEFINED));=0A-=09=20=20=20=20break;=0A-=09=20=20}=0A-=09}=0A-=20=20= =20=20}=0A-=20=20else=0A-=20=20=20=20{=0A-=20=20=20=20=20=20SCM=20ra1=20= =3D=20SCM_CAR=20(ras);=0A-=20=20=20=20=20=20unsigned=20long=20i1=20=3D=20= SCM_I_ARRAY_BASE=20(ra1);=0A-=20=20=20=20=20=20long=20inc1=20=3D=20= SCM_I_ARRAY_DIMS=20(ra1)->inc;=0A-=20=20=20=20=20=20ra1=20=3D=20= SCM_I_ARRAY_V=20(ra1);=0A-=20=20=20=20=20=20switch=20(SCM_TYP7=20(ra0)=20= =3D=3D=20SCM_TYP7=20(ra1)=20?=20SCM_TYP7=20(ra0)=20:=200)=0A-=09{=0A-=09= default:=0A-=09=20=20{=0A-=09=20=20=20=20for=20(;=20n--=20>=200;=20i0=20= +=3D=20inc0,=20i1=20+=3D=20inc1)=0A-=09=20=20=20=20=20=20ASET=20(ra0,=20= i0,=20scm_difference=20(AREF=20(ra0,=20i0),=20AREF=20(ra1,=20i1)));=0A-=09= =20=20=20=20break;=0A-=09=20=20}=0A-=09}=0A-=20=20=20=20}=0A-=20=20= return=201;=0A-}=0A-=0A-=0A-=0A-int=0A-scm_ra_product=20(SCM=20ra0,=20= SCM=20ras)=0A-{=0A-=20=20long=20n=20=3D=20SCM_I_ARRAY_DIMS=20(ra0)->ubnd=20= -=20SCM_I_ARRAY_DIMS=20(ra0)->lbnd=20+=201;=0A-=20=20unsigned=20long=20= i0=20=3D=20SCM_I_ARRAY_BASE=20(ra0);=0A-=20=20long=20inc0=20=3D=20= SCM_I_ARRAY_DIMS=20(ra0)->inc;=0A-=20=20ra0=20=3D=20SCM_I_ARRAY_V=20= (ra0);=0A-=20=20if=20(!scm_is_null=20(ras))=0A-=20=20=20=20{=0A-=20=20=20= =20=20=20SCM=20ra1=20=3D=20SCM_CAR=20(ras);=0A-=20=20=20=20=20=20= unsigned=20long=20i1=20=3D=20SCM_I_ARRAY_BASE=20(ra1);=0A-=20=20=20=20=20= =20long=20inc1=20=3D=20SCM_I_ARRAY_DIMS=20(ra1)->inc;=0A-=20=20=20=20=20=20= ra1=20=3D=20SCM_I_ARRAY_V=20(ra1);=0A-=20=20=20=20=20=20switch=20= (SCM_TYP7=20(ra0)=20=3D=3D=20SCM_TYP7=20(ra1)=20?=20SCM_TYP7=20(ra0)=20:=20= 0)=0A-=09{=0A-=09default:=0A-=09=20=20{=0A-=09=20=20=20=20for=20(;=20n--=20= >=200;=20i0=20+=3D=20inc0,=20i1=20+=3D=20inc1)=0A-=09=20=20=20=20=20=20= ASET=20(ra0,=20i0,=20scm_product=20(AREF=20(ra0,=20i0),=20AREF=20(ra1,=20= i1)));=0A-=09=20=20}=0A-=09}=0A-=20=20=20=20}=0A-=20=20return=201;=0A-}=0A= -=0A-=0A-int=0A-scm_ra_divide=20(SCM=20ra0,=20SCM=20ras)=0A-{=0A-=20=20= long=20n=20=3D=20SCM_I_ARRAY_DIMS=20(ra0)->ubnd=20-=20SCM_I_ARRAY_DIMS=20= (ra0)->lbnd=20+=201;=0A-=20=20unsigned=20long=20i0=20=3D=20= SCM_I_ARRAY_BASE=20(ra0);=0A-=20=20long=20inc0=20=3D=20SCM_I_ARRAY_DIMS=20= (ra0)->inc;=0A-=20=20ra0=20=3D=20SCM_I_ARRAY_V=20(ra0);=0A-=20=20if=20= (scm_is_null=20(ras))=0A-=20=20=20=20{=0A-=20=20=20=20=20=20switch=20= (SCM_TYP7=20(ra0))=0A-=09{=0A-=09default:=0A-=09=20=20{=0A-=09=20=20=20=20= for=20(;=20n--=20>=200;=20i0=20+=3D=20inc0)=0A-=09=20=20=20=20=20=20ASET=20= (ra0,=20i0,=20scm_divide=20(AREF=20(ra0,=20i0),=20SCM_UNDEFINED));=0A-=09= =20=20=20=20break;=0A-=09=20=20}=0A-=09}=0A-=20=20=20=20}=0A-=20=20else=0A= -=20=20=20=20{=0A-=20=20=20=20=20=20SCM=20ra1=20=3D=20SCM_CAR=20(ras);=0A= -=20=20=20=20=20=20unsigned=20long=20i1=20=3D=20SCM_I_ARRAY_BASE=20= (ra1);=0A-=20=20=20=20=20=20long=20inc1=20=3D=20SCM_I_ARRAY_DIMS=20= (ra1)->inc;=0A-=20=20=20=20=20=20ra1=20=3D=20SCM_I_ARRAY_V=20(ra1);=0A-=20= =20=20=20=20=20switch=20(SCM_TYP7=20(ra0)=20=3D=3D=20SCM_TYP7=20(ra1)=20= ?=20SCM_TYP7=20(ra0)=20:=200)=0A-=09{=0A-=09default:=0A-=09=20=20{=0A-=09= =20=20=20=20for=20(;=20n--=20>=200;=20i0=20+=3D=20inc0,=20i1=20+=3D=20= inc1)=0A-=09=20=20=20=20=20=20{=0A-=09=09SCM=20res=20=3D=20=20scm_divide=20= (AREF=20(ra0,=20i0),=20AREF=20(ra1,=20i1));=0A-=09=09ASET=20(ra0,=20i0,=20= res);=0A-=09=20=20=20=20=20=20}=0A-=09=20=20=20=20break;=0A-=09=20=20}=0A= -=09}=0A-=20=20=20=20}=0A-=20=20return=201;=0A-}=0A-=0A-=0A-int=0A= -scm_array_identity=20(SCM=20dst,=20SCM=20src)=0A-{=0A-=20=20return=20= racp=20(SCM_CAR=20(src),=20scm_cons=20(dst,=20SCM_EOL));=0A-}=0A-=0A= -#endif=20/*=20SCM_ENABLE_DEPRECATED=20*/=0A-=0A=20static=20int=0A=20= ramap=20(SCM=20ra0,=20SCM=20proc,=20SCM=20ras)=0A=20{=0Adiff=20--git=20= a/libguile/array-map.h=20b/libguile/array-map.h=0Aindex=20= b0592d8..e7431b1=20100644=0A---=20a/libguile/array-map.h=0A+++=20= b/libguile/array-map.h=0A@@=20-39,22=20+39,6=20@@=20SCM_API=20SCM=20= scm_array_index_map_x=20(SCM=20ra,=20SCM=20proc);=0A=20SCM_API=20SCM=20= scm_array_equal_p=20(SCM=20ra0,=20SCM=20ra1);=0A=20SCM_INTERNAL=20void=20= scm_init_array_map=20(void);=0A=20=0A-#if=20SCM_ENABLE_DEPRECATED=20=3D=3D= =201=0A-=0A-SCM_DEPRECATED=20int=20scm_array_fill_int=20(SCM=20ra,=20SCM=20= fill,=20SCM=20ignore);=0A-SCM_DEPRECATED=20int=20scm_ra_eqp=20(SCM=20= ra0,=20SCM=20ras);=0A-SCM_DEPRECATED=20int=20scm_ra_lessp=20(SCM=20ra0,=20= SCM=20ras);=0A-SCM_DEPRECATED=20int=20scm_ra_leqp=20(SCM=20ra0,=20SCM=20= ras);=0A-SCM_DEPRECATED=20int=20scm_ra_grp=20(SCM=20ra0,=20SCM=20ras);=0A= -SCM_DEPRECATED=20int=20scm_ra_greqp=20(SCM=20ra0,=20SCM=20ras);=0A= -SCM_DEPRECATED=20int=20scm_ra_sum=20(SCM=20ra0,=20SCM=20ras);=0A= -SCM_DEPRECATED=20int=20scm_ra_difference=20(SCM=20ra0,=20SCM=20ras);=0A= -SCM_DEPRECATED=20int=20scm_ra_product=20(SCM=20ra0,=20SCM=20ras);=0A= -SCM_DEPRECATED=20int=20scm_ra_divide=20(SCM=20ra0,=20SCM=20ras);=0A= -SCM_DEPRECATED=20int=20scm_array_identity=20(SCM=20src,=20SCM=20dst);=0A= -=0A-#endif=20=20/*=20SCM_ENABLE_DEPRECATED=20=3D=3D=201=20*/=0A-=0A=20= #endif=20=20/*=20SCM_ARRAY_MAP_H=20*/=0A=20=0A=20/*=0Adiff=20--git=20= a/libguile/generalized-vectors.c=20b/libguile/generalized-vectors.c=0A= index=20fc493bc..0fe8b89=20100644=0A---=20= a/libguile/generalized-vectors.c=0A+++=20= b/libguile/generalized-vectors.c=0A@@=20-69,19=20+69,6=20@@=20SCM_DEFINE=20= (scm_make_generalized_vector,=20"make-generalized-vector",=202,=201,=20= 0,=0A=20}=0A=20#undef=20FUNC_NAME=0A=20=0A-int=0A= -scm_is_generalized_vector=20(SCM=20obj)=0A-{=0A-=20=20int=20ret=20=3D=20= 0;=0A-=20=20if=20(scm_is_array=20(obj))=0A-=20=20=20=20{=0A-=20=20=20=20=20= =20scm_t_array_handle=20h;=0A-=20=20=20=20=20=20scm_array_get_handle=20= (obj,=20&h);=0A-=20=20=20=20=20=20ret=20=3D=20scm_array_handle_rank=20= (&h)=20=3D=3D=201;=0A-=20=20=20=20=20=20scm_array_handle_release=20(&h);=0A= -=20=20=20=20}=0A-=20=20return=20ret;=0A-}=0A=20=0A=20#define=20= SCM_VALIDATE_VECTOR_WITH_HANDLE(pos,=20val,=20handle)=20=20=20\=0A=20=20=20= scm_generalized_vector_get_handle=20(val,=20handle)=0A@@=20-98,24=20= +85,6=20@@=20scm_generalized_vector_get_handle=20(SCM=20vec,=20= scm_t_array_handle=20*h)=0A=20=20=20=20=20}=0A=20}=0A=20=0A-size_t=0A= -scm_c_generalized_vector_length=20(SCM=20v)=0A-{=0A-=20=20return=20= scm_c_array_length=20(v);=0A-}=0A-=0A-SCM=0A= -scm_c_generalized_vector_ref=20(SCM=20v,=20ssize_t=20idx)=0A-{=0A-=20=20= return=20scm_c_array_ref_1=20(v,=20idx);=0A-}=0A-=0A-void=0A= -scm_c_generalized_vector_set_x=20(SCM=20v,=20ssize_t=20idx,=20SCM=20= val)=0A-{=0A-=20=20scm_c_array_set_1_x=20(v,=20val,=20idx);=0A-}=0A-=0A=20= void=0A=20scm_init_generalized_vectors=20()=0A=20{=0Adiff=20--git=20= a/libguile/generalized-vectors.h=20b/libguile/generalized-vectors.h=0A= index=20876537a..77d6272=20100644=0A---=20= a/libguile/generalized-vectors.h=0A+++=20= b/libguile/generalized-vectors.h=0A@@=20-30,10=20+30,6=20@@=0A=20=0A=20= /*=20Generalized=20vectors=20*/=0A=20=0A-SCM_API=20int=20= scm_is_generalized_vector=20(SCM=20obj);=0A-SCM_API=20size_t=20= scm_c_generalized_vector_length=20(SCM=20v);=0A-SCM_API=20SCM=20= scm_c_generalized_vector_ref=20(SCM=20v,=20ssize_t=20idx);=0A-SCM_API=20= void=20scm_c_generalized_vector_set_x=20(SCM=20v,=20ssize_t=20idx,=20SCM=20= val);=0A=20SCM_API=20void=20scm_generalized_vector_get_handle=20(SCM=20= vec,=0A=20=09=09=09=09=09=09scm_t_array_handle=20*h);=0A=20=0A--=20=0A= 2.7.3=0A=0A= --Apple-Mail=_C05A2854-9EDB-476D-AE5C-EF5B1F5E02F5 Content-Disposition: attachment; filename=0006-Support-typed-arrays-in-some-sort-functions.patch Content-Type: application/octet-stream; name="0006-Support-typed-arrays-in-some-sort-functions.patch" Content-Transfer-Encoding: quoted-printable =46rom=2082c3a8b4ee11fb612d309a2011f60f0f6cc6ee4d=20Mon=20Sep=2017=20= 00:00:00=202001=0AFrom:=20Daniel=20Llorens=20=0A= Date:=20Tue,=2012=20Jul=202016=2018:43:03=20+0200=0ASubject:=20[PATCH=20= 06/11]=20Support=20typed=20arrays=20in=20some=20sort=20functions=0A=0A*=20= libguile/sort.c=20(sort!,=20sort,=20restricted-vector-sort!,=20sorted?):=0A= =20=20Support=20arrays=20of=20rank=201,=20whatever=20the=20type.=0A=0A*=20= libguile/quicksort.i.c:=20Fix=20accessors=20to=20handle=20typed=20= arrays.=0A=0A*=20test-suite/tests/sort.test:=20Test=20also=20with=20= typed=20arrays.=0A---=0A=20libguile/quicksort.i.c=20=20=20=20=20|=20=20= 45=20++++++++--------=0A=20libguile/sort.c=20=20=20=20=20=20=20=20=20=20=20= =20|=20131=20++++++++++++++++++++++++++++++---------------=0A=20= test-suite/tests/sort.test=20|=20=2032=20++++++++++-=0A=203=20files=20= changed,=20140=20insertions(+),=2068=20deletions(-)=0A=0Adiff=20--git=20= a/libguile/quicksort.i.c=20b/libguile/quicksort.i.c=0Aindex=20= 4e39f82..cf1742e=20100644=0A---=20a/libguile/quicksort.i.c=0A+++=20= b/libguile/quicksort.i.c=0A@@=20-11,7=20+11,7=20@@=0A=20=20=20=20version=20= but=20doesn't=20consume=20extra=20memory.=0A=20=20*/=0A=20=0A-#define=20= SWAP(a,=20b)=20do=20{=20const=20SCM=20_tmp=20=3D=20a;=20a=20=3D=20b;=20b=20= =3D=20_tmp;=20}=20while=20(0)=0A+#define=20SWAP(a,=20b)=20do=20{=20const=20= SCM=20_tmp=20=3D=20GET(a);=20SET(a,=20GET(b));=20SET(b,=20_tmp);=20}=20= while=20(0)=0A=20=0A=20=0A=20/*=20Order=20using=20quicksort.=20=20This=20= implementation=20incorporates=20four=0A@@=20-54,8=20+54,7=20@@=0A=20= #define=09STACK_NOT_EMPTY=09=20(stack=20<=20top)=0A=20=0A=20static=20= void=0A-NAME=20(SCM=20*const=20base_ptr,=20size_t=20nr_elems,=20= INC_PARAM=0A-=20=20=20=20=20=20SCM=20less)=0A+NAME=20(VEC_PARAM=20size_t=20= nr_elems,=20INC_PARAM=20SCM=20less)=0A=20{=0A=20=20=20/*=20Stack=20node=20= declarations=20used=20to=20store=20unfulfilled=20partition=20= obligations.=20*/=0A=20=20=20typedef=20struct=20{=0A@@=20-65,8=20+64,6=20= @@=20NAME=20(SCM=20*const=20base_ptr,=20size_t=20nr_elems,=20INC_PARAM=0A= =20=0A=20=20=20static=20const=20char=20s_buggy_less[]=20=3D=20"buggy=20= less=20predicate=20used=20when=20sorting";=0A=20=0A-#define=20ELT(i)=20= base_ptr[(i)*INC]=0A-=0A=20=20=20if=20(nr_elems=20=3D=3D=200)=0A=20=20=20= =20=20/*=20Avoid=20lossage=20with=20unsigned=20arithmetic=20below.=20=20= */=0A=20=20=20=20=20return;=0A@@=20-93,17=20+90,17=20@@=20NAME=20(SCM=20= *const=20base_ptr,=20size_t=20nr_elems,=20INC_PARAM=0A=20=0A=20=09=20=20= SCM_TICK;=0A=20=09=0A-=09=20=20if=20(scm_is_true=20(scm_call_2=20(less,=20= ELT(mid),=20ELT(lo))))=0A-=09=20=20=20=20SWAP=20(ELT(mid),=20ELT(lo));=0A= -=09=20=20if=20(scm_is_true=20(scm_call_2=20(less,=20ELT(hi),=20= ELT(mid))))=0A-=09=20=20=20=20SWAP=20(ELT(mid),=20ELT(hi));=0A+=20=20=20=20= =20=20=20=20=20=20if=20(scm_is_true=20(scm_call_2=20(less,=20GET(mid),=20= GET(lo))))=0A+=20=20=20=20=20=20=20=20=20=20=20=20SWAP=20(mid,=20lo);=0A= +=20=20=20=20=20=20=20=20=20=20if=20(scm_is_true=20(scm_call_2=20(less,=20= GET(hi),=20GET(mid))))=0A+=20=20=20=20=20=20=20=20=20=20=20=20SWAP=20= (mid,=20hi);=0A=20=09=20=20else=0A=20=09=20=20=20=20goto=20jump_over;=0A= -=09=20=20if=20(scm_is_true=20(scm_call_2=20(less,=20ELT(mid),=20= ELT(lo))))=0A-=09=20=20=20=20SWAP=20(ELT(mid),=20ELT(lo));=0A+=20=20=20=20= =20=20=20=20=20=20if=20(scm_is_true=20(scm_call_2=20(less,=20GET(mid),=20= GET(lo))))=0A+=20=20=20=20=20=20=20=20=20=20=20=20SWAP=20(mid,=20lo);=0A=20= =09jump_over:;=0A=20=0A-=09=20=20pivot=20=3D=20ELT(mid);=0A+=09=20=20= pivot=20=3D=20GET(mid);=0A=20=09=20=20left=20=3D=20lo=20+=201;=0A=20=09=20= =20right=20=3D=20hi=20-=201;=0A=20=0A@@=20-112,7=20+109,7=20@@=20NAME=20= (SCM=20*const=20base_ptr,=20size_t=20nr_elems,=20INC_PARAM=0A=20=09=20=20= =20=20=20that=20this=20algorithm=20runs=20much=20faster=20than=20others.=20= */=0A=20=09=20=20do=0A=20=09=20=20=20=20{=0A-=09=20=20=20=20=20=20while=20= (scm_is_true=20(scm_call_2=20(less,=20ELT(left),=20pivot)))=0A+=09=20=20=20= =20=20=20while=20(scm_is_true=20(scm_call_2=20(less,=20GET(left),=20= pivot)))=0A=20=09=09{=0A=20=09=09=20=20left=20+=3D=201;=0A=20=09=09=20=20= /*=20The=20comparison=20predicate=20may=20be=20buggy=20*/=0A@@=20-120,7=20= +117,7=20@@=20NAME=20(SCM=20*const=20base_ptr,=20size_t=20nr_elems,=20= INC_PARAM=0A=20=09=09=20=20=20=20scm_misc_error=20(NULL,=20s_buggy_less,=20= SCM_EOL);=0A=20=09=09}=0A=20=0A-=09=20=20=20=20=20=20while=20= (scm_is_true=20(scm_call_2=20(less,=20pivot,=20ELT(right))))=0A+=09=20=20= =20=20=20=20while=20(scm_is_true=20(scm_call_2=20(less,=20pivot,=20= GET(right))))=0A=20=09=09{=0A=20=09=09=20=20right=20-=3D=201;=0A=20=09=09= =20=20/*=20The=20comparison=20predicate=20may=20be=20buggy=20*/=0A@@=20= -130,7=20+127,7=20@@=20NAME=20(SCM=20*const=20base_ptr,=20size_t=20= nr_elems,=20INC_PARAM=0A=20=0A=20=09=20=20=20=20=20=20if=20(left=20<=20= right)=0A=20=09=09{=0A-=09=09=20=20SWAP=20(ELT(left),=20ELT(right));=0A+=09= =09=20=20SWAP=20(left,=20right);=0A=20=09=09=20=20left=20+=3D=201;=0A=20=09= =09=20=20right=20-=3D=201;=0A=20=09=09}=0A@@=20-192,11=20+189,11=20@@=20= NAME=20(SCM=20*const=20base_ptr,=20size_t=20nr_elems,=20INC_PARAM=0A=20=20= =20=20=20=20=20=20and=20the=20operation=20speeds=20up=20insertion=20= sort's=20inner=20loop.=20*/=0A=20=0A=20=20=20=20=20for=20(run=20=3D=20= tmp=20+=201;=20run=20<=3D=20thresh;=20run=20+=3D=201)=0A-=20=20=20=20=20=20= if=20(scm_is_true=20(scm_call_2=20(less,=20ELT(run),=20ELT(tmp))))=0A+=20= =20=20=20=20=20if=20(scm_is_true=20(scm_call_2=20(less,=20GET(run),=20= GET(tmp))))=0A=20=09tmp=20=3D=20run;=0A=20=0A=20=20=20=20=20if=20(tmp=20= !=3D=200)=0A-=20=20=20=20=20=20SWAP=20(ELT(tmp),=20ELT(0));=0A+=20=20=20=20= =20=20SWAP=20(tmp,=200);=0A=20=0A=20=20=20=20=20/*=20Insertion=20sort,=20= running=20from=20left-hand-side=20up=20to=20right-hand-side.=20=20*/=0A=20= =0A@@=20-206,7=20+203,7=20@@=20NAME=20(SCM=20*const=20base_ptr,=20size_t=20= nr_elems,=20INC_PARAM=0A=20=09SCM_TICK;=0A=20=0A=20=09tmp=20=3D=20run=20= -=201;=0A-=09while=20(scm_is_true=20(scm_call_2=20(less,=20ELT(run),=20= ELT(tmp))))=0A+=09while=20(scm_is_true=20(scm_call_2=20(less,=20= GET(run),=20GET(tmp))))=0A=20=09=20=20{=0A=20=09=20=20=20=20/*=20The=20= comparison=20predicate=20may=20be=20buggy=20*/=0A=20=09=20=20=20=20if=20= (tmp=20=3D=3D=200)=0A@@=20-218,12=20+215,12=20@@=20NAME=20(SCM=20*const=20= base_ptr,=20size_t=20nr_elems,=20INC_PARAM=0A=20=09tmp=20+=3D=201;=0A=20=09= if=20(tmp=20!=3D=20run)=0A=20=09=20=20{=0A-=20=20=20=20=20=20=20=20=20=20= =20=20SCM=20to_insert=20=3D=20ELT(run);=0A+=20=20=20=20=20=20=20=20=20=20= =20=20SCM=20to_insert=20=3D=20GET(run);=0A=20=20=20=20=20=20=20=20=20=20=20= =20=20size_t=20hi,=20lo;=0A=20=0A=20=20=20=20=20=20=20=20=20=20=20=20=20= for=20(hi=20=3D=20lo=20=3D=20run;=20--lo=20>=3D=20tmp;=20hi=20=3D=20lo)=0A= -=20=20=20=20=20=20=20=20=20=20=20=20=20=20ELT(hi)=20=3D=20ELT(lo);=0A-=20= =20=20=20=20=20=20=20=20=20=20=20ELT(hi)=20=3D=20to_insert;=0A+=20=20=20=20= =20=20=20=20=20=20=20=20=20=20SET(hi,=20GET(lo));=0A+=20=20=20=20=20=20=20= =20=20=20=20=20SET(hi,=20to_insert);=0A=20=09=20=20}=0A=20=20=20=20=20=20= =20}=0A=20=20=20}=0A@@=20-235,9=20+232,9=20@@=20NAME=20(SCM=20*const=20= base_ptr,=20size_t=20nr_elems,=20INC_PARAM=0A=20#undef=20PUSH=0A=20= #undef=20POP=0A=20#undef=20STACK_NOT_EMPTY=0A-#undef=20ELT=0A+#undef=20= GET=0A+#undef=20SET=0A=20=0A=20#undef=20NAME=0A=20#undef=20INC_PARAM=0A= -#undef=20INC=0A-=0A+#undef=20VEC_PARAM=0Adiff=20--git=20= a/libguile/sort.c=20b/libguile/sort.c=0Aindex=209373fb8..8c20d34=20= 100644=0A---=20a/libguile/sort.c=0A+++=20b/libguile/sort.c=0A@@=20-51,21=20= +51,23=20@@=0A=20#include=20"libguile/validate.h"=0A=20#include=20= "libguile/sort.h"=0A=20=0A-/*=20We=20have=20two=20quicksort=20variants:=20= one=20for=20contigous=20vectors=20and=20one=0A-=20=20=20for=20vectors=20= with=20arbitrary=20increments=20between=20elements.=20=20Note=20that=0A-=20= =20=20increments=20can=20be=20negative.=0A+/*=20We=20have=20two=20= quicksort=20variants:=20one=20for=20SCM=20(#t)=20arrays=20and=20one=20= for=0A+=20=20=20typed=20arrays.=0A=20*/=0A=20=0A-#define=20NAME=20=20=20=20= =20=20=20=20quicksort1=0A-#define=20INC_PARAM=20=20=20/*=20empty=20*/=0A= -#define=20INC=20=20=20=20=20=20=20=20=201=0A-#include=20= "libguile/quicksort.i.c"=0A-=0A=20#define=20NAME=20=20=20=20=20=20=20=20= quicksort=0A=20#define=20INC_PARAM=20=20=20ssize_t=20inc,=0A-#define=20= INC=20=20=20=20=20=20=20=20=20inc=0A+#define=20VEC_PARAM=20=20=20SCM=20*=20= ra,=0A+#define=20GET(i)=20=20=20=20=20=20ra[(i)*inc]=0A+#define=20SET(i,=20= val)=20ra[(i)*inc]=20=3D=20val=0A=20#include=20"libguile/quicksort.i.c"=0A= =20=0A+#define=20NAME=20=20=20=20=20=20=20=20quicksorta=0A+#define=20= INC_PARAM=0A+#define=20VEC_PARAM=20=20=20scm_t_array_handle=20*=20const=20= ra,=0A+#define=20GET(i)=20=20=20=20=20=20scm_array_handle_ref=20(ra,=20= scm_array_handle_pos_1=20(ra,=20i))=0A+#define=20SET(i,=20val)=20= scm_array_handle_set=20(ra,=20scm_array_handle_pos_1=20(ra,=20i),=20val)=0A= +#include=20"libguile/quicksort.i.c"=0A=20=0A=20SCM_DEFINE=20= (scm_restricted_vector_sort_x,=20"restricted-vector-sort!",=204,=200,=20= 0,=20=0A=20=20=20=20=20=20=20=20=20=20=20=20=20(SCM=20vec,=20SCM=20less,=20= SCM=20startpos,=20SCM=20endpos),=0A@@=20-76,22=20+78,39=20@@=20= SCM_DEFINE=20(scm_restricted_vector_sort_x,=20"restricted-vector-sort!",=20= 4,=200,=200,=0A=20=09=20=20=20=20"is=20not=20specified.")=0A=20#define=20= FUNC_NAME=20s_scm_restricted_vector_sort_x=0A=20{=0A-=20=20size_t=20= vlen,=20spos,=20len;=0A-=20=20ssize_t=20vinc;=0A+=20=20ssize_t=20spos=20= =3D=20scm_to_ssize_t=20(startpos);=0A+=20=20size_t=20epos=20=3D=20= scm_to_ssize_t=20(endpos);=0A+=0A=20=20=20scm_t_array_handle=20handle;=0A= -=20=20SCM=20*velts;=0A+=20=20scm_t_array_dim=20const=20*=20dims;=0A+=20=20= scm_array_get_handle=20(vec,=20&handle);=0A+=20=20dims=20=3D=20= scm_array_handle_dims=20(&handle);=0A=20=0A-=20=20velts=20=3D=20= scm_vector_writable_elements=20(vec,=20&handle,=20&vlen,=20&vinc);=0A-=20= =20spos=20=3D=20scm_to_unsigned_integer=20(startpos,=200,=20vlen);=0A-=20= =20len=20=3D=20scm_to_unsigned_integer=20(endpos,=20spos,=20vlen)=20-=20= spos;=0A+=20=20if=20(scm_array_handle_rank(&handle)=20!=3D=201)=0A+=20=20= =20=20{=0A+=20=20=20=20=20=20scm_array_handle_release=20(&handle);=0A+=20= =20=20=20=20=20scm_error=20(scm_misc_error_key,=20FUNC_NAME,=20"rank=20= must=20be=201",=20vec,=20SCM_EOL);=0A+=20=20=20=20}=0A+=20=20if=20(spos=20= <=20dims[0].lbnd)=0A+=20=20=20=20{=0A+=20=20=20=20=20=20= scm_array_handle_release=20(&handle);=0A+=20=20=20=20=20=20scm_error=20= (scm_out_of_range_key,=20FUNC_NAME,=20"startpos=20out=20of=20range",=0A+=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20vec,=20= scm_list_1(startpos));=0A+=20=20=20=20}=0A+=20=20if=20(epos=20>=20= dims[0].ubnd+1)=0A+=20=20=20=20{=0A+=20=20=20=20=20=20= scm_array_handle_release=20(&handle);=0A+=20=20=20=20=20=20scm_error=20= (scm_out_of_range_key,=20FUNC_NAME,=20"endpos=20out=20of=20range",=0A+=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20vec,=20= scm_list_1(endpos));=0A+=20=20=20=20}=0A=20=0A-=20=20if=20(vinc=20=3D=3D=20= 1)=0A-=20=20=20=20quicksort1=20(velts=20+=20spos*vinc,=20len,=20less);=0A= +=20=20if=20(handle.element_type=20=3D=3D=20SCM_ARRAY_ELEMENT_TYPE_SCM)=0A= +=20=20=20=20=20=20quicksort=20(scm_array_handle_writable_elements=20= (&handle)=20+=20(spos-dims[0].lbnd)=20*=20dims[0].inc,=0A+=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20epos-spos,=20dims[0].inc,=20less);=0A= =20=20=20else=0A-=20=20=20=20quicksort=20(velts=20+=20spos*vinc,=20len,=20= vinc,=20less);=0A+=20=20=20=20=20=20quicksorta=20(&handle,=20epos-spos,=20= less);=0A=20=0A=20=20=20scm_array_handle_release=20(&handle);=0A-=0A=20=20= =20return=20SCM_UNSPECIFIED;=0A=20}=0A=20#undef=20FUNC_NAME=0A@@=20= -140,29=20+159,49=20@@=20SCM_DEFINE=20(scm_sorted_p,=20"sorted?",=202,=20= 0,=200,=0A=20=20=20=20=20}=0A=20=20=20else=0A=20=20=20=20=20{=0A-=20=20=20= =20=20=20scm_t_array_handle=20handle;=0A-=20=20=20=20=20=20size_t=20i,=20= len;=0A-=20=20=20=20=20=20ssize_t=20inc;=0A-=20=20=20=20=20=20const=20= SCM=20*elts;=0A=20=20=20=20=20=20=20SCM=20result=20=3D=20SCM_BOOL_T;=0A-=0A= -=20=20=20=20=20=20elts=20=3D=20scm_vector_elements=20(items,=20&handle,=20= &len,=20&inc);=0A-=0A-=20=20=20=20=20=20for=20(i=20=3D=201;=20i=20<=20= len;=20i++,=20elts=20+=3D=20inc)=0A-=09{=0A-=09=20=20if=20(scm_is_true=20= (scm_call_2=20(less,=20elts[inc],=20elts[0])))=0A-=09=20=20=20=20{=0A-=09= =20=20=20=20=20=20result=20=3D=20SCM_BOOL_F;=0A-=09=20=20=20=20=20=20= break;=0A-=09=20=20=20=20}=0A-=09}=0A+=20=20=20=20=20=20ssize_t=20i,=20= end;=0A+=20=20=20=20=20=20scm_t_array_handle=20handle;=0A+=20=20=20=20=20= =20scm_t_array_dim=20const=20*=20dims;=0A+=20=20=20=20=20=20= scm_array_get_handle=20(items,=20&handle);=0A+=20=20=20=20=20=20dims=20=3D= =20scm_array_handle_dims=20(&handle);=0A+=0A+=20=20=20=20=20=20if=20= (scm_array_handle_rank(&handle)=20!=3D=201)=0A+=20=20=20=20=20=20=20=20{=0A= +=20=20=20=20=20=20=20=20=20=20scm_array_handle_release=20(&handle);=0A+=20= =20=20=20=20=20=20=20=20=20scm_error=20(scm_misc_error_key,=20FUNC_NAME,=20= "rank=20must=20be=201",=20items,=20SCM_EOL);=0A+=20=20=20=20=20=20=20=20= }=0A+=0A+=20=20=20=20=20=20if=20(handle.element_type=20=3D=3D=20= SCM_ARRAY_ELEMENT_TYPE_SCM)=0A+=20=20=20=20=20=20=20=20{=0A+=20=20=20=20=20= =20=20=20=20=20ssize_t=20inc=20=3D=20dims[0].inc;=0A+=20=20=20=20=20=20=20= =20=20=20const=20SCM=20*elts=20=3D=20scm_array_handle_elements=20= (&handle);=0A+=20=20=20=20=20=20=20=20=20=20for=20(i=20=3D=20= dims[0].lbnd+1,=20end=20=3D=20dims[0].ubnd+1;=20i=20<=20end;=20++i,=20= elts=20+=3D=20inc)=0A+=20=20=20=20=20=20=20=20=20=20=20=20{=0A+=20=20=20=20= =20=20=20=20=20=20=20=20=20=20if=20(scm_is_true=20(scm_call_2=20(less,=20= elts[inc],=20elts[0])))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= {=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20result=20=3D=20= SCM_BOOL_F;=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= break;=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20}=0A+=20=20=20=20= =20=20=20=20=20=20=20=20}=0A+=20=20=20=20=20=20=20=20}=0A+=20=20=20=20=20= =20else=0A+=20=20=20=20=20=20=20=20{=0A+=20=20=20=20=20=20=20=20=20=20= for=20(i=20=3D=20dims[0].lbnd+1,=20end=20=3D=20dims[0].ubnd+1;=20i=20<=20= end;=20++i)=0A+=20=20=20=20=20=20=20=20=20=20=20=20{=0A+=20=20=20=20=20=20= =20=20=20=20=20=20=20=20if=20(scm_is_true=20(scm_call_2=20(less,=0A+=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20scm_array_handle_ref=20= (&handle,=20scm_array_handle_pos_1=20(&handle,=20i)),=0A+=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20scm_array_handle_ref=20(&handle,=20= scm_array_handle_pos_1=20(&handle,=20i-1)))))=0A+=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20{=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20result=20=3D=20SCM_BOOL_F;=0A+=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20break;=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20}=0A+=20=20=20=20=20=20=20=20=20=20=20=20}=0A+=20=20=20=20=20=20=20=20= }=0A=20=0A=20=20=20=20=20=20=20scm_array_handle_release=20(&handle);=0A-=0A= =20=20=20=20=20=20=20return=20result;=0A=20=20=20=20=20}=0A-=0A-=20=20= return=20SCM_BOOL_F;=0A=20}=0A=20#undef=20FUNC_NAME=0A=20=0A@@=20-404,7=20= +443,14=20@@=20SCM_DEFINE=20(scm_sort,=20"sort",=202,=200,=200,=0A=20=20=20= if=20(scm_is_pair=20(items))=0A=20=20=20=20=20return=20scm_sort_x=20= (scm_list_copy=20(items),=20less);=0A=20=20=20else=20if=20(scm_is_array=20= (items)=20&&=20scm_c_array_rank=20(items)=20=3D=3D=201)=0A-=20=20=20=20= return=20scm_sort_x=20(scm_vector_copy=20(items),=20less);=0A+=20=20=20=20= {=0A+=20=20=20=20=20=20SCM=20copy;=0A+=20=20=20=20=20=20if=20= (scm_c_array_rank=20(items)=20!=3D=201)=0A+=20=20=20=20=20=20=20=20= scm_error=20(scm_misc_error_key,=20FUNC_NAME,=20"rank=20must=20be=201",=20= items,=20SCM_EOL);=0A+=20=20=20=20=20=20copy=20=3D=20= scm_make_typed_array=20(scm_array_type=20(items),=20SCM_UNSPECIFIED,=20= scm_array_dimensions=20(items));=0A+=20=20=20=20=20=20scm_array_copy_x=20= (items,=20copy);=0A+=20=20=20=20=20=20return=20scm_sort_x=20(copy,=20= less);=0A+=20=20=20=20}=0A=20=20=20else=0A=20=20=20=20=20= SCM_WRONG_TYPE_ARG=20(1,=20items);=0A=20}=0A@@=20-498,10=20+544,11=20@@=20= SCM_DEFINE=20(scm_stable_sort_x,=20"stable-sort!",=202,=200,=200,=0A=20=20= =20=20=20=20=20=0A=20=20=20=20=20=20=20vec_elts=20=3D=20= scm_vector_writable_elements=20(items,=20&vec_handle,=0A=20=09=09=09=09=09= =20=20=20=20=20=20=20&len,=20&inc);=0A-=20=20=20=20=20=20if=20(len=20=3D=3D= =200)=20{=0A-=20=20=20=20=20=20=20=20scm_array_handle_release=20= (&vec_handle);=0A-=20=20=20=20=20=20=20=20return=20items;=0A-=20=20=20=20= =20=20}=0A+=20=20=20=20=20=20if=20(len=20=3D=3D=200)=0A+=20=20=20=20=20=20= =20=20{=0A+=20=20=20=20=20=20=20=20=20=20scm_array_handle_release=20= (&vec_handle);=0A+=20=20=20=20=20=20=20=20=20=20return=20items;=0A+=20=20= =20=20=20=20=20=20}=0A=20=20=20=20=20=20=20=0A=20=20=20=20=20=20=20temp=20= =3D=20scm_c_make_vector=20(len,=20SCM_UNDEFINED);=0A=20=20=20=20=20=20=20= temp_elts=20=3D=20scm_vector_writable_elements=20(temp,=20&temp_handle,=0A= diff=20--git=20a/test-suite/tests/sort.test=20= b/test-suite/tests/sort.test=0Aindex=209209b53..249f890=20100644=0A---=20= a/test-suite/tests/sort.test=0A+++=20b/test-suite/tests/sort.test=0A@@=20= -31,22=20+31,51=20@@=0A=20=20=20=20=20exception:wrong-num-args=0A=20=20=20= =20=20(sort=20'(1=202)=20(lambda=20(x=20y=20z)=20z)))=0A=20=0A-=20=20= (pass-if=20"sort!"=0A+=20=20(pass-if=20"sort=20of=20vector"=0A+=20=20=20=20= (let*=20((v=20(randomize-vector!=20(make-vector=201000)=201000))=0A+=20=20= =20=20=20=20=20=20=20=20=20(w=20(vector-copy=20v)))=0A+=20=20=20=20=20=20= (and=20(sorted?=20(sort=20v=20<)=20<)=0A+=20=20=20=20=20=20=20=20=20=20=20= (equal?=20w=20v))))=0A+=0A+=20=20(pass-if=20"sort=20of=20typed=20array"=0A= +=20=20=20=20(let*=20((v=20(randomize-vector!=20(make-typed-array=20'f64=20= *unspecified*=2099)=2099))=0A+=20=20=20=20=20=20=20=20=20=20=20(w=20= (make-typed-array=20'f64=20*unspecified*=2099)))=0A+=20=20=20=20=20=20= (array-copy!=20v=20w)=0A+=20=20=20=20=20=20(and=20(sorted?=20(sort=20v=20= <)=20<)=0A+=20=20=20=20=20=20=20=20=20=20=20(equal?=20w=20v))))=0A+=0A+=20= =20(pass-if=20"sort!=20of=20vector"=0A=20=20=20=20=20(let=20((v=20= (randomize-vector!=20(make-vector=201000)=201000)))=0A=20=20=20=20=20=20=20= (sorted?=20(sort!=20v=20<)=20<)))=0A=20=0A+=20=20(pass-if=20"sort!=20of=20= typed=20array"=0A+=20=20=20=20(let=20((v=20(randomize-vector!=20= (make-typed-array=20'f64=20*unspecified*=2099)=2099)))=0A+=20=20=20=20=20= =20(sorted?=20(sort!=20v=20<)=20<)))=0A+=0A=20=20=20(pass-if=20"sort!=20= of=20non-contigous=20vector"=0A=20=20=20=20=20(let*=20((a=20(make-array=20= 0=201000=203))=0A=20=09=20=20=20(v=20(make-shared-array=20a=20(lambda=20= (i)=20(list=20i=200))=201000)))=0A=20=20=20=20=20=20=20= (randomize-vector!=20v=201000)=0A=20=20=20=20=20=20=20(sorted?=20(sort!=20= v=20<)=20<)))=0A=20=0A+=20=20(pass-if=20"sort!=20of=20non-contigous=20= typed=20array"=0A+=20=20=20=20(let*=20((a=20(make-typed-array=20'f64=200=20= 99=203))=0A+=09=20=20=20(v=20(make-shared-array=20a=20(lambda=20(i)=20= (list=20i=200))=2099)))=0A+=20=20=20=20=20=20(randomize-vector!=20v=20= 99)=0A+=20=20=20=20=20=20(sorted?=20(sort!=20v=20<)=20<)))=0A+=0A=20=20=20= (pass-if=20"sort!=20of=20negative-increment=20vector"=0A=20=20=20=20=20= (let*=20((a=20(make-array=200=201000=203))=0A=20=09=20=20=20(v=20= (make-shared-array=20a=20(lambda=20(i)=20(list=20(-=20999=20i)=200))=20= 1000)))=0A=20=20=20=20=20=20=20(randomize-vector!=20v=201000)=0A=20=20=20= =20=20=20=20(sorted?=20(sort!=20v=20<)=20<)))=0A=20=0A+=20=20(pass-if=20= "sort!=20of=20negative-increment=20typed=20array"=0A+=20=20=20=20(let*=20= ((a=20(make-typed-array=20'f64=200=2099=203))=0A+=09=20=20=20(v=20= (make-shared-array=20a=20(lambda=20(i)=20(list=20(-=2098=20i)=200))=20= 99)))=0A+=20=20=20=20=20=20(randomize-vector!=20v=2099)=0A+=20=20=20=20=20= =20(sorted?=20(sort!=20v=20<)=20<)))=0A+=0A=20=20=20(pass-if=20= "stable-sort!"=0A=20=20=20=20=20(let=20((v=20(randomize-vector!=20= (make-vector=201000)=201000)))=0A=20=20=20=20=20=20=20(sorted?=20= (stable-sort!=20v=20<)=20<)))=0A@@=20-79,4=20+108,3=20@@=0A=20=20=20;;=20= behavior=20(integer=20underflow)=20leading=20to=20crashes.=0A=20=20=20= (pass-if=20"empty=20vector"=0A=20=20=20=20=20(equal?=20'#()=20= (stable-sort=20'#()=20<))))=0A-=0A--=20=0A2.7.3=0A=0A= --Apple-Mail=_C05A2854-9EDB-476D-AE5C-EF5B1F5E02F5 Content-Disposition: attachment; filename=0007-Do-not-use-array-handles-in-scm_vector.patch Content-Type: application/octet-stream; name="0007-Do-not-use-array-handles-in-scm_vector.patch" Content-Transfer-Encoding: quoted-printable =46rom=20a39ed77e78f49e848b38db9bb876445dd02fd9ed=20Mon=20Sep=2017=20= 00:00:00=202001=0AFrom:=20Daniel=20Llorens=20=0A= Date:=20Wed,=2025=20Feb=202015=2009:47:40=20+0100=0ASubject:=20[PATCH=20= 07/11]=20Do=20not=20use=20array=20handles=20in=20scm_vector=0A=0A*=20= libguile/vectors.c=20(scm_vector):=20Use=20SCM_I_VECTOR_WELTS=20on=20new=20= vector=0A=20=20instead=20of=20generic=20scm_vector_elements;=20cf.=20= scm_vector_copy().=0A=0A=20=20(scm_vector_elements):=20Forward=20to=20= scm_vector_writable_elements().=0A=0A=20=20= (scm_vector_writable_elements):=20Remove=20special=20error=20message=20= for=20weak=0A=20=20vector=20arg.=0A=0A*=20libguile/generalized-vectors.c=20= (SCM_VALIDATE_VECTOR_WITH_HANDLE):=0A=20=20Remove=20unused=20macro.=0A=0A= *=20libguile/array-handle.c=20(scm_array_handle_elements):=20Forward=20= to=0A=20=20scm_array_handle_writable_elements().=0A---=0A=20= libguile/array-handle.c=20=20=20=20=20=20=20=20|=20=204=20+---=0A=20= libguile/generalized-vectors.c=20|=20=205=20-----=0A=20= libguile/vectors.c=20=20=20=20=20=20=20=20=20=20=20=20=20|=2020=20= ++------------------=0A=203=20files=20changed,=203=20insertions(+),=2026=20= deletions(-)=0A=0Adiff=20--git=20a/libguile/array-handle.c=20= b/libguile/array-handle.c=0Aindex=203595266..89277d9=20100644=0A---=20= a/libguile/array-handle.c=0A+++=20b/libguile/array-handle.c=0A@@=20= -320,9=20+320,7=20@@=20scm_array_handle_release=20(scm_t_array_handle=20= *h)=0A=20const=20SCM=20*=0A=20scm_array_handle_elements=20= (scm_t_array_handle=20*h)=0A=20{=0A-=20=20if=20(h->element_type=20!=3D=20= SCM_ARRAY_ELEMENT_TYPE_SCM)=0A-=20=20=20=20scm_wrong_type_arg_msg=20= (NULL,=200,=20h->array,=20"non-uniform=20array");=0A-=20=20return=20= ((const=20SCM*)h->elements)=20+=20h->base;=0A+=20=20return=20= scm_array_handle_writable_elements=20(h);=0A=20}=0A=20=0A=20SCM=20*=0A= diff=20--git=20a/libguile/generalized-vectors.c=20= b/libguile/generalized-vectors.c=0Aindex=200fe8b89..276b9d8=20100644=0A= ---=20a/libguile/generalized-vectors.c=0A+++=20= b/libguile/generalized-vectors.c=0A@@=20-69,11=20+69,6=20@@=20SCM_DEFINE=20= (scm_make_generalized_vector,=20"make-generalized-vector",=202,=201,=20= 0,=0A=20}=0A=20#undef=20FUNC_NAME=0A=20=0A-=0A-#define=20= SCM_VALIDATE_VECTOR_WITH_HANDLE(pos,=20val,=20handle)=20=20=20\=0A-=20=20= scm_generalized_vector_get_handle=20(val,=20handle)=0A-=20=20=20=0A-=0A=20= void=0A=20scm_generalized_vector_get_handle=20(SCM=20vec,=20= scm_t_array_handle=20*h)=0A=20{=0Adiff=20--git=20a/libguile/vectors.c=20= b/libguile/vectors.c=0Aindex=205dab545..6dcc7eb=20100644=0A---=20= a/libguile/vectors.c=0A+++=20b/libguile/vectors.c=0A@@=20-59,26=20+59,13=20= @@=20const=20SCM=20*=0A=20scm_vector_elements=20(SCM=20vec,=20= scm_t_array_handle=20*h,=0A=20=09=09=20=20=20=20=20size_t=20*lenp,=20= ssize_t=20*incp)=0A=20{=0A-=20=20if=20(SCM_I_WVECTP=20(vec))=0A-=20=20=20= =20scm_wrong_type_arg_msg=20(NULL,=200,=20vec,=20"non-weak=20vector");=0A= -=0A-=20=20scm_generalized_vector_get_handle=20(vec,=20h);=0A-=20=20if=20= (lenp)=0A-=20=20=20=20{=0A-=20=20=20=20=20=20scm_t_array_dim=20*dim=20=3D=20= scm_array_handle_dims=20(h);=0A-=20=20=20=20=20=20*lenp=20=3D=20= dim->ubnd=20-=20dim->lbnd=20+=201;=0A-=20=20=20=20=20=20*incp=20=3D=20= dim->inc;=0A-=20=20=20=20}=0A-=20=20return=20scm_array_handle_elements=20= (h);=0A+=20=20return=20scm_vector_writable_elements=20(vec,=20h,=20lenp,=20= incp);=0A=20}=0A=20=0A=20SCM=20*=0A=20scm_vector_writable_elements=20= (SCM=20vec,=20scm_t_array_handle=20*h,=0A=20=09=09=09=20=20=20=20=20=20= size_t=20*lenp,=20ssize_t=20*incp)=0A=20{=0A-=20=20if=20(SCM_I_WVECTP=20= (vec))=0A-=20=20=20=20scm_wrong_type_arg_msg=20(NULL,=200,=20vec,=20= "non-weak=20vector");=0A-=0A=20=20=20scm_generalized_vector_get_handle=20= (vec,=20h);=0A=20=20=20if=20(lenp)=0A=20=20=20=20=20{=0A@@=20-141,12=20= +128,11=20@@=20SCM_DEFINE=20(scm_vector,=20"vector",=200,=200,=201,=0A=20= =20=20SCM=20res;=0A=20=20=20SCM=20*data;=0A=20=20=20long=20i,=20len;=0A-=20= =20scm_t_array_handle=20handle;=0A=20=0A=20=20=20= SCM_VALIDATE_LIST_COPYLEN=20(1,=20l,=20len);=0A=20=0A=20=20=20res=20=3D=20= scm_c_make_vector=20(len,=20SCM_UNSPECIFIED);=0A-=20=20data=20=3D=20= scm_vector_writable_elements=20(res,=20&handle,=20NULL,=20NULL);=0A+=20=20= data=20=3D=20SCM_I_VECTOR_WELTS=20(res);=0A=20=20=20i=20=3D=200;=0A=20=20= =20while=20(scm_is_pair=20(l)=20&&=20i=20<=20len)=20=0A=20=20=20=20=20{=0A= @@=20-155,8=20+141,6=20@@=20SCM_DEFINE=20(scm_vector,=20"vector",=200,=20= 0,=201,=0A=20=20=20=20=20=20=20i=20+=3D=201;=0A=20=20=20=20=20}=0A=20=0A= -=20=20scm_array_handle_release=20(&handle);=0A-=0A=20=20=20return=20= res;=0A=20}=0A=20#undef=20FUNC_NAME=0A--=20=0A2.7.3=0A=0A= --Apple-Mail=_C05A2854-9EDB-476D-AE5C-EF5B1F5E02F5 Content-Disposition: attachment; filename=0008-Speed-up-for-multi-arg-cases-of-scm_ramap-functions.patch Content-Type: application/octet-stream; name="0008-Speed-up-for-multi-arg-cases-of-scm_ramap-functions.patch" Content-Transfer-Encoding: quoted-printable =46rom=20068598cf864c757c5ab36d40c9184143023f0fc8=20Mon=20Sep=2017=20= 00:00:00=202001=0AFrom:=20Daniel=20Llorens=20=0A= Date:=20Fri,=2013=20Feb=202015=2018:42:27=20+0100=0ASubject:=20[PATCH=20= 08/11]=20Speed=20up=20for=20multi-arg=20cases=20of=20scm_ramap=20= functions=0A=0AThis=20patch=20results=20in=20a=2020%-40%=20speedup=20in=20= the=20>=201=20argument=20cases=20of=0Athe=20following=20microbenchmarks:=0A= =0A(define=20A=20(make-shared-array=20#0(1)=20(const=20'())=20#e1e7))=0A= ;=201,=202,=203=20arguments.=0A(define=20a=200)=20,time=20= (array-for-each=20(lambda=20(b)=20(set!=20a=20(+=20a=20b)))=20A)=0A= (define=20a=200)=20,time=20(array-for-each=20(lambda=20(b=20c)=20(set!=20= a=20(+=20a=20b=20c)))=20A=20A)=0A(define=20a=200)=20,time=20= (array-for-each=20(lambda=20(b=20c=20d)=20(set!=20a=20(+=20a=20b=20c=20= d)))=20A=20A=20A)=0A=0A(define=20A=20(make-shared-array=20(make-array=20= 1)=20(const=20'())=20#e1e7))=0A(define=20B=20(make-shared-array=20#0(1)=20= (const=20'())=20#e1e7))=0A;=201,=202,=203=20arguments.=0A,time=20= (array-map!=20A=20+=20B)=0A,time=20(array-map!=20A=20+=20B=20B)=0A,time=20= (array-map!=20A=20+=20B=20B=20B)=0A=0A*=20libguile/array-map.c=20= (scm_ramap):=20Note=20on=20cproc=20arguments.=0A=0A=20=20(rafill):=20= Assume=20that=20dst's=20lbnd=20is=200.=0A=0A=20=20(racp):=20Assume=20= that=20src's=20lbnd=20is=200.=0A=0A=20=20(ramap):=20Assume=20that=20= ra0's=20lbnd=20is=200.=20When=20there're=20more=20than=20two=0A=20=20= arguments,=20compute=20the=20array=20handles=20before=20the=20loop.=20= Allocate=20the=20arg=0A=20=20list=20once=20and=20reuse=20it=20in=20the=20= loop.=0A=0A=20=20(rafe):=20Do=20as=20in=20ramap(),=20when=20there's=20= more=20than=20one=20argument.=0A=0A=20=20(AREF,=20ASET):=20Remove.=0A---=0A= =20libguile/array-map.c=20=20=20=20=20=20=20=20|=20136=20= ++++++++++++++++++++++++--------------------=0A=20libguile/array-map.h=20= =20=20=20=20=20=20=20|=20=20=202=20+-=0A=20test-suite/tests/ramap.test=20= |=20=20=204=20+-=0A=203=20files=20changed,=2077=20insertions(+),=2065=20= deletions(-)=0A=0Adiff=20--git=20a/libguile/array-map.c=20= b/libguile/array-map.c=0Aindex=20587df02..9caded8=20100644=0A---=20= a/libguile/array-map.c=0A+++=20b/libguile/array-map.c=0A@@=20-1,5=20+1,5=20= @@=0A=20/*=20Copyright=20(C)=201996,=201998,=202000,=202001,=202004,=20= 2005,=202006,=202008,=202009,=0A-=20*=20=20=202010,=202011,=202012,=20= 2013,=202014=20Free=20Software=20Foundation,=20Inc.=0A+=20*=20=20=20= 2010,=202011,=202012,=202013,=202014,=202015=20Free=20Software=20= Foundation,=20Inc.=0A=20=20*=0A=20=20*=20This=20library=20is=20free=20= software;=20you=20can=20redistribute=20it=20and/or=0A=20=20*=20modify=20= it=20under=20the=20terms=20of=20the=20GNU=20Lesser=20General=20Public=20= License=0A@@=20-48,18=20+48,6=20@@=0A=20static=20const=20char=20= vi_gc_hint[]=20=3D=20"array-indices";=0A=20=0A=20static=20SCM=0A-AREF=20= (SCM=20v,=20size_t=20pos)=0A-{=0A-=20=20return=20scm_c_array_ref_1=20(v,=20= pos);=0A-}=0A-=0A-static=20void=0A-ASET=20(SCM=20v,=20size_t=20pos,=20= SCM=20val)=0A-{=0A-=20=20scm_c_array_set_1_x=20(v,=20val,=20pos);=0A-}=0A= -=0A-static=20SCM=0A=20make1array=20(SCM=20v,=20ssize_t=20inc)=0A=20{=0A=20= =20=20SCM=20a=20=3D=20scm_i_make_array=20(1);=0A@@=20-99,6=20+87,10=20@@=20= cindk=20(SCM=20ra,=20ssize_t=20*ve,=20int=20kend)=0A=20#define=20= LBND(ra,=20k)=20SCM_I_ARRAY_DIMS=20(ra)[k].lbnd=0A=20#define=20UBND(ra,=20= k)=20SCM_I_ARRAY_DIMS=20(ra)[k].ubnd=0A=20=0A+=0A+/*=20scm_ramapc()=20= always=20calls=20cproc=20with=20rank-1=20arrays=20created=20by=0A+=20=20=20= make1array.=20cproc=20(rafe,=20ramap,=20rafill,=20racp)=20can=20assume=20= that=20the=0A+=20=20=20dims[0].lbnd=20of=20these=20arrays=20is=20always=20= 0.=20*/=0A=20int=0A=20scm_ramapc=20(void=20*cproc_ptr,=20SCM=20data,=20= SCM=20ra0,=20SCM=20lra,=20const=20char=20*what)=0A=20{=0A@@=20-167,7=20= +159,7=20@@=20scm_ramapc=20(void=20*cproc_ptr,=20SCM=20data,=20SCM=20= ra0,=20SCM=20lra,=20const=20char=20*what)=0A=20=20=20=20=20=20=20=20=20=20= =20=20=20scm_misc_error=20(what,=20"array=20shape=20mismatch:=20~S",=20= scm_list_1=20(ra0));=0A=20=20=20=20=20=20=20=20=20=20=20va1=20=3D=20= make1array=20(ra1,=201);=0A=20=0A-=20=20=20=20=20=20=20=20=20=20if=20= (LBND=20(ra0,=200)=20<=20LBND=20(va1,=200)=20||=20UBND=20(ra0,=200)=20>=20= UBND=20(va1,=200))=0A+=20=20=20=20=20=20=20=20=20=20if=20(LBND=20(ra0,=20= 0)=20<=200=20/*=20LBND=20(va1,=200)=20*/=20||=20UBND=20(ra0,=200)=20>=20= UBND=20(va1,=200))=0A=20=20=20=20=20=20=20=20=20=20=20=20=20= scm_misc_error=20(what,=20"array=20shape=20mismatch:=20~S",=20scm_list_1=20= (ra0));=0A=20=20=20=20=20=20=20=20=20}=0A=20=20=20=20=20=20=20*plva=20=3D=20= scm_cons=20(va1,=20SCM_EOL);=0A@@=20-224,14=20+216,12=20@@=20scm_ramapc=20= (void=20*cproc_ptr,=20SCM=20data,=20SCM=20ra0,=20SCM=20lra,=20const=20= char=20*what)=0A=20static=20int=0A=20rafill=20(SCM=20dst,=20SCM=20fill)=0A= =20{=0A+=20=20size_t=20n=20=3D=20SCM_I_ARRAY_DIMS=20(dst)->ubnd=20+=201;=0A= +=20=20size_t=20i=20=3D=20SCM_I_ARRAY_BASE=20(dst);=0A+=20=20ssize_t=20= inc=20=3D=20SCM_I_ARRAY_DIMS=20(dst)->inc;=0A=20=20=20scm_t_array_handle=20= h;=0A-=20=20size_t=20n,=20i;=0A-=20=20ssize_t=20inc;=0A-=20=20= scm_array_get_handle=20(SCM_I_ARRAY_V=20(dst),=20&h);=0A-=20=20i=20=3D=20= SCM_I_ARRAY_BASE=20(dst);=0A-=20=20inc=20=3D=20SCM_I_ARRAY_DIMS=20= (dst)->inc;=0A-=20=20n=20=3D=20(SCM_I_ARRAY_DIMS=20(dst)->ubnd=20-=20= SCM_I_ARRAY_DIMS=20(dst)->lbnd=20+=201);=0A=20=20=20dst=20=3D=20= SCM_I_ARRAY_V=20(dst);=0A+=20=20scm_array_get_handle=20(dst,=20&h);=0A=20= =0A=20=20=20for=20(;=20n--=20>=200;=20i=20+=3D=20inc)=0A=20=20=20=20=20= h.vset=20(h.vector,=20i,=20fill);=0A@@=20-255,19=20+245,17=20@@=20= SCM_DEFINE=20(scm_array_fill_x,=20"array-fill!",=202,=200,=200,=0A=20= static=20int=0A=20racp=20(SCM=20src,=20SCM=20dst)=0A=20{=0A-=20=20= scm_t_array_handle=20h_s,=20h_d;=0A-=20=20size_t=20n,=20i_s,=20i_d;=0A+=20= =20size_t=20i_s,=20i_d,=20n;=0A=20=20=20ssize_t=20inc_s,=20inc_d;=0A-=0A= +=20=20scm_t_array_handle=20h_s,=20h_d;=0A=20=20=20dst=20=3D=20SCM_CAR=20= (dst);=0A=20=20=20i_s=20=3D=20SCM_I_ARRAY_BASE=20(src);=0A=20=20=20i_d=20= =3D=20SCM_I_ARRAY_BASE=20(dst);=0A+=20=20n=20=3D=20(SCM_I_ARRAY_DIMS=20= (src)->ubnd=20+=201);=0A=20=20=20inc_s=20=3D=20SCM_I_ARRAY_DIMS=20= (src)->inc;=0A=20=20=20inc_d=20=3D=20SCM_I_ARRAY_DIMS=20(dst)->inc;=0A-=20= =20n=20=3D=20(SCM_I_ARRAY_DIMS=20(src)->ubnd=20-=20SCM_I_ARRAY_DIMS=20= (src)->lbnd=20+=201);=0A=20=20=20src=20=3D=20SCM_I_ARRAY_V=20(src);=0A=20= =20=20dst=20=3D=20SCM_I_ARRAY_V=20(dst);=0A-=0A=20=20=20= scm_array_get_handle=20(src,=20&h_s);=0A=20=20=20scm_array_get_handle=20= (dst,=20&h_d);=0A=20=0A@@=20-310,44=20+298,56=20@@=20SCM_DEFINE=20= (scm_array_copy_x,=20"array-copy!",=202,=200,=200,=0A=20static=20int=0A=20= ramap=20(SCM=20ra0,=20SCM=20proc,=20SCM=20ras)=0A=20{=0A+=20=20size_t=20= i0=20=3D=20SCM_I_ARRAY_BASE=20(ra0);=0A+=20=20ssize_t=20inc0=20=3D=20= SCM_I_ARRAY_DIMS=20(ra0)->inc;=0A+=20=20size_t=20n=20=3D=20= SCM_I_ARRAY_DIMS=20(ra0)->ubnd=20+=201;=0A=20=20=20scm_t_array_handle=20= h0;=0A-=20=20size_t=20n,=20i0;=0A-=20=20ssize_t=20i,=20inc0;=0A-=20=20i0=20= =3D=20SCM_I_ARRAY_BASE=20(ra0);=0A-=20=20inc0=20=3D=20SCM_I_ARRAY_DIMS=20= (ra0)->inc;=0A-=20=20i=20=3D=20SCM_I_ARRAY_DIMS=20(ra0)->lbnd;=0A-=20=20= n=20=3D=20SCM_I_ARRAY_DIMS=20(ra0)->ubnd=20-=20i=20+=201;=0A=20=20=20ra0=20= =3D=20SCM_I_ARRAY_V=20(ra0);=0A=20=20=20scm_array_get_handle=20(ra0,=20= &h0);=0A+=0A=20=20=20if=20(scm_is_null=20(ras))=0A=20=20=20=20=20for=20= (;=20n--;=20i0=20+=3D=20inc0)=0A=20=20=20=20=20=20=20h0.vset=20= (h0.vector,=20i0,=20scm_call_0=20(proc));=0A=20=20=20else=0A=20=20=20=20=20= {=0A=20=20=20=20=20=20=20SCM=20ra1=20=3D=20SCM_CAR=20(ras);=0A+=20=20=20=20= =20=20size_t=20i1=20=3D=20SCM_I_ARRAY_BASE=20(ra1);=0A+=20=20=20=20=20=20= ssize_t=20inc1=20=3D=20SCM_I_ARRAY_DIMS=20(ra1)->inc;=0A=20=20=20=20=20=20= =20scm_t_array_handle=20h1;=0A-=20=20=20=20=20=20size_t=20i1;=0A-=20=20=20= =20=20=20ssize_t=20inc1;=0A-=20=20=20=20=20=20i1=20=3D=20= SCM_I_ARRAY_BASE=20(ra1);=0A-=20=20=20=20=20=20inc1=20=3D=20= SCM_I_ARRAY_DIMS=20(ra1)->inc;=0A-=20=20=20=20=20=20ras=20=3D=20SCM_CDR=20= (ras);=0A=20=20=20=20=20=20=20ra1=20=3D=20SCM_I_ARRAY_V=20(ra1);=0A=20=20= =20=20=20=20=20scm_array_get_handle=20(ra1,=20&h1);=0A+=20=20=20=20=20=20= ras=20=3D=20SCM_CDR=20(ras);=0A=20=20=20=20=20=20=20if=20(scm_is_null=20= (ras))=0A=20=20=20=20=20=20=20=20=20for=20(;=20n--;=20i0=20+=3D=20inc0,=20= i1=20+=3D=20inc1)=0A=20=20=20=20=20=20=20=20=20=20=20h0.vset=20= (h0.vector,=20i0,=20scm_call_1=20(proc,=20h1.vref=20(h1.vector,=20i1)));=0A= =20=20=20=20=20=20=20else=0A=20=20=20=20=20=20=20=20=20{=0A-=20=20=20=20=20= =20=20=20=20=20ras=20=3D=20scm_vector=20(ras);=0A-=20=20=20=20=20=20=20=20= =20=20for=20(;=20n--;=20i0=20+=3D=20inc0,=20i1=20+=3D=20inc1,=20++i)=0A+=20= =20=20=20=20=20=20=20=20=20scm_t_array_handle=20*hs;=0A+=20=20=20=20=20=20= =20=20=20=20size_t=20restn=20=3D=20scm_ilength=20(ras);=0A+=0A+=20=20=20=20= =20=20=20=20=20=20SCM=20args=20=3D=20SCM_EOL;=0A+=20=20=20=20=20=20=20=20= =20=20SCM=20*p=20=3D=20&args;=0A+=20=20=20=20=20=20=20=20=20=20SCM=20= **sa=20=3D=20scm_gc_malloc=20(sizeof(SCM=20*)=20*=20restn,=20= vi_gc_hint);=0A+=20=20=20=20=20=20=20=20=20=20for=20(size_t=20k=20=3D=20= 0;=20k=20<=20restn;=20++k)=0A+=20=20=20=20=20=20=20=20=20=20=20=20{=0A+=20= =20=20=20=20=20=20=20=20=20=20=20=20=20*p=20=3D=20scm_cons=20= (SCM_UNSPECIFIED,=20SCM_EOL);=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20= sa[k]=20=3D=20SCM_CARLOC=20(*p);=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20= =20p=20=3D=20SCM_CDRLOC=20(*p);=0A+=20=20=20=20=20=20=20=20=20=20=20=20}=0A= +=0A+=20=20=20=20=20=20=20=20=20=20hs=20=3D=20scm_gc_malloc=20= (sizeof(scm_t_array_handle)=20*=20restn,=20vi_gc_hint);=0A+=20=20=20=20=20= =20=20=20=20=20for=20(size_t=20k=20=3D=200;=20k=20<=20restn;=20++k,=20= ras=20=3D=20scm_cdr=20(ras))=0A+=20=20=20=20=20=20=20=20=20=20=20=20= scm_array_get_handle=20(scm_car=20(ras),=20hs+k);=0A+=0A+=20=20=20=20=20=20= =20=20=20=20for=20(ssize_t=20i=20=3D=200;=20n--;=20i0=20+=3D=20inc0,=20= i1=20+=3D=20inc1,=20++i)=0A=20=20=20=20=20=20=20=20=20=20=20=20=20{=0A-=20= =20=20=20=20=20=20=20=20=20=20=20=20=20SCM=20args=20=3D=20SCM_EOL;=0A-=20= =20=20=20=20=20=20=20=20=20=20=20=20=20unsigned=20long=20k;=0A-=20=20=20=20= =20=20=20=20=20=20=20=20=20=20for=20(k=20=3D=20scm_c_vector_length=20= (ras);=20k--;)=0A-=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20args=20= =3D=20scm_cons=20(AREF=20(scm_c_vector_ref=20(ras,=20k),=20i),=20args);=0A= -=20=20=20=20=20=20=20=20=20=20=20=20=20=20h0.vset=20(h0.vector,=20i0,=0A= -=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= scm_apply_1=20(proc,=20h1.vref=20(h1.vector,=20i1),=20args));=0A+=20=20=20= =20=20=20=20=20=20=20=20=20=20=20for=20(size_t=20k=20=3D=200;=20k=20<=20= restn;=20++k)=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= *(sa[k])=20=3D=20scm_array_handle_ref=20(hs+k,=20i*hs[k].dims[0].inc);=0A= +=20=20=20=20=20=20=20=20=20=20=20=20=20=20h0.vset=20(h0.vector,=20i0,=20= scm_apply_1=20(proc,=20h1.vref=20(h1.vector,=20i1),=20args));=0A=20=20=20= =20=20=20=20=20=20=20=20=20=20}=0A+=0A+=20=20=20=20=20=20=20=20=20=20for=20= (size_t=20k=20=3D=200;=20k=20<=20restn;=20++k)=0A+=20=20=20=20=20=20=20=20= =20=20=20=20scm_array_handle_release=20(hs+k);=0A=20=20=20=20=20=20=20=20= =20}=0A=20=20=20=20=20=20=20scm_array_handle_release=20(&h1);=0A=20=20=20= =20=20}=0A@@=20-384,30=20+384,44=20@@=20SCM_DEFINE=20(scm_array_map_x,=20= "array-map!",=202,=200,=201,=0A=20static=20int=0A=20rafe=20(SCM=20ra0,=20= SCM=20proc,=20SCM=20ras)=0A=20{=0A-=20=20ssize_t=20i=20=3D=20= SCM_I_ARRAY_DIMS=20(ra0)->lbnd;=0A-=20=20size_t=20n=20=3D=20= SCM_I_ARRAY_DIMS=20(ra0)->ubnd=20-=20i=20+=201;=0A-=0A+=20=20size_t=20i0=20= =3D=20SCM_I_ARRAY_BASE=20(ra0);=0A+=20=20ssize_t=20inc0=20=3D=20= SCM_I_ARRAY_DIMS=20(ra0)->inc;=0A+=20=20size_t=20n=20=3D=20= SCM_I_ARRAY_DIMS=20(ra0)->ubnd=20+=201;=0A=20=20=20scm_t_array_handle=20= h0;=0A-=20=20size_t=20i0;=0A-=20=20ssize_t=20inc0;=0A-=20=20i0=20=3D=20= SCM_I_ARRAY_BASE=20(ra0);=0A-=20=20inc0=20=3D=20SCM_I_ARRAY_DIMS=20= (ra0)->inc;=0A=20=20=20ra0=20=3D=20SCM_I_ARRAY_V=20(ra0);=0A=20=20=20= scm_array_get_handle=20(ra0,=20&h0);=0A+=0A=20=20=20if=20(scm_is_null=20= (ras))=0A=20=20=20=20=20for=20(;=20n--;=20i0=20+=3D=20inc0)=0A=20=20=20=20= =20=20=20scm_call_1=20(proc,=20h0.vref=20(h0.vector,=20i0));=0A=20=20=20= else=0A=20=20=20=20=20{=0A-=20=20=20=20=20=20ras=20=3D=20scm_vector=20= (ras);=0A-=20=20=20=20=20=20for=20(;=20n--;=20i0=20+=3D=20inc0,=20++i)=0A= +=20=20=20=20=20=20scm_t_array_handle=20*hs;=20=20=20=20=20=20=0A+=20=20=20= =20=20=20size_t=20restn=20=3D=20scm_ilength=20(ras);=0A+=0A+=20=20=20=20=20= =20SCM=20args=20=3D=20SCM_EOL;=0A+=20=20=20=20=20=20SCM=20*p=20=3D=20= &args;=0A+=20=20=20=20=20=20SCM=20**sa=20=3D=20scm_gc_malloc=20= (sizeof(SCM=20*)=20*=20restn,=20vi_gc_hint);=0A+=20=20=20=20=20=20for=20= (size_t=20k=20=3D=200;=20k=20<=20restn;=20++k)=0A=20=20=20=20=20=20=20=20= =20{=0A-=20=20=20=20=20=20=20=20=20=20SCM=20args=20=3D=20SCM_EOL;=0A-=20=20= =20=20=20=20=20=20=20=20unsigned=20long=20k;=0A-=20=20=20=20=20=20=20=20=20= =20for=20(k=20=3D=20scm_c_vector_length=20(ras);=20k--;)=0A-=20=20=20=20=20= =20=20=20=20=20=20=20args=20=3D=20scm_cons=20(AREF=20(scm_c_vector_ref=20= (ras,=20k),=20i),=20args);=0A+=20=20=20=20=20=20=20=20=20=20*p=20=3D=20= scm_cons=20(SCM_UNSPECIFIED,=20SCM_EOL);=0A+=20=20=20=20=20=20=20=20=20=20= sa[k]=20=3D=20SCM_CARLOC=20(*p);=0A+=20=20=20=20=20=20=20=20=20=20p=20=3D=20= SCM_CDRLOC=20(*p);=0A+=20=20=20=20=20=20=20=20}=0A+=0A+=20=20=20=20=20=20= hs=20=3D=20scm_gc_malloc=20(sizeof(scm_t_array_handle)=20*=20restn,=20= vi_gc_hint);=0A+=20=20=20=20=20=20for=20(size_t=20k=20=3D=200;=20k=20<=20= restn;=20++k,=20ras=20=3D=20scm_cdr=20(ras))=0A+=20=20=20=20=20=20=20=20= scm_array_get_handle=20(scm_car=20(ras),=20hs+k);=0A+=0A+=20=20=20=20=20=20= for=20(ssize_t=20i=20=3D=200;=20n--;=20i0=20+=3D=20inc0,=20++i)=0A+=20=20= =20=20=20=20=20=20{=0A+=20=20=20=20=20=20=20=20=20=20for=20(size_t=20k=20= =3D=200;=20k=20<=20restn;=20++k)=0A+=20=20=20=20=20=20=20=20=20=20=20=20= *(sa[k])=20=3D=20scm_array_handle_ref=20(hs+k,=20i*hs[k].dims[0].inc);=0A= =20=20=20=20=20=20=20=20=20=20=20scm_apply_1=20(proc,=20h0.vref=20= (h0.vector,=20i0),=20args);=0A=20=20=20=20=20=20=20=20=20}=0A+=0A+=20=20=20= =20=20=20for=20(size_t=20k=20=3D=200;=20k=20<=20restn;=20++k)=0A+=20=20=20= =20=20=20=20=20scm_array_handle_release=20(hs+k);=0A=20=20=20=20=20}=0A=20= =20=20scm_array_handle_release=20(&h0);=0A=20=20=20return=201;=0A@@=20= -445,15=20+459,12=20@@=20static=20void=0A=20array_index_map_n=20(SCM=20= ra,=20SCM=20proc)=0A=20{=0A=20=20=20scm_t_array_handle=20h;=0A-=20=20= size_t=20i;=0A=20=20=20int=20k,=20kmax=20=3D=20SCM_I_ARRAY_NDIM=20(ra)=20= -=201;=0A-=20=20ssize_t=20*vi;=0A-=20=20SCM=20**si;=0A=20=20=20SCM=20= args=20=3D=20SCM_EOL;=0A=20=20=20SCM=20*p=20=3D=20&args;=0A=20=0A-=20=20= vi=20=3D=20scm_gc_malloc_pointerless=20(sizeof(ssize_t)=20*=20(kmax=20+=20= 1),=20vi_gc_hint);=0A-=20=20si=20=3D=20scm_gc_malloc_pointerless=20= (sizeof(SCM=20*)=20*=20(kmax=20+=201),=20vi_gc_hint);=0A+=20=20ssize_t=20= *vi=20=3D=20scm_gc_malloc_pointerless=20(sizeof(ssize_t)=20*=20(kmax=20+=20= 1),=20vi_gc_hint);=0A+=20=20SCM=20**si=20=3D=20scm_gc_malloc_pointerless=20= (sizeof(SCM=20*)=20*=20(kmax=20+=201),=20vi_gc_hint);=0A=20=0A=20=20=20= for=20(k=20=3D=200;=20k=20<=3D=20kmax;=20k++)=0A=20=20=20=20=20{=0A@@=20= -471,6=20+482,7=20@@=20array_index_map_n=20(SCM=20ra,=20SCM=20proc)=0A=20= =20=20=20=20{=0A=20=20=20=20=20=20=20if=20(k=20=3D=3D=20kmax)=0A=20=20=20= =20=20=20=20=20=20{=0A+=20=20=20=20=20=20=20=20=20=20size_t=20i;=0A=20=20= =20=20=20=20=20=20=20=20=20vi[kmax]=20=3D=20SCM_I_ARRAY_DIMS=20= (ra)[kmax].lbnd;=0A=20=20=20=20=20=20=20=20=20=20=20i=20=3D=20cindk=20= (ra,=20vi,=20kmax+1);=0A=20=20=20=20=20=20=20=20=20=20=20for=20(;=20= vi[kmax]=20<=3D=20SCM_I_ARRAY_DIMS=20(ra)[kmax].ubnd;=20++vi[kmax])=0A= diff=20--git=20a/libguile/array-map.h=20b/libguile/array-map.h=0Aindex=20= e7431b1..cb18a62=20100644=0A---=20a/libguile/array-map.h=0A+++=20= b/libguile/array-map.h=0A@@=20-4,7=20+4,7=20@@=0A=20#define=20= SCM_ARRAY_MAP_H=0A=20=0A=20/*=20Copyright=20(C)=201995,=201996,=201997,=20= 2000,=202006,=202008,=202009,=202010,=0A-=20*=20=20=202011,=202013=20= Free=20Software=20Foundation,=20Inc.=0A+=20*=20=20=202011,=202013,=20= 2015=20Free=20Software=20Foundation,=20Inc.=0A=20=20*=0A=20=20*=20This=20= library=20is=20free=20software;=20you=20can=20redistribute=20it=20and/or=0A= =20=20*=20modify=20it=20under=20the=20terms=20of=20the=20GNU=20Lesser=20= General=20Public=20License=0Adiff=20--git=20= a/test-suite/tests/ramap.test=20b/test-suite/tests/ramap.test=0Aindex=20= c8eaf96..bd8a434=20100644=0A---=20a/test-suite/tests/ramap.test=0A+++=20= b/test-suite/tests/ramap.test=0A@@=20-453,11=20+453,11=20@@=0A=20=0A=20=20= =20(with-test-prefix=20"3=20sources"=0A=20=20=20=20=20(pass-if-equal=20= "noncompact=20arrays=201"=0A-=20=20=20=20=20=20=20=20'((3=203=203)=20(2=20= 2=202))=0A+=20=20=20=20=20=20=20=20'((3=201=203)=20(2=200=202))=0A=20=20=20= =20=20=20=20(let*=20((a=20#2((0=201)=20(2=203)))=0A=20=20=20=20=20=20=20=20= =20=20=20=20=20=20(l=20'())=0A=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (rec=20(lambda=20args=20(set!=20l=20(cons=20args=20l)))))=0A-=20=20=20=20= =20=20=20=20(array-for-each=20rec=20(array-row=20a=201)=20(array-row=20a=20= 1)=20(array-row=20a=201))=0A+=20=20=20=20=20=20=20=20(array-for-each=20= rec=20(array-row=20a=201)=20(array-row=20a=200)=20(array-row=20a=201))=0A= =20=20=20=20=20=20=20=20=20l))=0A=20=0A=20=20=20=20=20(pass-if-equal=20= "noncompact=20arrays=202"=0A--=20=0A2.7.3=0A=0A= --Apple-Mail=_C05A2854-9EDB-476D-AE5C-EF5B1F5E02F5 Content-Disposition: attachment; filename=0009-Special-case-for-array-map-with-three-arguments.patch Content-Type: application/octet-stream; name="0009-Special-case-for-array-map-with-three-arguments.patch" Content-Transfer-Encoding: quoted-printable =46rom=20475b365631bf06e601ebc0da1f4e763c4396e39d=20Mon=20Sep=2017=20= 00:00:00=202001=0AFrom:=20Daniel=20Llorens=20=0A= Date:=20Wed,=209=20Dec=202015=2013:10:48=20+0100=0ASubject:=20[PATCH=20= 09/11]=20Special=20case=20for=20array-map!=20with=20three=20arguments=0A=0A= Benchmark:=0A=0A(define=20type=20#t)=0A(define=20A=20(make-typed-array=20= 's32=200=2010000=201000))=0A(define=20B=20(make-typed-array=20's32=200=20= 10000=201000))=0A(define=20C=20(make-typed-array=20's32=200=2010000=20= 1000))=0A=0Abefore:=0A=0Ascheme@(guile-user)>=20,time=20(array-map!=20C=20= +=20A=20B)=0A;;=200.792653s=20real=20time,=200.790970s=20run=20time.=20=20= 0.000000s=20spent=20in=20GC.=0A=0Aafter:=0A=0Ascheme@(guile-user)>=20= ,time=20(array-map!=20C=20+=20A=20B)=0A;;=200.598513s=20real=20time,=20= 0.597146s=20run=20time.=20=200.000000s=20spent=20in=20GC.=0A=0A*=20= libguile/array-map.c=20(ramap):=20Add=20special=20case=20with=203=20= arguments.=0A---=0A=20libguile/array-map.c=20|=2060=20= +++++++++++++++++++++++++++++++++-------------------=0A=201=20file=20= changed,=2038=20insertions(+),=2022=20deletions(-)=0A=0Adiff=20--git=20= a/libguile/array-map.c=20b/libguile/array-map.c=0Aindex=20= 9caded8..01bebb8=20100644=0A---=20a/libguile/array-map.c=0A+++=20= b/libguile/array-map.c=0A@@=20-322,32=20+322,48=20@@=20ramap=20(SCM=20= ra0,=20SCM=20proc,=20SCM=20ras)=0A=20=20=20=20=20=20=20=20=20=20=20= h0.vset=20(h0.vector,=20i0,=20scm_call_1=20(proc,=20h1.vref=20= (h1.vector,=20i1)));=0A=20=20=20=20=20=20=20else=0A=20=20=20=20=20=20=20=20= =20{=0A-=20=20=20=20=20=20=20=20=20=20scm_t_array_handle=20*hs;=0A-=20=20= =20=20=20=20=20=20=20=20size_t=20restn=20=3D=20scm_ilength=20(ras);=0A-=0A= -=20=20=20=20=20=20=20=20=20=20SCM=20args=20=3D=20SCM_EOL;=0A-=20=20=20=20= =20=20=20=20=20=20SCM=20*p=20=3D=20&args;=0A-=20=20=20=20=20=20=20=20=20=20= SCM=20**sa=20=3D=20scm_gc_malloc=20(sizeof(SCM=20*)=20*=20restn,=20= vi_gc_hint);=0A-=20=20=20=20=20=20=20=20=20=20for=20(size_t=20k=20=3D=20= 0;=20k=20<=20restn;=20++k)=0A+=20=20=20=20=20=20=20=20=20=20SCM=20ra2=20= =3D=20SCM_CAR=20(ras);=0A+=20=20=20=20=20=20=20=20=20=20size_t=20i2=20=3D=20= SCM_I_ARRAY_BASE=20(ra2);=0A+=20=20=20=20=20=20=20=20=20=20ssize_t=20= inc2=20=3D=20SCM_I_ARRAY_DIMS=20(ra2)->inc;=0A+=20=20=20=20=20=20=20=20=20= =20scm_t_array_handle=20h2;=0A+=20=20=20=20=20=20=20=20=20=20ra2=20=3D=20= SCM_I_ARRAY_V=20(ra2);=0A+=20=20=20=20=20=20=20=20=20=20= scm_array_get_handle=20(ra2,=20&h2);=0A+=20=20=20=20=20=20=20=20=20=20= ras=20=3D=20SCM_CDR=20(ras);=0A+=20=20=20=20=20=20=20=20=20=20if=20= (scm_is_null=20(ras))=0A+=20=20=20=20=20=20=20=20=20=20=20=20for=20(;=20= n--;=20i0=20+=3D=20inc0,=20i1=20+=3D=20inc1,=20i2=20+=3D=20inc2)=0A+=20=20= =20=20=20=20=20=20=20=20=20=20=20=20h0.vset=20(h0.vector,=20i0,=20= scm_call_2=20(proc,=20h1.vref=20(h1.vector,=20i1),=20h2.vref=20= (h2.vector,=20i2)));=0A+=20=20=20=20=20=20=20=20=20=20else=0A=20=20=20=20= =20=20=20=20=20=20=20=20=20{=0A-=20=20=20=20=20=20=20=20=20=20=20=20=20=20= *p=20=3D=20scm_cons=20(SCM_UNSPECIFIED,=20SCM_EOL);=0A-=20=20=20=20=20=20= =20=20=20=20=20=20=20=20sa[k]=20=3D=20SCM_CARLOC=20(*p);=0A-=20=20=20=20=20= =20=20=20=20=20=20=20=20=20p=20=3D=20SCM_CDRLOC=20(*p);=0A-=20=20=20=20=20= =20=20=20=20=20=20=20}=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20= scm_t_array_handle=20*hs;=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20= size_t=20restn=20=3D=20scm_ilength=20(ras);=0A+=20=20=20=20=20=20=20=20=20= =20=20=20=20=20SCM=20args=20=3D=20SCM_EOL;=0A+=20=20=20=20=20=20=20=20=20= =20=20=20=20=20SCM=20*p=20=3D=20&args;=0A+=20=20=20=20=20=20=20=20=20=20=20= =20=20=20SCM=20**sa=20=3D=20scm_gc_malloc=20(sizeof(SCM=20*)=20*=20= restn,=20vi_gc_hint);=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20= size_t=20k;=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20ssize_t=20i;=0A= +=20=20=20=20=20=20=20=20=20=20=20=20=20=20=0A+=20=20=20=20=20=20=20=20=20= =20=20=20=20=20for=20(k=20=3D=200;=20k=20<=20restn;=20++k)=0A+=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20{=0A+=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20*p=20=3D=20scm_cons=20(SCM_UNSPECIFIED,=20SCM_EOL);=0A= +=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20sa[k]=20=3D=20= SCM_CARLOC=20(*p);=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20p=20=3D=20SCM_CDRLOC=20(*p);=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20}=0A=20=0A-=20=20=20=20=20=20=20=20=20=20hs=20=3D=20= scm_gc_malloc=20(sizeof(scm_t_array_handle)=20*=20restn,=20vi_gc_hint);=0A= -=20=20=20=20=20=20=20=20=20=20for=20(size_t=20k=20=3D=200;=20k=20<=20= restn;=20++k,=20ras=20=3D=20scm_cdr=20(ras))=0A-=20=20=20=20=20=20=20=20=20= =20=20=20scm_array_get_handle=20(scm_car=20(ras),=20hs+k);=0A+=20=20=20=20= =20=20=20=20=20=20=20=20=20=20hs=20=3D=20scm_gc_malloc=20= (sizeof(scm_t_array_handle)=20*=20restn,=20vi_gc_hint);=0A+=20=20=20=20=20= =20=20=20=20=20=20=20=20=20for=20(k=20=3D=200;=20k=20<=20restn;=20++k,=20= ras=20=3D=20scm_cdr=20(ras))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20scm_array_get_handle=20(scm_car=20(ras),=20hs+k);=0A=20=0A-=20=20=20= =20=20=20=20=20=20=20for=20(ssize_t=20i=20=3D=200;=20n--;=20i0=20+=3D=20= inc0,=20i1=20+=3D=20inc1,=20++i)=0A-=20=20=20=20=20=20=20=20=20=20=20=20= {=0A-=20=20=20=20=20=20=20=20=20=20=20=20=20=20for=20(size_t=20k=20=3D=20= 0;=20k=20<=20restn;=20++k)=0A-=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20*(sa[k])=20=3D=20scm_array_handle_ref=20(hs+k,=20= i*hs[k].dims[0].inc);=0A-=20=20=20=20=20=20=20=20=20=20=20=20=20=20= h0.vset=20(h0.vector,=20i0,=20scm_apply_1=20(proc,=20h1.vref=20= (h1.vector,=20i1),=20args));=0A-=20=20=20=20=20=20=20=20=20=20=20=20}=0A= +=20=20=20=20=20=20=20=20=20=20=20=20=20=20for=20(i=20=3D=200;=20n--;=20= i0=20+=3D=20inc0,=20i1=20+=3D=20inc1,=20i2=20+=3D=20inc2,=20++i)=0A+=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20{=0A+=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20for=20(k=20=3D=200;=20k=20<=20restn;=20++k)=0A= +=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20*(sa[k])=20= =3D=20scm_array_handle_ref=20(hs+k,=20i*hs[k].dims[0].inc);=0A+=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20h0.vset=20(h0.vector,=20i0,=20= scm_apply_2=20(proc,=20h1.vref=20(h1.vector,=20i1),=20h2.vref=20= (h2.vector,=20i2),=20args));=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20}=0A=20=0A-=20=20=20=20=20=20=20=20=20=20for=20(size_t=20k=20=3D=20= 0;=20k=20<=20restn;=20++k)=0A-=20=20=20=20=20=20=20=20=20=20=20=20= scm_array_handle_release=20(hs+k);=0A+=20=20=20=20=20=20=20=20=20=20=20=20= =20=20for=20(k=20=3D=200;=20k=20<=20restn;=20++k)=0A+=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20scm_array_handle_release=20(hs+k);=0A+=20=20=20= =20=20=20=20=20=20=20=20=20}=0A+=20=20=20=20=20=20=20=20=20=20= scm_array_handle_release=20(&h2);=0A=20=20=20=20=20=20=20=20=20}=0A=20=20= =20=20=20=20=20scm_array_handle_release=20(&h1);=0A=20=20=20=20=20}=0A--=20= =0A2.7.3=0A=0A= --Apple-Mail=_C05A2854-9EDB-476D-AE5C-EF5B1F5E02F5 Content-Disposition: attachment; filename=0010-New-functions-array-from-array-from-array-amend.patch Content-Type: application/octet-stream; name="0010-New-functions-array-from-array-from-array-amend.patch" Content-Transfer-Encoding: quoted-printable =46rom=20a1e57225689af768fbab06dcbce43360a299eaaa=20Mon=20Sep=2017=20= 00:00:00=202001=0AFrom:=20Daniel=20Llorens=20=0A= Date:=20Wed,=2011=20Feb=202015=2016:44:21=20+0100=0ASubject:=20[PATCH=20= 10/11]=20New=20functions=20array-from,=20array-from*,=20array-amend!=0A=0A= *=20libguile/arrays.h=20(scm_array_from,=20scm_array_from_s,=0A=20=20= scm_array_amend_x):=20New=20declarations.=0A=0A*=20libguile/arrays.c=20= (scm_array_from,=20scm_array_from_s,=0A=20=20scm_array_amend_x):=20New=20= functions,=20export=20as=20array-from,=20array-from*,=0A=20=20= array-amend!.=0A=0A*=20test-suite/tests/arrays.test:=20Tests=20for=20= array-from,=20array-from*,=0A=20=20array-amend!.=0A=0A*=20= doc/ref/api-compound.texi:=20Document=20array-from,=20array-from*,=0A=20=20= array-amend!.=0A---=0A=20doc/ref/api-compound.texi=20=20=20=20|=20105=20= ++++++++++++++++++++++++++++=0A=20libguile/arrays.c=20=20=20=20=20=20=20=20= =20=20=20=20|=20158=20+++++++++++++++++++++++++++++++++++++++++++=0A=20= libguile/arrays.h=20=20=20=20=20=20=20=20=20=20=20=20|=20=20=206=20++=0A=20= test-suite/tests/arrays.test=20|=20109=20+++++++++++++++++++++++++++++=0A= =204=20files=20changed,=20378=20insertions(+)=0A=0Adiff=20--git=20= a/doc/ref/api-compound.texi=20b/doc/ref/api-compound.texi=0Aindex=20= cc9eef4..d17c4bf=20100644=0A---=20a/doc/ref/api-compound.texi=0A+++=20= b/doc/ref/api-compound.texi=0A@@=20-1676,6=20+1676,111=20@@=20base=20and=20= stride=20for=20new=20array=20indices=20in=20@var{oldarray}=20data.=20=20= A=20few=0A=20sample=20points=20are=20enough=20because=20@var{mapfunc}=20= is=20linear.=0A=20@end=20deffn=0A=20=0A+=0A+@deffn=20{Scheme=20= Procedure}=20array-ref=20array=20idx=20@dots{}=0A+@deffnx=20{C=20= Function}=20scm_array_ref=20(array,=20idxlist)=0A+Return=20the=20element=20= at=20@code{(idx=20@dots{})}=20in=20@var{array}.=0A+@end=20deffn=0A+=0A= +@deffn=20{Scheme=20Procedure}=20array-from=20array=20idx=20@dots{}=0A= +@deffnx=20{C=20Function}=20scm_array_from=20(array,=20idxlist)=0A+If=20= the=20length=20of=20@var{idxlist}=20equals=20the=20rank=20@math{n}=20of=0A= +@var{array},=20return=20the=20element=20at=20@code{(idx=20@dots{})},=20= just=20like=0A+@code{(array-ref=20array=20idx=20@dots{})}.=20If,=20= however,=20the=20length=20@math{k}=0A+of=20@var{idxlist}=20is=20shorter=20= than=20@math{n},=20then=20return=20the=20shared=0A+@math{(n-k)}-rank=20= prefix=20cell=20of=20@var{array}=20given=20by=20@var{idxlist}.=0A+=0A= +For=20example:=0A+=0A+@example=0A+@lisp=0A+(array-from=20#2((a=20b)=20= (c=20d))=200)=20@result{}=20#(a=20b)=0A+(array-from=20#2((a=20b)=20(c=20= d))=201)=20@result{}=20#(c=20d)=0A+(array-from=20#2((a=20b)=20(c=20d))=20= 1=201)=20@result{}=20d=0A+(array-from=20#2((a=20b)=20(c=20d)))=20= @result{}=20#2((a=20b)=20(c=20d))=0A+@end=20lisp=0A+@end=20example=0A+=0A= +@code{(apply=20array-from=20array=20indices)}=20is=20equivalent=20to=0A= +=0A+@lisp=0A+(let=20((len=20(length=20indices)))=0A+=20=20(if=20(=3D=20= (array-rank=20a)=20len)=0A+=20=20=20=20(apply=20array-ref=20a=20indices)=0A= +=20=20=20=20(apply=20make-shared-array=20a=0A+=20=20=20=20=20=20=20=20=20= =20=20(lambda=20t=20(append=20indices=20t))=0A+=20=20=20=20=20=20=20=20=20= =20=20(drop=20(array-dimensions=20a)=20len))))=0A+@end=20lisp=0A+=0A+The=20= name=20`from'=20comes=20from=20the=20J=20language.=0A+@end=20deffn=0A+=0A= +@deffn=20{Scheme=20Procedure}=20array-from*=20array=20idx=20@dots{}=0A= +@deffnx=20{C=20Function}=20scm_array_from_s=20(array,=20idxlist)=0A= +Like=20@code{(array-from=20array=20idx=20@dots{})},=20but=20return=20a=20= 0-rank=20shared=0A+array=20if=20the=20length=20of=20@var{idxlist}=20= matches=20the=20rank=20of=0A+@var{array}.=20This=20can=20be=20useful=20= when=20using=20@var{ARRAY}=20as=20destination=0A+of=20copies.=0A+=0A= +Compare:=0A+=0A+@example=0A+@lisp=0A+(array-from=20#2((a=20b)=20(c=20= d))=201=201)=20@result{}=20d=0A+(array-from*=20#2((a=20b)=20(c=20d))=20= 1)=20@result{}=20#0(d)=0A+(define=20a=20(make-array=20'a=202=202))=0A= +(array-fill!=20(array-from*=20a=201=201)=20'b)=0A+a=20@result{}=20#2((a=20= a)=20(a=20b)).=0A+(array-fill!=20(array-from=20a=201=201)=20'b)=20= @result{}=20error:=20not=20an=20array=0A+@end=20lisp=0A+@end=20example=0A= +=0A+@code{(apply=20array-from*=20array=20indices)}=20is=20equivalent=20= to=0A+=0A+@lisp=0A+(apply=20make-shared-array=20a=0A+=20=20(lambda=20t=20= (append=20indices=20t))=0A+=20=20(drop=20(array-dimensions=20a)=20= (length=20indices)))=0A+@end=20lisp=0A+@end=20deffn=0A+=0A+=0A+@deffn=20= {Scheme=20Procedure}=20array-amend!=20array=20x=20idx=20@dots{}=0A= +@deffnx=20{C=20Function}=20scm_array_amend_x=20(array,=20x,=20idxlist)=0A= +If=20the=20length=20of=20@var{idxlist}=20equals=20the=20rank=20@math{n}=20= of=0A+@var{array},=20set=20the=20element=20at=20@code{(idx=20@dots{})}=20= of=20@var{array}=20to=0A+@var{x},=20just=20like=20@code{(array-set!=20= array=20x=20idx=20@dots{})}.=20If,=0A+however,=20the=20length=20@math{k}=20= of=20@var{idxlist}=20is=20shorter=20than=0A+@math{n},=20then=20copy=20= the=20@math{(n-k)}-rank=20array=20@var{x}=0A+into=20@math{(n-k)}-rank=20= prefix=20cell=20of=20@var{array}=20given=20by=0A+@var{idxlist}.=20In=20= this=20case,=20the=20last=20@math{(n-k)}=20dimensions=20of=0A= +@var{array}=20and=20the=20dimensions=20of=20@var{x}=20must=20match=20= exactly.=0A+=0A+This=20function=20returns=20the=20modified=20= @var{array}.=0A+=0A+For=20example:=0A+=0A+@example=0A+@lisp=0A= +(array-amend!=20(make-array=20'a=202=202)=20b=201=201)=20@result{}=20= #2((a=20a)=20(a=20b))=0A+(array-amend!=20(make-array=20'a=202=202)=20#(x=20= y)=201)=20@result{}=20#2((a=20a)=20(x=20y))=0A+@end=20lisp=0A+@end=20= example=0A+=0A+@code{(apply=20array-amend!=20array=20x=20indices)}=20is=20= equivalent=20to=0A+=0A+@lisp=0A+(let=20((len=20(length=20indices)))=0A+=20= =20(if=20(=3D=20(array-rank=20array)=20len)=0A+=20=20=20=20(apply=20= array-set!=20array=20x=20indices)=0A+=20=20=20=20(array-copy!=20x=20= (apply=20array-from=20array=20indices)))=0A+=20=20array)=0A+@end=20lisp=0A= +=0A+The=20name=20`amend'=20comes=20from=20the=20J=20language.=0A+@end=20= deffn=0A+=0A+=0A=20@deffn=20{Scheme=20Procedure}=20= shared-array-increments=20array=0A=20@deffnx=20{C=20Function}=20= scm_shared_array_increments=20(array)=0A=20For=20each=20dimension,=20= return=20the=20distance=20between=20elements=20in=20the=20root=20vector.=0A= diff=20--git=20a/libguile/arrays.c=20b/libguile/arrays.c=0Aindex=20= fb522e1..273c48b=20100644=0A---=20a/libguile/arrays.c=0A+++=20= b/libguile/arrays.c=0A@@=20-416,6=20+416,164=20@@=20SCM_DEFINE=20= (scm_make_shared_array,=20"make-shared-array",=202,=200,=201,=0A=20= #undef=20FUNC_NAME=0A=20=0A=20=0A+#define=20ARRAY_FROM_POS(error_args)=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20\=0A+=20=20scm_t_array_handle=20= handle;=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20\=0A+=20= =20scm_t_array_dim=20*=20s;=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20\=0A+=20=20size_t=20ndim,=20k;=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= \=0A+=20=20ssize_t=20pos;=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20\=0A+=20=20SCM=20i;=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20\=0A+=20=20scm_array_get_handle=20= (ra,=20&handle);=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20\=0A+=20=20s=20=3D=20= scm_array_handle_dims=20(&handle);=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20\=0A+=20=20= ndim=20=3D=20scm_array_handle_rank=20(&handle);=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20\=0A+=20= =20k=20=3D=20ndim;=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20\=0A+=20=20pos=20=3D=20= 0;=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20\=0A+=20=20i=20=3D=20indices;=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20\=0A+=20=20for=20(;=20k>0=20&&=20scm_is_pair=20(i);=20= --k,=20++s,=20i=3Dscm_cdr=20(i))=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20\=0A+=20=20=20=20{=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= \=0A+=20=20=20=20=20=20ssize_t=20ik=20=3D=20scm_to_ssize_t=20(scm_car=20= (i));=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20\=0A+=20=20=20=20=20=20if=20(iklbnd=20||=20ik>s->ubnd)=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20\=0A+=20=20=20=20=20=20=20=20{=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20\=0A+=20=20=20=20=20=20=20=20=20=20= scm_array_handle_release=20(&handle);=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20\=0A+=20=20=20=20=20=20=20=20= =20=20scm_misc_error=20(FUNC_NAME,=20"indices=20out=20of=20range",=20= error_args);=20\=0A+=20=20=20=20=20=20=20=20}=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20\=0A+=20=20=20=20=20=20pos=20+=3D=20(ik-s->lbnd)=20*=20s->inc;=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20\=0A+=20=20=20=20}=0A+=0A+#define=20= ARRAY_FROM_GET_O=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20\=0A+=20=20scm_t_array_dim=20*=20os;=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20\=0A+=20=20o=20=3D=20= scm_i_make_array=20(k);=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20\=0A+=20=20SCM_I_ARRAY_SET_V=20(o,=20handle.vector);=20=20=20= =20=20=20=20=20=20\=0A+=20=20SCM_I_ARRAY_SET_BASE=20(o,=20pos=20+=20= handle.base);=20=20\=0A+=20=20os=20=3D=20SCM_I_ARRAY_DIMS=20(o);=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20\=0A+=20=20for=20(;=20= k>0;=20--k,=20++s,=20++os)=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20\=0A+=20=20=20=20{=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20\=0A+=20=20=20=20=20=20os->ubnd=20=3D=20s->ubnd;=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20\=0A+=20=20=20=20=20=20= os->lbnd=20=3D=20s->lbnd;=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20\=0A+=20=20=20=20=20=20os->inc=20=3D=20s->inc;=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20\=0A= +=20=20=20=20}=0A+=0A+=0A+SCM_DEFINE=20(scm_array_from_s,=20= "array-from*",=201,=200,=201,=0A+=20=20=20=20=20=20=20=20=20=20=20(SCM=20= ra,=20SCM=20indices),=0A+=20=20=20=20=20=20=20=20=20=20=20=20"Return=20= the=20array=20slice=20@var{ra}[@var{indices}=20...,=20...]\n"=0A+=20=20=20= =20=20=20=20=20=20=20=20=20"The=20rank=20of=20@var{ra}=20must=20equal=20= to=20the=20number=20of=20indices=20or=20larger.\n\n"=0A+=20=20=20=20=20=20= =20=20=20=20=20=20"See=20also=20@code{array-ref},=20@code{array-from},=20= @code{array-amend!}.\n\n"=0A+=20=20=20=20=20=20=20=20=20=20=20=20= "@code{array-from*}=20may=20return=20a=20rank-0=20array.=20For=20= example:\n"=0A+=20=20=20=20=20=20=20=20=20=20=20=20"@lisp\n"=0A+=20=20=20= =20=20=20=20=20=20=20=20=20"(array-from*=20#2((1=202=203)=20(4=205=206))=20= 1=201)=20@result{}=20#0(5)\n"=0A+=20=20=20=20=20=20=20=20=20=20=20=20= "(array-from*=20#2((1=202=203)=20(4=205=206))=201)=20@result{}=20#(4=205=20= 6)\n"=0A+=20=20=20=20=20=20=20=20=20=20=20=20"(array-from*=20#2((1=202=20= 3)=20(4=205=206)))=20@result{}=20#2((1=202=203)=20(4=205=206))\n"=0A+=20=20= =20=20=20=20=20=20=20=20=20=20"(array-from*=20#0(5)=20@result{}=20= #0(5).\n"=0A+=20=20=20=20=20=20=20=20=20=20=20=20"@end=20lisp")=0A= +#define=20FUNC_NAME=20s_scm_array_from_s=0A+{=0A+=20=20SCM=20o;=0A+=20=20= ARRAY_FROM_POS(scm_list_2=20(ra,=20indices))=0A+=20=20if=20(k=3D=3Dndim)=0A= +=20=20=20=20o=20=3D=20ra;=0A+=20=20else=20if=20(scm_is_null=20(i))=0A+=20= =20=20=20{=20ARRAY_FROM_GET_O=20}=0A+=20=20else=0A+=20=20=20=20{=0A+=20=20= =20=20=20=20scm_array_handle_release=20(&handle);=0A+=20=20=20=20=20=20= scm_misc_error(FUNC_NAME,=20"too=20many=20indices",=20scm_list_2=20(ra,=20= indices));=0A+=20=20=20=20}=0A+=20=20scm_array_handle_release=20= (&handle);=0A+=20=20return=20o;=0A+}=0A+#undef=20FUNC_NAME=0A+=0A+=0A= +SCM_DEFINE=20(scm_array_from,=20"array-from",=201,=200,=201,=0A+=20=20=20= =20=20=20=20=20=20=20=20(SCM=20ra,=20SCM=20indices),=0A+=20=20=20=20=20=20= =20=20=20=20=20=20"Return=20the=20element=20at=20the=20= @code{(@var{indices}=20...)}=20position\n"=0A+=20=20=20=20=20=20=20=20=20= =20=20=20"in=20array=20@var{ra},=20or=20the=20array=20slice=20= @var{ra}[@var{indices}=20...,=20...]\n"=0A+=20=20=20=20=20=20=20=20=20=20= =20=20"if=20the=20rank=20of=20@var{ra}=20is=20larger=20than=20the=20= number=20of=20indices.\n\n"=0A+=20=20=20=20=20=20=20=20=20=20=20=20"See=20= also=20@code{array-ref},=20@code{array-from*},=20= @code{array-amend!}.\n\n"=0A+=20=20=20=20=20=20=20=20=20=20=20=20= "@code{array-from}=20never=20returns=20a=20rank=200=20array.=20For=20= example:\n"=0A+=20=20=20=20=20=20=20=20=20=20=20=20"@lisp\n"=0A+=20=20=20= =20=20=20=20=20=20=20=20=20"(array-from=20#2((1=202=203)=20(4=205=206))=20= 1=201)=20@result{}=205\n"=0A+=20=20=20=20=20=20=20=20=20=20=20=20= "(array-from=20#2((1=202=203)=20(4=205=206))=201)=20@result{}=20#(4=205=20= 6)\n"=0A+=20=20=20=20=20=20=20=20=20=20=20=20"(array-from=20#2((1=202=20= 3)=20(4=205=206)))=20@result{}=20#2((1=202=203)=20(4=205=206))\n"=0A+=20=20= =20=20=20=20=20=20=20=20=20=20"(array-from=20#0(5)=20@result{}=205.\n"=0A= +=20=20=20=20=20=20=20=20=20=20=20=20"@end=20lisp")=0A+#define=20= FUNC_NAME=20s_scm_array_from=0A+{=0A+=20=20SCM=20o;=0A+=20=20= ARRAY_FROM_POS(scm_list_2=20(ra,=20indices))=0A+=20=20if=20(k>0)=0A+=20=20= =20=20{=0A+=20=20=20=20=20=20if=20(k=3D=3Dndim)=0A+=20=20=20=20=20=20=20=20= o=20=3D=20ra;=0A+=20=20=20=20=20=20else=0A+=20=20=20=20=20=20=20=20{=20= ARRAY_FROM_GET_O=20}=0A+=20=20=20=20}=0A+=20=20else=20if=20= (scm_is_null(i))=0A+=20=20=20=20o=20=3D=20scm_array_handle_ref=20= (&handle,=20pos);=0A+=20=20else=0A+=20=20=20=20{=0A+=20=20=20=20=20=20= scm_array_handle_release=20(&handle);=0A+=20=20=20=20=20=20= scm_misc_error(FUNC_NAME,=20"too=20many=20indices",=20scm_list_2=20(ra,=20= indices));=0A+=20=20=20=20}=0A+=20=20scm_array_handle_release=20= (&handle);=0A+=20=20return=20o;=0A+}=0A+#undef=20FUNC_NAME=0A+=0A+=0A= +SCM_DEFINE=20(scm_array_amend_x,=20"array-amend!",=202,=200,=201,=0A+=20= =20=20=20=20=20=20=20=20=20=20=20(SCM=20ra,=20SCM=20b,=20SCM=20indices),=0A= +=20=20=20=20=20=20=20=20=20=20=20=20"Set=20the=20array=20slice=20= @var{ra}[@var{indices}=20...,=20...]=20to=20@var{b}\n."=0A+=20=20=20=20=20= =20=20=20=20=20=20=20"Equivalent=20to=20@code{(array-copy!=20@var{b}=20= (apply=20array-from=20@var{ra}=20@var{indices}))}\n"=0A+=20=20=20=20=20=20= =20=20=20=20=20=20"if=20the=20number=20of=20indices=20is=20smaller=20= than=20the=20rank=20of=20@var{ra};=20otherwise\n"=0A+=20=20=20=20=20=20=20= =20=20=20=20=20"equivalent=20to=20@code{(apply=20array-set!=20@var{ra}=20= @var{b}=20@var{indices})}.\n"=0A+=20=20=20=20=20=20=20=20=20=20=20=20= "This=20function=20returns=20the=20modified=20array=20@var{ra}.\n\n"=0A+=20= =20=20=20=20=20=20=20=20=20=20=20"See=20also=20@code{array-ref},=20= @code{array-from},=20@code{array-from*}.\n\n"=0A+=20=20=20=20=20=20=20=20= =20=20=20=20"For=20example:\n"=0A+=20=20=20=20=20=20=20=20=20=20=20=20= "@lisp\n"=0A+=20=20=20=20=20=20=20=20=20=20=20=20"(define=20A=20= (list->array=202=20'((1=202=203)=20(4=205=206))))\n"=0A+=20=20=20=20=20=20= =20=20=20=20=20=20"(array-amend!=20A=20#0(99)=201=201)=20@result{}=20= #2((1=202=203)=20(4=20#0(99)=206))\n"=0A+=20=20=20=20=20=20=20=20=20=20=20= =20"(array-amend!=20A=2099=201=201)=20@result{}=20#2((1=202=203)=20(4=20= 99=206))\n"=0A+=20=20=20=20=20=20=20=20=20=20=20=20"(array-amend!=20A=20= #(a=20b=20c)=200)=20@result{}=20#2((a=20b=20c)=20(4=2099=206))\n"=0A+=20=20= =20=20=20=20=20=20=20=20=20=20"(array-amend!=20A=20#2((x=20y=20z)=20(9=20= 8=207)))=20@result{}=20#2((x=20y=20z)=20(9=208=207))\n\n"=0A+=20=20=20=20= =20=20=20=20=20=20=20=20"(define=20B=20(make-array=200))\n"=0A+=20=20=20=20= =20=20=20=20=20=20=20=20"(array-amend!=20B=2015)=20@result{}=20#0(15)\n"=0A= +=20=20=20=20=20=20=20=20=20=20=20=20"@end=20lisp")=0A+#define=20= FUNC_NAME=20s_scm_array_amend_x=0A+{=0A+=20=20SCM=20o;=0A+=20=20= ARRAY_FROM_POS(scm_list_3=20(ra,=20b,=20indices))=0A+=20=20if=20(k>0)=0A= +=20=20=20=20{=0A+=20=20=20=20=20=20if=20(k=3D=3Dndim)=0A+=20=20=20=20=20= =20=20=20o=20=3D=20ra;=0A+=20=20=20=20=20=20else=0A+=20=20=20=20=20=20=20= =20{=20ARRAY_FROM_GET_O=20}=0A+=20=20=20=20=20=20= scm_array_handle_release(&handle);=0A+=20=20=20=20=20=20/*=20an=20error=20= is=20still=20possible=20here=20if=20o=20and=20b=20don't=20match.=20*/=0A= +=20=20=20=20=20=20/*=20TODO=20copying=20like=20this=20wastes=20the=20= handle,=20and=20the=20bounds=20matching=0A+=20=20=20=20=20=20=20=20=20= behavior=20of=20array-copy!=20is=20not=20strict.=20*/=0A+=20=20=20=20=20=20= scm_array_copy_x(b,=20o);=0A+=20=20=20=20}=0A+=20=20else=20if=20= (scm_is_null(i))=0A+=20=20=20=20{=0A+=20=20=20=20=20=20= scm_array_handle_set=20(&handle,=20pos,=20b);=20=20/*=20ra=20may=20be=20= non-ARRAYP=20*/=0A+=20=20=20=20=20=20scm_array_handle_release=20= (&handle);=0A+=20=20=20=20}=0A+=20=20else=0A+=20=20=20=20{=0A+=20=20=20=20= =20=20scm_array_handle_release=20(&handle);=0A+=20=20=20=20=20=20= scm_misc_error(FUNC_NAME,=20"too=20many=20indices",=20scm_list_3=20(ra,=20= b,=20indices));=0A+=20=20=20=20}=0A+=20=20return=20ra;=0A+}=0A+#undef=20= FUNC_NAME=0A+=0A+=0A+#undef=20ARRAY_FROM_POS=0A+#undef=20= ARRAY_FROM_GET_O=0A+=0A+=0A=20/*=20args=20are=20RA=20.=20DIMS=20*/=0A=20= SCM_DEFINE=20(scm_transpose_array,=20"transpose-array",=201,=200,=201,=0A= =20=20=20=20=20=20=20=20=20=20=20=20(SCM=20ra,=20SCM=20args),=0Adiff=20= --git=20a/libguile/arrays.h=20b/libguile/arrays.h=0Aindex=20= d3e409f..9b7fd6c=20100644=0A---=20a/libguile/arrays.h=0A+++=20= b/libguile/arrays.h=0A@@=20-41,12=20+41,18=20@@=20SCM_API=20SCM=20= scm_make_typed_array=20(SCM=20type,=20SCM=20fill,=20SCM=20bounds);=0A=20= SCM_API=20SCM=20scm_from_contiguous_typed_array=20(SCM=20type,=20SCM=20= bounds,=0A=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= const=20void=20*bytes,=0A=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20size_t=20byte_len);=0A+=0A=20SCM_API=20SCM=20= scm_shared_array_root=20(SCM=20ra);=0A=20SCM_API=20SCM=20= scm_shared_array_offset=20(SCM=20ra);=0A=20SCM_API=20SCM=20= scm_shared_array_increments=20(SCM=20ra);=0A+=0A=20SCM_API=20SCM=20= scm_make_shared_array=20(SCM=20oldra,=20SCM=20mapfunc,=20SCM=20dims);=0A=20= SCM_API=20SCM=20scm_transpose_array=20(SCM=20ra,=20SCM=20args);=0A=20= SCM_API=20SCM=20scm_array_contents=20(SCM=20ra,=20SCM=20strict);=0A= +SCM_API=20SCM=20scm_array_from_s=20(SCM=20ra,=20SCM=20indices);=0A= +SCM_API=20SCM=20scm_array_from=20(SCM=20ra,=20SCM=20indices);=0A= +SCM_API=20SCM=20scm_array_amend_x=20(SCM=20ra,=20SCM=20b,=20SCM=20= indices);=0A+=0A=20SCM_API=20SCM=20scm_list_to_array=20(SCM=20ndim,=20= SCM=20lst);=0A=20SCM_API=20SCM=20scm_list_to_typed_array=20(SCM=20type,=20= SCM=20ndim,=20SCM=20lst);=0A=20=0Adiff=20--git=20= a/test-suite/tests/arrays.test=20b/test-suite/tests/arrays.test=0Aindex=20= c40457b..9bd0676=20100644=0A---=20a/test-suite/tests/arrays.test=0A+++=20= b/test-suite/tests/arrays.test=0A@@=20-296,6=20+296,115=20@@=0A=20=20=20=20= =20=20=20(and=20(eqv?=205=20(array-ref=20s2=201))=0A=20=09=20=20=20(eqv?=20= 8=20(array-ref=20s2=202))))))=0A=20=0A+=0A+;;;=0A+;;;=20array-from*=0A= +;;;=0A+=0A+(with-test-prefix/c&e=20"array-from*"=0A+=0A+=20=20(pass-if=20= "vector=20I"=0A+=20=20=20=20(let=20((v=20(vector=201=202=203)))=0A+=20=20= =20=20=20=20(array-fill!=20(array-from*=20v=201)=20'a)=0A+=20=20=20=20=20= =20(array-equal?=20v=20#(1=20a=203))))=0A+=0A+=20=20(pass-if=20"vector=20= II"=0A+=20=20=20=20(let=20((v=20(vector=201=202=203)))=0A+=20=20=20=20=20= =20(array-copy!=20#(a=20b=20c)=20(array-from*=20v))=0A+=20=20=20=20=20=20= (array-equal?=20v=20#(a=20b=20c))))=0A+=0A+=20=20(pass-if=20"array=20I"=0A= +=20=20=20=20(let=20((a=20(list->array=202=20'((1=202=203)=20(4=205=20= 6)))))=0A+=20=20=20=20=20=20(array-fill!=20(array-from*=20a=201=201)=20= 'a)=0A+=20=20=20=20=20=20(array-equal?=20a=20#2((1=202=203)=20(4=20a=20= 6)))))=0A+=0A+=20=20(pass-if=20"array=20II"=0A+=20=20=20=20(let=20((a=20= (list->array=202=20'((1=202=203)=20(4=205=206)))))=0A+=20=20=20=20=20=20= (array-copy!=20#(a=20b=20c)=20(array-from*=20a=201))=0A+=20=20=20=20=20=20= (array-equal?=20a=20#2((1=202=203)=20(a=20b=20c)))))=0A+=0A+=20=20= (pass-if=20"array=20III"=0A+=20=20=20=20(let=20((a=20(list->array=202=20= '((1=202=203)=20(4=205=206)))))=0A+=20=20=20=20=20=20(array-copy!=20= #2((a=20b=20c)=20(x=20y=20z))=20(array-from*=20a))=0A+=20=20=20=20=20=20= (array-equal?=20a=20#2((a=20b=20c)=20(x=20y=20z)))))=0A+=0A+=20=20= (pass-if=20"rank=200=20array"=0A+=20=20=20=20(let=20((a=20(make-array=20= 77)))=0A+=20=20=20=20=20=20(array-fill!=20(array-from*=20a)=20'a)=0A+=20=20= =20=20=20=20(array-equal?=20a=20#0(a)))))=0A+=0A+=0A+;;;=0A+;;;=20= array-from=0A+;;;=0A+=0A+(with-test-prefix/c&e=20"array-from"=0A+=0A+=20=20= (pass-if=20"vector=20I"=0A+=20=20=20=20(let=20((v=20(vector=201=202=20= 3)))=0A+=20=20=20=20=20=20(equal?=202=20(array-from=20v=201))))=0A+=0A+=20= =20(pass-if=20"vector=20II"=0A+=20=20=20=20(let=20((v=20(vector=201=202=20= 3)))=0A+=20=20=20=20=20=20(array-copy!=20#(a=20b=20c)=20(array-from=20= v))=0A+=20=20=20=20=20=20(array-equal?=20v=20#(a=20b=20c))))=0A+=0A+=20=20= (pass-if=20"array=20I"=0A+=20=20=20=20(let=20((a=20(list->array=202=20= '((1=202=203)=20(4=205=206)))))=0A+=20=20=20=20=20=20(equal?=205=20= (array-from=20a=201=201))))=0A+=0A+=20=20(pass-if=20"array=20II"=0A+=20=20= =20=20(let=20((a=20(list->array=202=20'((1=202=203)=20(4=205=206)))))=0A= +=20=20=20=20=20=20(array-copy!=20#(a=20b=20c)=20(array-from=20a=201))=0A= +=20=20=20=20=20=20(array-equal?=20a=20#2((1=202=203)=20(a=20b=20c)))))=0A= +=0A+=20=20(pass-if=20"array=20III"=0A+=20=20=20=20(let=20((a=20= (list->array=202=20'((1=202=203)=20(4=205=206)))))=0A+=20=20=20=20=20=20= (array-copy!=20#2((a=20b=20c)=20(x=20y=20z))=20(array-from=20a))=0A+=20=20= =20=20=20=20(array-equal?=20a=20#2((a=20b=20c)=20(x=20y=20z)))))=0A+=0A+=20= =20(pass-if=20"rank=200=20array"=0A+=20=20=20=20(let=20((a=20(make-array=20= 77)))=0A+=20=20=20=20=20=20(equal?=20(array-from=20a)=2077))))=0A+=0A+=0A= +;;;=0A+;;;=20array-amend!=0A+;;;=0A+=0A+(with-test-prefix/c&e=20= "array-amend!"=0A+=0A+=20=20(pass-if=20"vector=20I"=0A+=20=20=20=20(let=20= ((v=20(vector=201=202=203)))=0A+=20=20=20=20=20=20(and=20(eq?=20v=20= (array-amend!=20v=20'x=201))=0A+=20=20=20=20=20=20=20=20=20=20=20= (array-equal?=20v=20#(1=20x=203)))))=0A+=0A+=20=20(pass-if=20"vector=20= II"=0A+=20=20=20=20(let=20((v=20(vector=201=202=203)))=0A+=20=20=20=20=20= =20(and=20(eq?=20v=20(array-amend!=20(array-from=20v)=20#(a=20b=20c)))=0A= +=20=20=20=20=20=20=20=20=20=20=20(array-equal?=20v=20#(a=20b=20c)))))=0A= +=0A+=20=20(pass-if=20"array=20I"=0A+=20=20=20=20(let=20((a=20= (list->array=202=20'((1=202=203)=20(4=205=206)))))=0A+=20=20=20=20=20=20= (and=20(eq?=20a=20(array-amend!=20a=20'x=201=201))=0A+=20=20=20=20=20=20=20= =20=20=20=20(array-equal?=20a=20#2((1=202=203)=20(4=20x=206))))))=0A+=0A= +=20=20(pass-if=20"array=20II"=0A+=20=20=20=20(let=20((a=20(list->array=20= 2=20'((1=202=203)=20(4=205=206)))))=0A+=20=20=20=20=20=20(and=20(eq?=20a=20= (array-amend!=20a=20#(a=20b=20c)=201))=0A+=20=20=20=20=20=20=20=20=20=20=20= (array-equal?=20a=20#2((1=202=203)=20(a=20b=20c))))))=0A+=0A+=20=20= (pass-if=20"array=20III"=0A+=20=20=20=20(let=20((a=20(list->array=202=20= '((1=202=203)=20(4=205=206)))))=0A+=20=20=20=20=20=20(and=20(eq?=20a=20= (array-amend!=20a=20#2((a=20b=20c)=20(x=20y=20z))))=0A+=20=20=20=20=20=20= =20=20=20=20=20(array-equal?=20a=20#2((a=20b=20c)=20(x=20y=20z))))))=0A+=0A= +=20=20(pass-if=20"rank=200=20array"=0A+=20=20=20=20(let=20((a=20= (make-array=2077)))=0A+=20=20=20=20=20=20(and=20(eq?=20a=20(array-amend!=20= a=2099))=0A+=20=20=20=20=20=20=20=20=20=20=20(array-equal?=20a=20= #0(99))))))=0A+=0A+=0A=20;;;=0A=20;;;=20array-contents=0A=20;;;=0A--=20=0A= 2.7.3=0A=0A= --Apple-Mail=_C05A2854-9EDB-476D-AE5C-EF5B1F5E02F5 Content-Disposition: attachment; filename=0011-New-functions-array-for-each-cell-array-for-each-cel.patch Content-Type: application/octet-stream; name="0011-New-functions-array-for-each-cell-array-for-each-cel.patch" Content-Transfer-Encoding: quoted-printable =46rom=20ed383e94e45557b40536853c0fd4545ba0dfba80=20Mon=20Sep=2017=20= 00:00:00=202001=0AFrom:=20Daniel=20Llorens=20=0A= Date:=20Tue,=208=20Sep=202015=2016:57:30=20+0200=0ASubject:=20[PATCH=20= 11/11]=20New=20functions=20(array-for-each-cell,=0A=20= array-for-each-cell-in-order)=0A=0A*=20libguile/array-map.c=20= (scm_i_array_rebase,=20scm_array_for_each_cell):=0A=20=20New=20= functions.=20Export=20scm_array_for_each_cell()=20as=0A=20=20= (array-for-each-cell).=0A=0A=20=20(array-for-each-cell-in-order):=20= Define=20additional=20export.=0A=0A*=20libguile/array-map.h=20= (scm_i_array_rebase,=20scm_array_for_each_cell):=0A=20=20Add=20= prototypes.=0A=0A*=20doc/ref/api-compound.texi:=20New=20section=20= 'Arrays=20as=20arrays=20of=0A=20=20arrays'.=20Move=20the=20documentation=20= for=20(array-from),=20(array-from*)=20and=0A=20=20(array-amend!)=20in=20= here.=20Add=20documentation=20for=20(array-for-each-cell).=0A=0A*=20= test-suite/tests/array-map.test:=20Renamed=20from=0A=20=20= test-suite/tests/ramap.test,=20fix=20module=20name.=20Add=20tests=20for=0A= =20=20(array-for-each-cell).=0A=0A*=20test-suite/Makefile.am:=20Apply=20= rename=20array-map.test=20->=20ramap.test.=0A=0A*=20= doc/ref/api-compound.texi:=20Minor=20documentation=20fixes.=0A---=0A=20= doc/ref/api-compound.texi=20=20=20=20=20=20=20|=20169=20+++++++++----=0A=20= libguile/array-map.c=20=20=20=20=20=20=20=20=20=20=20=20|=20260=20= ++++++++++++++++++-=0A=20libguile/array-map.h=20=20=20=20=20=20=20=20=20=20= =20=20|=20=20=204=20+=0A=20libguile/arrays.c=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20|=20=20=205=20+-=0A=20test-suite/Makefile.am=20=20=20=20=20= =20=20=20=20=20|=20=20=202=20+-=0A=20test-suite/tests/array-map.test=20|=20= 540=20++++++++++++++++++++++++++++++++++++++++=0A=20= test-suite/tests/ramap.test=20=20=20=20=20|=20509=20= -------------------------------------=0A=207=20files=20changed,=20923=20= insertions(+),=20566=20deletions(-)=0A=20create=20mode=20100644=20= test-suite/tests/array-map.test=0A=20delete=20mode=20100644=20= test-suite/tests/ramap.test=0A=0Adiff=20--git=20= a/doc/ref/api-compound.texi=20b/doc/ref/api-compound.texi=0Aindex=20= d17c4bf..bc2c98b=20100644=0A---=20a/doc/ref/api-compound.texi=0A+++=20= b/doc/ref/api-compound.texi=0A@@=20-1203,6=20+1203,7=20@@=20dimensional=20= arrays.=0A=20*=20Array=20Syntax::=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=0A=20*=20Array=20Procedures::=20=20=20=20=20=20=20=20=20=20=20=20=0A= =20*=20Shared=20Arrays::=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=0A= +*=20Arrays=20as=20arrays=20of=20arrays::=0A=20*=20Accessing=20Arrays=20= from=20C::=20=20=20=20=20=0A=20@end=20menu=0A=20=0A@@=20-1682,24=20= +1683,91=20@@=20sample=20points=20are=20enough=20because=20@var{mapfunc}=20= is=20linear.=0A=20Return=20the=20element=20at=20@code{(idx=20@dots{})}=20= in=20@var{array}.=0A=20@end=20deffn=0A=20=0A+=0A+@deffn=20{Scheme=20= Procedure}=20shared-array-increments=20array=0A+@deffnx=20{C=20Function}=20= scm_shared_array_increments=20(array)=0A+For=20each=20dimension,=20= return=20the=20distance=20between=20elements=20in=20the=20root=20vector.=0A= +@end=20deffn=0A+=0A+@deffn=20{Scheme=20Procedure}=20shared-array-offset=20= array=0A+@deffnx=20{C=20Function}=20scm_shared_array_offset=20(array)=0A= +Return=20the=20root=20vector=20index=20of=20the=20first=20element=20in=20= the=20array.=0A+@end=20deffn=0A+=0A+@deffn=20{Scheme=20Procedure}=20= shared-array-root=20array=0A+@deffnx=20{C=20Function}=20= scm_shared_array_root=20(array)=0A+Return=20the=20root=20vector=20of=20a=20= shared=20array.=0A+@end=20deffn=0A+=0A+@deffn=20{Scheme=20Procedure}=20= array-contents=20array=20[strict]=0A+@deffnx=20{C=20Function}=20= scm_array_contents=20(array,=20strict)=0A+If=20@var{array}=20may=20be=20= @dfn{unrolled}=20into=20a=20one=20dimensional=20shared=20array=0A= +without=20changing=20their=20order=20(last=20subscript=20changing=20= fastest),=20then=0A+@code{array-contents}=20returns=20that=20shared=20= array,=20otherwise=20it=20returns=0A+@code{#f}.=20=20All=20arrays=20made=20= by=20@code{make-array}=20and=0A+@code{make-typed-array}=20may=20be=20= unrolled,=20some=20arrays=20made=20by=0A+@code{make-shared-array}=20may=20= not=20be.=0A+=0A+If=20the=20optional=20argument=20@var{strict}=20is=20= provided,=20a=20shared=20array=20will=0A+be=20returned=20only=20if=20its=20= elements=20are=20stored=20internally=20contiguous=20in=0A+memory.=0A= +@end=20deffn=0A+=0A+@deffn=20{Scheme=20Procedure}=20transpose-array=20= array=20dim1=20dim2=20@dots{}=0A+@deffnx=20{C=20Function}=20= scm_transpose_array=20(array,=20dimlist)=0A+Return=20an=20array=20= sharing=20contents=20with=20@var{array},=20but=20with=0A+dimensions=20= arranged=20in=20a=20different=20order.=20=20There=20must=20be=20one=0A= +@var{dim}=20argument=20for=20each=20dimension=20of=20@var{array}.=0A= +@var{dim1},=20@var{dim2},=20@dots{}=20should=20be=20integers=20between=20= 0=0A+and=20the=20rank=20of=20the=20array=20to=20be=20returned.=20=20Each=20= integer=20in=20that=0A+range=20must=20appear=20at=20least=20once=20in=20= the=20argument=20list.=0A+=0A+The=20values=20of=20@var{dim1},=20= @var{dim2},=20@dots{}=20correspond=20to=0A+dimensions=20in=20the=20array=20= to=20be=20returned,=20and=20their=20positions=20in=20the=0A+argument=20= list=20to=20dimensions=20of=20@var{array}.=20=20Several=20@var{dim}s=0A= +may=20have=20the=20same=20value,=20in=20which=20case=20the=20returned=20= array=20will=0A+have=20smaller=20rank=20than=20@var{array}.=0A+=0A+@lisp=0A= +(transpose-array=20'#2((a=20b)=20(c=20d))=201=200)=20@result{}=20#2((a=20= c)=20(b=20d))=0A+(transpose-array=20'#2((a=20b)=20(c=20d))=200=200)=20= @result{}=20#1(a=20d)=0A+(transpose-array=20'#3(((a=20b=20c)=20(d=20e=20= f))=20((1=202=203)=20(4=205=206)))=201=201=200)=20@result{}=0A+=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20#2((a=204)=20(b=205)=20(c=206))=0A= +@end=20lisp=0A+@end=20deffn=0A+=0A+@node=20Arrays=20as=20arrays=20of=20= arrays=0A+@subsubsection=20Arrays=20as=20arrays=20of=20arrays=0A+=0A+The=20= functions=20in=20this=20section=20allow=20you=20to=20treat=20an=20array=20= of=20rank=0A+@math{n}=20as=20an=20array=20of=20lower=20rank=20@math{n-k}=20= where=20the=20elements=20are=0A+themselves=20arrays=20(`cells')=20of=20= rank=20@math{k}.=20This=20replicates=20some=20of=0A+the=20functionality=20= of=20`enclosed=20arrays',=20a=20feature=20of=20old=20Guile=20that=20was=0A= +removed=20before=20@w{version=202.0}.=20However,=20these=20functions=20= do=20not=20require=0A+a=20special=20type=20and=20operate=20on=20any=20= array.=0A+=0A+When=20we=20operate=20on=20an=20array=20in=20this=20way,=20= we=20speak=20of=20the=20first=20@math{k}=0A+dimensions=20of=20the=20= array=20as=20the=20@math{k}-`frame'=20of=20the=20array,=20while=20the=0A= +last=20@math{n-k}=20dimensions=20are=20the=20dimensions=20of=20the=0A= +@math{n-k}-`cell'.=20For=20example,=20a=202D-array=20(a=20matrix)=20can=20= be=20seen=20as=20a=0A+1D=20array=20of=20rows.=20In=20this=20case,=20the=20= rows=20are=20the=201-cells=20of=20the=20array.=0A+=0A=20@deffn=20{Scheme=20= Procedure}=20array-from=20array=20idx=20@dots{}=0A=20@deffnx=20{C=20= Function}=20scm_array_from=20(array,=20idxlist)=0A=20If=20the=20length=20= of=20@var{idxlist}=20equals=20the=20rank=20@math{n}=20of=0A=20= @var{array},=20return=20the=20element=20at=20@code{(idx=20@dots{})},=20= just=20like=0A=20@code{(array-ref=20array=20idx=20@dots{})}.=20If,=20= however,=20the=20length=20@math{k}=0A=20of=20@var{idxlist}=20is=20= shorter=20than=20@math{n},=20then=20return=20the=20shared=0A= -@math{(n-k)}-rank=20prefix=20cell=20of=20@var{array}=20given=20by=20= @var{idxlist}.=0A+@math{(n-k)}-rank=20cell=20of=20@var{array}=20given=20= by=20@var{idxlist}.=0A=20=0A=20For=20example:=0A=20=0A-@example=0A=20= @lisp=0A=20(array-from=20#2((a=20b)=20(c=20d))=200)=20@result{}=20#(a=20= b)=0A=20(array-from=20#2((a=20b)=20(c=20d))=201)=20@result{}=20#(c=20d)=0A= =20(array-from=20#2((a=20b)=20(c=20d))=201=201)=20@result{}=20d=0A=20= (array-from=20#2((a=20b)=20(c=20d)))=20@result{}=20#2((a=20b)=20(c=20d))=0A= =20@end=20lisp=0A-@end=20example=0A=20=0A=20@code{(apply=20array-from=20= array=20indices)}=20is=20equivalent=20to=0A=20=0A@@=20-1719,12=20= +1787,11=20@@=20The=20name=20`from'=20comes=20from=20the=20J=20language.=0A= =20@deffnx=20{C=20Function}=20scm_array_from_s=20(array,=20idxlist)=0A=20= Like=20@code{(array-from=20array=20idx=20@dots{})},=20but=20return=20a=20= 0-rank=20shared=0A=20array=20if=20the=20length=20of=20@var{idxlist}=20= matches=20the=20rank=20of=0A-@var{array}.=20This=20can=20be=20useful=20= when=20using=20@var{ARRAY}=20as=20destination=0A-of=20copies.=0A= +@var{array}.=20This=20can=20be=20useful=20when=20using=20@var{ARRAY}=20= as=20a=20place=20to=0A+write=20into.=0A=20=0A=20Compare:=0A=20=0A= -@example=0A=20@lisp=0A=20(array-from=20#2((a=20b)=20(c=20d))=201=201)=20= @result{}=20d=0A=20(array-from*=20#2((a=20b)=20(c=20d))=201)=20@result{}=20= #0(d)=0A@@=20-1733,7=20+1800,6=20@@=20Compare:=0A=20a=20@result{}=20= #2((a=20a)=20(a=20b)).=0A=20(array-fill!=20(array-from=20a=201=201)=20= 'b)=20@result{}=20error:=20not=20an=20array=0A=20@end=20lisp=0A-@end=20= example=0A=20=0A=20@code{(apply=20array-from*=20array=20indices)}=20is=20= equivalent=20to=0A=20=0A@@=20-1752,7=20+1818,7=20@@=20If=20the=20length=20= of=20@var{idxlist}=20equals=20the=20rank=20@math{n}=20of=0A=20@var{x},=20= just=20like=20@code{(array-set!=20array=20x=20idx=20@dots{})}.=20If,=0A=20= however,=20the=20length=20@math{k}=20of=20@var{idxlist}=20is=20shorter=20= than=0A=20@math{n},=20then=20copy=20the=20@math{(n-k)}-rank=20array=20= @var{x}=0A-into=20@math{(n-k)}-rank=20prefix=20cell=20of=20@var{array}=20= given=20by=0A+into=20the=20@math{(n-k)}-cell=20of=20@var{array}=20given=20= by=0A=20@var{idxlist}.=20In=20this=20case,=20the=20last=20@math{(n-k)}=20= dimensions=20of=0A=20@var{array}=20and=20the=20dimensions=20of=20@var{x}=20= must=20match=20exactly.=0A=20=0A@@=20-1760,12=20+1826,19=20@@=20This=20= function=20returns=20the=20modified=20@var{array}.=0A=20=0A=20For=20= example:=0A=20=0A-@example=0A=20@lisp=0A=20(array-amend!=20(make-array=20= 'a=202=202)=20b=201=201)=20@result{}=20#2((a=20a)=20(a=20b))=0A=20= (array-amend!=20(make-array=20'a=202=202)=20#(x=20y)=201)=20@result{}=20= #2((a=20a)=20(x=20y))=0A=20@end=20lisp=0A-@end=20example=0A+=0A+Note=20= that=20@code{array-amend!}=20will=20expect=20elements,=20not=20arrays,=20= when=20the=0A+destination=20has=20rank=200.=20One=20can=20work=20around=20= this=20using=0A+@code{array-from*}=20instead.=0A+=0A+@lisp=0A= +(array-amend!=20(make-array=20'a=202=202)=20#0(b)=201=201)=20@result{}=20= #2((a=20a)=20(a=20#0(b)))=0A+(let=20((a=20(make-array=20'a=202=202)))=20= (array-copy!=20#0(b)=20(array-from*=20a=201=201))=20a)=20@result{}=20= #2((a=20a)=20(a=20b))=0A+@end=20lisp=0A=20=0A=20@code{(apply=20= array-amend!=20array=20x=20indices)}=20is=20equivalent=20to=0A=20=0A@@=20= -1781,58=20+1854,52=20@@=20The=20name=20`amend'=20comes=20from=20the=20J=20= language.=0A=20@end=20deffn=0A=20=0A=20=0A-@deffn=20{Scheme=20Procedure}=20= shared-array-increments=20array=0A-@deffnx=20{C=20Function}=20= scm_shared_array_increments=20(array)=0A-For=20each=20dimension,=20= return=20the=20distance=20between=20elements=20in=20the=20root=20vector.=0A= -@end=20deffn=0A+@deffn=20{Scheme=20Procedure}=20array-for-each-cell=20= frame-rank=20op=20x=20@dots{}=0A+@deffnx=20{C=20Function}=20= scm_array_for_each_cell=20(array,=20frame_rank,=20op,=20xlist)=0A+Each=20= @var{x}=20must=20be=20an=20array=20of=20rank=20=E2=89=A5=20= @var{frame-rank},=20and=0A+the=20first=20@var{frame-rank}=20dimensions=20= of=20each=20@var{x}=20must=20all=20be=20the=0A+same.=20= @var{array-for-each-cell}=20calls=20@var{op}=20with=20each=20set=20of=0A= +(rank(@var{x})=20-=20@var{frame-rank})-cells=20from=20@var{x},=20in=20= unspecified=20order.=0A=20=0A-@deffn=20{Scheme=20Procedure}=20= shared-array-offset=20array=0A-@deffnx=20{C=20Function}=20= scm_shared_array_offset=20(array)=0A-Return=20the=20root=20vector=20= index=20of=20the=20first=20element=20in=20the=20array.=0A-@end=20deffn=0A= +@var{array-for-each-cell}=20allows=20you=20to=20loop=20over=20cells=20= of=20any=20rank=0A+without=20having=20to=20carry=20an=20index=20list=20= or=20construct=20slices=20manually.=20The=0A+cells=20passed=20to=20= @var{op}=20are=20shared=20arrays=20of=20@var{X}=20so=20it=20is=20= possible=0A+to=20write=20to=20them.=0A=20=0A-@deffn=20{Scheme=20= Procedure}=20shared-array-root=20array=0A-@deffnx=20{C=20Function}=20= scm_shared_array_root=20(array)=0A-Return=20the=20root=20vector=20of=20a=20= shared=20array.=0A-@end=20deffn=0A+This=20function=20returns=20an=20= unspecified=20value.=0A=20=0A-@deffn=20{Scheme=20Procedure}=20= array-contents=20array=20[strict]=0A-@deffnx=20{C=20Function}=20= scm_array_contents=20(array,=20strict)=0A-If=20@var{array}=20may=20be=20= @dfn{unrolled}=20into=20a=20one=20dimensional=20shared=20array=0A= -without=20changing=20their=20order=20(last=20subscript=20changing=20= fastest),=20then=0A-@code{array-contents}=20returns=20that=20shared=20= array,=20otherwise=20it=20returns=0A-@code{#f}.=20=20All=20arrays=20made=20= by=20@code{make-array}=20and=0A-@code{make-typed-array}=20may=20be=20= unrolled,=20some=20arrays=20made=20by=0A-@code{make-shared-array}=20may=20= not=20be.=0A+For=20example,=20to=20sort=20the=20rows=20of=20rank-2=20= array=20@code{a}:=0A=20=0A-If=20the=20optional=20argument=20@var{strict}=20= is=20provided,=20a=20shared=20array=20will=0A-be=20returned=20only=20if=20= its=20elements=20are=20stored=20internally=20contiguous=20in=0A-memory.=0A= -@end=20deffn=0A+@lisp=0A+(array-for-each-cell=201=20(lambda=20(x)=20= (sort!=20x=20<))=20a)=0A+@end=20lisp=0A=20=0A-@deffn=20{Scheme=20= Procedure}=20transpose-array=20array=20dim1=20dim2=20@dots{}=0A-@deffnx=20= {C=20Function}=20scm_transpose_array=20(array,=20dimlist)=0A-Return=20an=20= array=20sharing=20contents=20with=20@var{array},=20but=20with=0A= -dimensions=20arranged=20in=20a=20different=20order.=20=20There=20must=20= be=20one=0A-@var{dim}=20argument=20for=20each=20dimension=20of=20= @var{array}.=0A-@var{dim1},=20@var{dim2},=20@dots{}=20should=20be=20= integers=20between=200=0A-and=20the=20rank=20of=20the=20array=20to=20be=20= returned.=20=20Each=20integer=20in=20that=0A-range=20must=20appear=20at=20= least=20once=20in=20the=20argument=20list.=0A+As=20another=20example,=20= let=20@code{a}=20be=20a=20rank-2=20array=20where=20each=20row=20is=20a=20= 2-vector=20@math{(x,y)}.=0A+Let's=20compute=20the=20arguments=20of=20= these=20vectors=20and=20store=20them=20in=20rank-1=20array=20@code{b}.=0A= +@lisp=0A+(array-for-each-cell=201=0A+=20=20(lambda=20(a=20b)=0A+=20=20=20= =20(array-set!=20b=20(atan=20(array-ref=20a=201)=20(array-ref=20a=20= 0))))=0A+=20=20a=20b)=0A+@end=20lisp=0A=20=0A-The=20values=20of=20= @var{dim1},=20@var{dim2},=20@dots{}=20correspond=20to=0A-dimensions=20in=20= the=20array=20to=20be=20returned,=20and=20their=20positions=20in=20the=0A= -argument=20list=20to=20dimensions=20of=20@var{array}.=20=20Several=20= @var{dim}s=0A-may=20have=20the=20same=20value,=20in=20which=20case=20the=20= returned=20array=20will=0A-have=20smaller=20rank=20than=20@var{array}.=0A= +@code{(apply=20array-for-each-cell=20frame-rank=20op=20x)}=20is=20= functionally=0A+equivalent=20to=0A=20=0A=20@lisp=0A-(transpose-array=20= '#2((a=20b)=20(c=20d))=201=200)=20@result{}=20#2((a=20c)=20(b=20d))=0A= -(transpose-array=20'#2((a=20b)=20(c=20d))=200=200)=20@result{}=20#1(a=20= d)=0A-(transpose-array=20'#3(((a=20b=20c)=20(d=20e=20f))=20((1=202=203)=20= (4=205=206)))=201=201=200)=20@result{}=0A-=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20#2((a=204)=20(b=205)=20(c=206))=0A+(let=20((frame=20(take=20= (array-dimensions=20(car=20x))=20frank)))=0A+=20=20(unless=20(every=20= (lambda=20(x)=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (equal?=20frame=20(take=20(array-dimensions=20x)=20frank)))=0A+=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20(cdr=20x))=0A+=20=20=20=20= (error))=0A+=20=20(array-index-map!=0A+=20=20=20=20(apply=20= make-shared-array=20(make-array=20#t)=20(const=20'())=20frame)=0A+=20=20=20= =20(lambda=20i=20(apply=20op=20(map=20(lambda=20(x)=20(apply=20= array-from*=20x=20i))=20x)))))=0A=20@end=20lisp=0A+=0A=20@end=20deffn=0A=20= =0A+=0A=20@node=20Accessing=20Arrays=20from=20C=0A=20@subsubsection=20= Accessing=20Arrays=20from=20C=0A=20=0Adiff=20--git=20= a/libguile/array-map.c=20b/libguile/array-map.c=0Aindex=20= 01bebb8..f907786=20100644=0A---=20a/libguile/array-map.c=0A+++=20= b/libguile/array-map.c=0A@@=20-42,7=20+42,7=20@@=0A=20=0A=20#include=20= "libguile/validate.h"=0A=20#include=20"libguile/array-map.h"=0A-=0C=0A= +#include=20=0A=20=0A=20/*=20The=20WHAT=20argument=20for=20= `scm_gc_malloc=20()'=20et=20al.=20=20*/=0A=20static=20const=20char=20= vi_gc_hint[]=20=3D=20"array-indices";=0A@@=20-629,7=20+629,8=20@@=20= SCM_DEFINE=20(scm_i_array_equal_p,=20"array-equal?",=200,=202,=201,=0A=20= =20=20=20=20return=20SCM_BOOL_T;=0A=20=0A=20=20=20while=20(!scm_is_null=20= (rest))=0A-=20=20=20=20{=20if=20(scm_is_false=20(scm_array_equal_p=20= (ra0,=20ra1)))=0A+=20=20=20=20{=0A+=20=20=20=20=20=20if=20(scm_is_false=20= (scm_array_equal_p=20(ra0,=20ra1)))=0A=20=20=20=20=20=20=20=20=20return=20= SCM_BOOL_F;=0A=20=20=20=20=20=20=20ra0=20=3D=20ra1;=0A=20=20=20=20=20=20=20= ra1=20=3D=20scm_car=20(rest);=0A@@=20-640,6=20+641,261=20@@=20SCM_DEFINE=20= (scm_i_array_equal_p,=20"array-equal?",=200,=202,=201,=0A=20#undef=20= FUNC_NAME=0A=20=0A=20=0A+/*=20Copy=20array=20descriptor=20with=20= different=20base.=20*/=0A+SCM=0A+scm_i_array_rebase=20(SCM=20a,=20size_t=20= base)=0A+{=0A+=20=20=20=20size_t=20ndim=20=3D=20SCM_I_ARRAY_NDIM=20(a);=0A= +=20=20=20=20SCM=20b=20=3D=20scm_words=20(((scm_t_bits)=20ndim=20<<=20= 17)=20+=20scm_tc7_array,=203=20+=20ndim*3);=0A+=20=20=20=20= SCM_I_ARRAY_SET_V=20(b,=20SCM_I_ARRAY_V=20(a));=0A+/*=20FIXME=20do=20= check=20base=20*/=0A+=20=20=20=20SCM_I_ARRAY_SET_BASE=20(b,=20base);=0A+=20= =20=20=20memcpy=20(SCM_I_ARRAY_DIMS=20(b),=20SCM_I_ARRAY_DIMS=20(a),=20= sizeof=20(scm_t_array_dim)*ndim);=0A+=20=20=20=20return=20b;=0A+}=0A+=0A= +static=20inline=20size_t=20padtoptr(size_t=20d)=20{=20return=20(d=20+=20= (sizeof=20(void=20*)=20-=201))=20&=20~(sizeof=20(void=20*)=20-=201);=20}=0A= +=0A+SCM_DEFINE=20(scm_array_for_each_cell,=20"array-for-each-cell",=20= 2,=200,=201,=0A+=20=20=20=20=20=20=20=20=20=20=20=20(SCM=20frame_rank,=20= SCM=20op,=20SCM=20args),=0A+=20=20=20=20=20=20=20=20=20=20=20=20"Apply=20= @var{op}=20to=20each=20of=20the=20cells=20of=20rank=20= rank(@var{arg})-@var{frame_rank}\n"=0A+=20=20=20=20=20=20=20=20=20=20=20=20= "of=20the=20arrays=20@var{args},=20in=20unspecified=20order.=20The=20= first\n"=0A+=20=20=20=20=20=20=20=20=20=20=20=20"@var{frame_rank}=20= dimensions=20of=20each=20@var{arg}=20must=20match.\n"=0A+=20=20=20=20=20=20= =20=20=20=20=20=20"Rank-0=20cells=20are=20passed=20as=20rank-0=20= arrays.\n\n"=0A+=20=20=20=20=20=20=20=20=20=20=20=20"The=20value=20= returned=20is=20unspecified.\n\n"=0A+=20=20=20=20=20=20=20=20=20=20=20=20= "For=20example:\n"=0A+=20=20=20=20=20=20=20=20=20=20=20=20"@lisp\n"=0A+=20= =20=20=20=20=20=20=20=20=20=20=20";;=20Sort=20the=20rows=20of=20rank-2=20= array=20A.\n\n"=0A+=20=20=20=20=20=20=20=20=20=20=20=20= "(array-for-each-cell=201=20(lambda=20(x)=20(sort!=20x=20<))=20a)\n"=0A+=20= =20=20=20=20=20=20=20=20=20=20=20"\n"=0A+=20=20=20=20=20=20=20=20=20=20=20= =20";;=20Compute=20the=20arguments=20of=20the=20(x=20y)=20vectors=20in=20= the=20rows=20of=20rank-2\n"=0A+=20=20=20=20=20=20=20=20=20=20=20=20";;=20= array=20XYS=20and=20store=20them=20in=20rank-1=20array=20ANGLES.=20= Inside=20OP,\n"=0A+=20=20=20=20=20=20=20=20=20=20=20=20";;=20XY=20is=20a=20= rank-1=20(2-1)=20array,=20and=20ANGLE=20is=20a=20rank-0=20(1-1)=20= array.\n\n"=0A+=20=20=20=20=20=20=20=20=20=20=20=20"(array-for-each-cell=20= 1=20\n"=0A+=20=20=20=20=20=20=20=20=20=20=20=20"=20=20(lambda=20(xy=20= angle)\n"=0A+=20=20=20=20=20=20=20=20=20=20=20=20"=20=20=20=20= (array-set!=20angle=20(atan=20(array-ref=20xy=201)=20(array-ref=20xy=20= 0))))\n"=0A+=20=20=20=20=20=20=20=20=20=20=20=20"=20=20xys=20angles)\n"=0A= +=20=20=20=20=20=20=20=20=20=20=20=20"@end=20lisp")=0A+#define=20= FUNC_NAME=20s_scm_array_for_each_cell=0A+{=0A+=20=20int=20const=20N=20=3D=20= scm_ilength=20(args);=0A+=20=20int=20const=20frank=20=3D=20scm_to_int=20= (frame_rank);=0A+=20=20int=20ocd;=0A+=20=20ssize_t=20step;=0A+=20=20SCM=20= dargs_=20=3D=20SCM_EOL;=0A+=20=20char=20const=20*=20msg;=0A+=20=20= scm_t_array_dim=20*=20ais;=0A+=20=20int=20n,=20k;=0A+=20=20ssize_t=20z;=0A= +=0A+=20=20/*=20to=20be=20allocated=20inside=20the=20pool=20*/=0A+=20=20= scm_t_array_handle=20*=20ah;=0A+=20=20SCM=20*=20args_;=0A+=20=20= scm_t_array_dim=20**=20as;=0A+=20=20int=20*=20rank;=0A+=0A+=20=20ssize_t=20= *=20s;=0A+=20=20SCM=20*=20ai;=0A+=20=20SCM=20**=20dargs;=0A+=20=20= ssize_t=20*=20i;=0A+=0A+=20=20int=20*=20order;=0A+=20=20size_t=20*=20= base;=0A+=0A+=20=20/*=20size=20the=20pool=20*/=0A+=20=20char=20*=20pool;=0A= +=20=20char=20*=20pool0;=0A+=20=20size_t=20pool_size=20=3D=200;=0A+=20=20= pool_size=20+=3D=20padtoptr(N*sizeof=20(scm_t_array_handle));=0A+=20=20= pool_size=20+=3D=20padtoptr(N*sizeof=20(SCM));=0A+=20=20pool_size=20+=3D=20= padtoptr(N*sizeof=20(scm_t_array_dim=20*));=0A+=20=20pool_size=20+=3D=20= padtoptr(N*sizeof=20(int));=0A+=0A+=20=20pool_size=20+=3D=20= padtoptr(frank*sizeof=20(ssize_t));=0A+=20=20pool_size=20+=3D=20= padtoptr(N*sizeof=20(SCM));=0A+=20=20pool_size=20+=3D=20= padtoptr(N*sizeof=20(SCM=20*));=0A+=20=20pool_size=20+=3D=20= padtoptr(frank*sizeof=20(ssize_t));=0A+=0A+=20=20pool_size=20+=3D=20= padtoptr(frank*sizeof=20(int));=0A+=20=20pool_size=20+=3D=20= padtoptr(N*sizeof=20(size_t));=0A+=20=20pool=20=3D=20scm_gc_malloc=20= (pool_size,=20"pool");=0A+=0A+=20=20/*=20place=20the=20items=20in=20the=20= pool=20*/=0A+#define=20AFIC_ALLOC_ADVANCE(pool,=20count,=20type,=20name)=20= =20=20=20\=0A+=20=20name=20=3D=20(void=20*)pool;=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= \=0A+=20=20pool=20+=3D=20padtoptr(count*sizeof=20(type));=0A+=0A+=20=20= pool0=20=3D=20pool;=0A+=20=20AFIC_ALLOC_ADVANCE=20(pool,=20N,=20= scm_t_array_handle,=20ah);=0A+=20=20AFIC_ALLOC_ADVANCE=20(pool,=20N,=20= SCM,=20args_);=0A+=20=20AFIC_ALLOC_ADVANCE=20(pool,=20N,=20= scm_t_array_dim=20*,=20as);=0A+=20=20AFIC_ALLOC_ADVANCE=20(pool,=20N,=20= int,=20rank);=0A+=0A+=20=20AFIC_ALLOC_ADVANCE=20(pool,=20frank,=20= ssize_t,=20s);=0A+=20=20AFIC_ALLOC_ADVANCE=20(pool,=20N,=20SCM,=20ai);=0A= +=20=20AFIC_ALLOC_ADVANCE=20(pool,=20N,=20SCM=20*,=20dargs);=0A+=20=20= AFIC_ALLOC_ADVANCE=20(pool,=20frank,=20ssize_t,=20i);=0A+=0A+=20=20= AFIC_ALLOC_ADVANCE=20(pool,=20frank,=20int,=20order);=0A+=20=20= AFIC_ALLOC_ADVANCE=20(pool,=20N,=20size_t,=20base);=0A+=20=20= assert((pool0+pool_size=3D=3Dpool)=20&&=20"internal=20error");=0A+#undef=20= AFIC_ALLOC_ADVANCE=0A+=0A+=20=20for=20(n=3D0;=20scm_is_pair(args);=20= args=3Dscm_cdr(args),=20++n)=0A+=20=20=20=20{=0A+=20=20=20=20=20=20= args_[n]=20=3D=20scm_car(args);=0A+=20=20=20=20=20=20= scm_array_get_handle(args_[n],=20ah+n);=0A+=20=20=20=20=20=20as[n]=20=3D=20= scm_array_handle_dims(ah+n);=0A+=20=20=20=20=20=20rank[n]=20=3D=20= scm_array_handle_rank(ah+n);=0A+=20=20=20=20}=0A+=20=20/*=20checks=20*/=0A= +=20=20msg=20=3D=20NULL;=0A+=20=20if=20(frank<0)=0A+=20=20=20=20msg=20=3D=20= "bad=20frame=20rank";=0A+=20=20else=0A+=20=20=20=20{=0A+=20=20=20=20=20=20= for=20(n=3D0;=20n!=3DN;=20++n)=0A+=20=20=20=20=20=20=20=20{=0A+=20=20=20=20= =20=20=20=20=20=20if=20(rank[n]=0A=20#include=20=0A= =20#include=20=0A-#include=20=0A=20=0A=20#include=20= "verify.h"=0A=20=0A@@=20-551,7=20+550,7=20@@=20SCM_DEFINE=20= (scm_array_amend_x,=20"array-amend!",=202,=200,=201,=0A=20=20=20=20=20=20= =20=20=20{=20ARRAY_FROM_GET_O=20}=0A=20=20=20=20=20=20=20= scm_array_handle_release(&handle);=0A=20=20=20=20=20=20=20/*=20an=20= error=20is=20still=20possible=20here=20if=20o=20and=20b=20don't=20match.=20= */=0A-=20=20=20=20=20=20/*=20TODO=20copying=20like=20this=20wastes=20the=20= handle,=20and=20the=20bounds=20matching=0A+=20=20=20=20=20=20/*=20FIXME=20= copying=20like=20this=20wastes=20the=20handle,=20and=20the=20bounds=20= matching=0A=20=20=20=20=20=20=20=20=20=20behavior=20of=20array-copy!=20= is=20not=20strict.=20*/=0A=20=20=20=20=20=20=20scm_array_copy_x(b,=20o);=0A= =20=20=20=20=20}=0A@@=20-569,7=20+568,6=20@@=20SCM_DEFINE=20= (scm_array_amend_x,=20"array-amend!",=202,=200,=201,=0A=20}=0A=20#undef=20= FUNC_NAME=0A=20=0A-=0A=20#undef=20ARRAY_FROM_POS=0A=20#undef=20= ARRAY_FROM_GET_O=0A=20=0A@@=20-948,6=20+946,7=20@@=20scm_i_print_array=20= (SCM=20array,=20SCM=20port,=20scm_print_state=20*pstate)=0A=20=20=20=20=20= return=20scm_i_print_array_dimension=20(&h,=200,=200,=20port,=20pstate);=0A= =20}=0A=20=0A+=0A=20void=0A=20scm_init_arrays=20()=0A=20{=0Adiff=20--git=20= a/test-suite/Makefile.am=20b/test-suite/Makefile.am=0Aindex=20= 473501e..49584b9=20100644=0A---=20a/test-suite/Makefile.am=0A+++=20= b/test-suite/Makefile.am=0A@@=20-115,7=20+115,7=20@@=20SCM_TESTS=20=3D=20= tests/00-initial-env.test=09=09\=0A=20=09=20=20=20=20= tests/r6rs-records-syntactic.test=09\=0A=20=09=20=20=20=20= tests/r6rs-unicode.test=09=09\=0A=20=09=20=20=20=20= tests/rnrs-libraries.test=09=09\=0A-=09=20=20=20=20tests/ramap.test=09=09= =09\=0A+=09=20=20=20=20tests/array-map.test=09=09\=0A=20=09=20=20=20=20= tests/random.test=09=09=09\=0A=20=09=20=20=20=20tests/rdelim.test=09=09=09= \=0A=20=09=20=20=20=20tests/reader.test=09=09=09\=0Adiff=20--git=20= a/test-suite/tests/array-map.test=20b/test-suite/tests/array-map.test=0A= new=20file=20mode=20100644=0Aindex=200000000..3095b78=0A---=20/dev/null=0A= +++=20b/test-suite/tests/array-map.test=0A@@=20-0,0=20+1,540=20@@=0A= +;;;;=20array-map.test=20---=20test=20array=20mapping=20functions=20-*-=20= scheme=20-*-=0A+;;;;=20=0A+;;;;=20Copyright=20(C)=202004,=202005,=20= 2006,=202009,=202013=20Free=20Software=20Foundation,=20Inc.=0A+;;;;=0A= +;;;;=20This=20library=20is=20free=20software;=20you=20can=20= redistribute=20it=20and/or=0A+;;;;=20modify=20it=20under=20the=20terms=20= of=20the=20GNU=20Lesser=20General=20Public=0A+;;;;=20License=20as=20= published=20by=20the=20Free=20Software=20Foundation;=20either=0A+;;;;=20= version=203=20of=20the=20License,=20or=20(at=20your=20option)=20any=20= later=20version.=0A+;;;;=20=0A+;;;;=20This=20library=20is=20distributed=20= in=20the=20hope=20that=20it=20will=20be=20useful,=0A+;;;;=20but=20= WITHOUT=20ANY=20WARRANTY;=20without=20even=20the=20implied=20warranty=20= of=0A+;;;;=20MERCHANTABILITY=20or=20FITNESS=20FOR=20A=20PARTICULAR=20= PURPOSE.=20=20See=20the=20GNU=0A+;;;;=20Lesser=20General=20Public=20= License=20for=20more=20details.=0A+;;;;=20=0A+;;;;=20You=20should=20have=20= received=20a=20copy=20of=20the=20GNU=20Lesser=20General=20Public=0A+;;;;=20= License=20along=20with=20this=20library;=20if=20not,=20write=20to=20the=20= Free=20Software=0A+;;;;=20Foundation,=20Inc.,=2051=20Franklin=20Street,=20= Fifth=20Floor,=20Boston,=20MA=2002110-1301=20USA=0A+=0A+(define-module=20= (test-suite=20test-array-map)=0A+=20=20#:use-module=20(test-suite=20= lib))=0A+=0A+(define=20exception:shape-mismatch=0A+=20=20(cons=20= 'misc-error=20".*shape=20mismatch.*"))=0A+=0A+(define=20(array-row=20a=20= i)=0A+=20=20(make-shared-array=20a=20(lambda=20(j)=20(list=20i=20j))=0A+=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(cadr=20= (array-dimensions=20a))))=0A+=0A+(define=20(array-col=20a=20j)=0A+=20=20= (make-shared-array=20a=20(lambda=20(i)=20(list=20i=20j))=0A+=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(car=20= (array-dimensions=20a))))=0A+=0A+;;;=0A+;;;=20array-index-map!=0A+;;;=0A= +=0A+(with-test-prefix=20"array-index-map!"=0A+=0A+=20=20(pass-if=20= "basic=20test"=0A+=20=20=20=20(let=20((nlst=20'()))=0A+=20=20=20=20=20=20= (array-index-map!=20(make-array=20#f=20'(1=201))=0A+=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(lambda=20(n)=0A+=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (set!=20nlst=20(cons=20n=20nlst))))=0A+=20=20=20=20=20=20(equal?=20nlst=20= '(1))))=0A+=0A+=20=20(with-test-prefix=20"empty=20arrays"=0A+=0A+=20=20=20= =20(pass-if=20"all=20axes=20empty"=0A+=20=20=20=20=20=20= (array-index-map!=20(make-typed-array=20'f64=200=200=200)=20(const=200))=0A= +=20=20=20=20=20=20(array-index-map!=20(make-typed-array=20'b=20#t=200=20= 0)=20(const=20#t))=0A+=20=20=20=20=20=20(array-index-map!=20= (make-typed-array=20#t=200=200=200)=20(const=200))=0A+=20=20=20=20=20=20= #t)=0A+=0A+=20=20=20=20(pass-if=20"last=20axis=20empty"=0A+=20=20=20=20=20= =20(array-index-map!=20(make-typed-array=20'f64=200=202=200)=20(const=20= 0))=0A+=20=20=20=20=20=20(array-index-map!=20(make-typed-array=20'b=20#t=20= 2=200)=20(const=20#t))=0A+=20=20=20=20=20=20(array-index-map!=20= (make-typed-array=20#t=200=202=200)=20(const=200))=0A+=20=20=20=20=20=20= #t)=0A+=0A+=20=20=20=20;=20the=20'f64=20cases=20fail=20in=202.0.9=20with=20= out-of-range.=0A+=20=20=20=20(pass-if=20"axis=20empty,=20other=20than=20= last"=0A+=20=20=20=20=20=20(array-index-map!=20(make-typed-array=20'f64=20= 0=200=202)=20(const=200))=0A+=20=20=20=20=20=20(array-index-map!=20= (make-typed-array=20'b=20#t=200=202)=20(const=20#t))=0A+=20=20=20=20=20=20= (array-index-map!=20(make-typed-array=20#t=200=200=202)=20(const=200))=0A= +=20=20=20=20=20=20#t))=0A+=0A+=20=20(pass-if=20"rank=202"=0A+=20=20=20=20= (let=20((a=20(make-array=200=202=202))=0A+=20=20=20=20=20=20=20=20=20=20= (b=20(make-array=200=202=202)))=0A+=20=20=20=20=20=20(array-index-map!=20= a=20(lambda=20(i=20j)=20i))=0A+=20=20=20=20=20=20(array-index-map!=20b=20= (lambda=20(i=20j)=20j))=0A+=20=20=20=20=20=20(and=20(array-equal?=20a=20= #2((0=200)=20(1=201)))=0A+=20=20=20=20=20=20=20=20=20=20=20(array-equal?=20= b=20#2((0=201)=20(0=201)))))))=0A+=0A+;;;=0A+;;;=20array-copy!=0A+;;;=0A= +=0A+(with-test-prefix=20"array-copy!"=0A+=0A+=20=20(with-test-prefix=20= "empty=20arrays"=0A+=0A+=20=20=20=20(pass-if=20"empty=20other=20than=20= last,=20#t"=0A+=20=20=20=20=20=20(let*=20((b=20(make-array=200=202=202))=0A= +=20=20=20=20=20=20=20=20=20=20=20=20=20(c=20(make-shared-array=20b=20= (lambda=20(i=20j)=20(list=20i=20j))=200=202)))=0A+=20=20=20=20=20=20=20=20= (array-copy!=20#2:0:2()=20c)=0A+=20=20=20=20=20=20=20=20(array-equal?=20= #2:0:2()=20c)))=0A+=0A+=20=20=20=20(pass-if=20"empty=20other=20than=20= last,=20'f64"=0A+=20=20=20=20=20=20(let*=20((b=20(make-typed-array=20= 'f64=200=202=202))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20(c=20= (make-shared-array=20b=20(lambda=20(i=20j)=20(list=20i=20j))=200=202)))=0A= +=20=20=20=20=20=20=20=20(array-copy!=20#2:0:2()=20c)=0A+=20=20=20=20=20=20= =20=20(array-equal?=20#2f64:0:2()=20c)))=0A+=0A+=20=20;;=20FIXME=20add=20= empty,=20type=20'b=20cases.=0A+=0A+=20=20=20=20)=0A+=0A+=20=20;;=20note=20= that=20it=20is=20the=20opposite=20of=20array-map!.=20This=20is,=20= unfortunately,=0A+=20=20;;=20documented=20in=20the=20manual.=0A+=0A+=20=20= (pass-if=20"matching=20behavior=20I"=0A+=20=20=20=20(let=20((a=20#(1=20= 2))=0A+=20=20=20=20=20=20=20=20=20=20(b=20(make-array=200=203)))=0A+=20=20= =20=20=20=20(array-copy!=20a=20b)=0A+=20=20=20=20=20=20(equal?=20b=20#(1=20= 2=200))))=0A+=0A+=20=20(pass-if-exception=20"matching=20behavior=20II"=20= exception:shape-mismatch=0A+=20=20=20=20(let=20((a=20#(1=202=203))=0A+=20= =20=20=20=20=20=20=20=20=20(b=20(make-array=200=202)))=0A+=20=20=20=20=20= =20(array-copy!=20a=20b)=0A+=20=20=20=20=20=20(equal?=20b=20#(1=202))))=0A= +=0A+=20=20;;=20here=20both=20a=20&=20b=20are=20are=20unrollable=20down=20= to=20the=20first=20axis,=20but=20the=0A+=20=20;;=20size=20mismatch=20= limits=20unrolling=20to=20the=20last=20axis=20only.=0A+=0A+=20=20= (pass-if=20"matching=20behavior=20III"=0A+=20=20=20=20(let=20((a=20= #3(((1=202)=20(3=204))=20((5=206)=20(7=208))))=0A+=20=20=20=20=20=20=20=20= =20=20(b=20(make-array=200=202=203=202)))=0A+=20=20=20=20=20=20= (array-copy!=20a=20b)=0A+=20=20=20=20=20=20(array-equal?=20b=20#3(((1=20= 2)=20(3=204)=20(0=200))=20((5=206)=20(7=208)=20(0=200))))))=0A+=0A+=20=20= (pass-if=20"rank=200"=0A+=20=20=20=20(let=20((a=20#0(99))=0A+=20=20=20=20= =20=20=20=20=20=20(b=20(make-array=200)))=0A+=20=20=20=20=20=20= (array-copy!=20a=20b)=0A+=20=20=20=20=20=20(equal?=20b=20#0(99))))=0A+=0A= +=20=20(pass-if=20"rank=201"=0A+=20=20=20=20(let*=20((a=20#2((1=202)=20= (3=204)))=0A+=20=20=20=20=20=20=20=20=20=20=20(b=20(make-shared-array=20= a=20(lambda=20(j)=20(list=201=20j))=202))=0A+=20=20=20=20=20=20=20=20=20=20= =20(c=20(make-shared-array=20a=20(lambda=20(i)=20(list=20(-=201=20i)=20= 1))=202))=0A+=20=20=20=20=20=20=20=20=20=20=20(d=20(make-array=200=202))=0A= +=20=20=20=20=20=20=20=20=20=20=20(e=20(make-array=200=202)))=0A+=20=20=20= =20=20=20(array-copy!=20b=20d)=0A+=20=20=20=20=20=20(array-copy!=20c=20= e)=0A+=20=20=20=20=20=20(and=20(equal?=20d=20#(3=204))=0A+=20=20=20=20=20= =20=20=20=20=20=20(equal?=20e=20#(4=202)))))=0A+=0A+=20=20(pass-if=20= "rank=202"=0A+=20=20=20=20(let=20((a=20#2((1=202)=20(3=204)))=0A+=20=20=20= =20=20=20=20=20=20=20(b=20(make-array=200=202=202))=0A+=20=20=20=20=20=20= =20=20=20=20(c=20(make-array=200=202=202))=0A+=20=20=20=20=20=20=20=20=20= =20(d=20(make-array=200=202=202))=0A+=20=20=20=20=20=20=20=20=20=20(e=20= (make-array=200=202=202)))=0A+=20=20=20=20=20=20(array-copy!=20a=20b)=0A= +=20=20=20=20=20=20(array-copy!=20a=20(transpose-array=20c=201=200))=0A+=20= =20=20=20=20=20(array-copy!=20(transpose-array=20a=201=200)=20d)=0A+=20=20= =20=20=20=20(array-copy!=20(transpose-array=20a=201=200)=20= (transpose-array=20e=201=200))=0A+=20=20=20=20=20=20(and=20(equal?=20a=20= #2((1=202)=20(3=204)))=0A+=20=20=20=20=20=20=20=20=20=20=20(equal?=20b=20= #2((1=202)=20(3=204)))=0A+=20=20=20=20=20=20=20=20=20=20=20(equal?=20c=20= #2((1=203)=20(2=204)))=0A+=20=20=20=20=20=20=20=20=20=20=20(equal?=20d=20= #2((1=203)=20(2=204)))=0A+=20=20=20=20=20=20=20=20=20=20=20(equal?=20e=20= #2((1=202)=20(3=204))))))=0A+=0A+=20=20(pass-if=20"rank=202,=20= discontinuous"=0A+=20=20=20=20(let=20((A=20#2((0=201)=20(2=203)=20(4=20= 5)))=0A+=20=20=20=20=20=20=20=20=20=20(B=20#2((10=2011)=20(12=2013)=20= (14=2015)))=0A+=20=20=20=20=20=20=20=20=20=20(C=20#2((20)=20(21)=20= (22)))=0A+=20=20=20=20=20=20=20=20=20=20(X=20(make-array=200=203=205))=0A= +=20=20=20=20=20=20=20=20=20=20(piece=20(lambda=20(X=20w=20s)=0A+=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(make-shared-array=0A+=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20X=20(lambda=20= (i=20j)=20(list=20i=20(+=20j=20s)))=203=20w))))=0A+=20=20=20=20=20=20= (array-copy!=20A=20(piece=20X=202=200))=0A+=20=20=20=20=20=20= (array-copy!=20B=20(piece=20X=202=202))=0A+=20=20=20=20=20=20= (array-copy!=20C=20(piece=20X=201=204))=0A+=20=20=20=20=20=20(and=20= (array-equal?=20X=20#2((0=201=2010=2011=2020)=20(2=203=2012=2013=2021)=20= (4=205=2014=2015=2022))))))=0A+=0A+=20=20(pass-if=20"null=20increments,=20= not=20empty"=0A+=20=20=20=20(let=20((a=20(make-array=200=202=202)))=0A+=20= =20=20=20=20=20(array-copy!=20(make-shared-array=20#0(1)=20(lambda=20x=20= '())=202=202)=20a)=0A+=20=20=20=20=20=20(array-equal?=20#2((1=201)=20(1=20= 1))))))=0A+=0A+;;;=0A+;;;=20array-map!=0A+;;;=0A+=0A+(with-test-prefix=20= "array-map!"=0A+=0A+=20=20(pass-if-exception=20"no=20args"=20= exception:wrong-num-args=0A+=20=20=20=20(array-map!))=0A+=0A+=20=20= (pass-if-exception=20"one=20arg"=20exception:wrong-num-args=0A+=20=20=20=20= (array-map!=20(make-array=20#f=205)))=0A+=0A+=20=20(with-test-prefix=20= "no=20sources"=0A+=0A+=20=20=20=20(pass-if=20"closure=200"=0A+=20=20=20=20= =20=20(array-map!=20(make-array=20#f=205)=20(lambda=20()=20#f))=0A+=20=20= =20=20=20=20#t)=0A+=0A+=20=20=20=20(pass-if-exception=20"closure=201"=20= exception:wrong-num-args=0A+=20=20=20=20=20=20(array-map!=20(make-array=20= #f=205)=20(lambda=20(x)=20#f)))=0A+=0A+=20=20=20=20(pass-if-exception=20= "closure=202"=20exception:wrong-num-args=0A+=20=20=20=20=20=20= (array-map!=20(make-array=20#f=205)=20(lambda=20(x=20y)=20#f)))=0A+=0A+=20= =20=20=20(pass-if-exception=20"subr_1"=20exception:wrong-num-args=0A+=20=20= =20=20=20=20(array-map!=20(make-array=20#f=205)=20length))=0A+=0A+=20=20=20= =20(pass-if-exception=20"subr_2"=20exception:wrong-num-args=0A+=20=20=20=20= =20=20(array-map!=20(make-array=20#f=205)=20logtest))=0A+=0A+=20=20=20=20= (pass-if-exception=20"subr_2o"=20exception:wrong-num-args=0A+=20=20=20=20= =20=20(array-map!=20(make-array=20#f=205)=20number->string))=0A+=0A+=20=20= =20=20(pass-if-exception=20"dsubr"=20exception:wrong-num-args=0A+=20=20=20= =20=20=20(array-map!=20(make-array=20#f=205)=20sqrt))=0A+=0A+=20=20=20=20= (pass-if=20"rpsubr"=0A+=20=20=20=20=20=20(let=20((a=20(make-array=20'foo=20= 5)))=0A+=09(array-map!=20a=20=3D)=0A+=09(equal?=20a=20(make-array=20#t=20= 5))))=0A+=0A+=20=20=20=20(pass-if=20"asubr"=0A+=20=20=20=20=20=20(let=20= ((a=20(make-array=20'foo=205)))=0A+=09(array-map!=20a=20+)=0A+=09(equal?=20= a=20(make-array=200=205))))=0A+=0A+=20=20=20=20;;=20in=20Guile=201.6.4=20= and=20earlier=20this=20resulted=20in=20a=20segv=0A+=20=20=20=20(pass-if=20= "noop"=0A+=20=20=20=20=20=20(array-map!=20(make-array=20#f=205)=20noop)=0A= +=20=20=20=20=20=20#t))=0A+=0A+=20=20(with-test-prefix=20"one=20source"=0A= +=0A+=20=20=20=20(pass-if-exception=20"closure=200"=20= exception:wrong-num-args=0A+=20=20=20=20=20=20(array-map!=20(make-array=20= #f=205)=20(lambda=20()=20#f)=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20(make-array=20#f=205)))=0A+=0A+=20=20=20=20(pass-if=20= "closure=201"=0A+=20=20=20=20=20=20(let=20((a=20(make-array=20#f=205)))=0A= +=09(array-map!=20a=20(lambda=20(x)=20'foo)=20(make-array=20#f=205))=0A+=09= (equal?=20a=20(make-array=20'foo=205))))=0A+=0A+=20=20=20=20= (pass-if-exception=20"closure=202"=20exception:wrong-num-args=0A+=20=20=20= =20=20=20(array-map!=20(make-array=20#f=205)=20(lambda=20(x=20y)=20#f)=0A= +=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(make-array=20#f=20= 5)))=0A+=0A+=20=20=20=20(pass-if=20"subr_1"=0A+=20=20=20=20=20=20(let=20= ((a=20(make-array=20#f=205)))=0A+=20=20=20=20=20=20=20=20(array-map!=20a=20= length=20(make-array=20'(x=20y=20z)=205))=0A+=20=20=20=20=20=20=20=20= (equal?=20a=20(make-array=203=205))))=0A+=0A+=20=20=20=20= (pass-if-exception=20"subr_2"=20exception:wrong-num-args=0A+=20=20=20=20=20= =20(array-map!=20(make-array=20#f=205)=20logtest=0A+=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20(make-array=20999=205)))=0A+=0A+=20=20=20= =20(pass-if=20"subr_2o"=0A+=20=20=20=20=20=20(let=20((a=20(make-array=20= #f=205)))=0A+=09(array-map!=20a=20number->string=20(make-array=2099=20= 5))=0A+=09(equal?=20a=20(make-array=20"99"=205))))=0A+=0A+=20=20=20=20= (pass-if=20"dsubr"=0A+=20=20=20=20=20=20(let=20((a=20(make-array=20#f=20= 5)))=0A+=09(array-map!=20a=20sqrt=20(make-array=2016.0=205))=0A+=09= (equal?=20a=20(make-array=204.0=205))))=0A+=0A+=20=20=20=20(pass-if=20= "rpsubr"=0A+=20=20=20=20=20=20(let=20((a=20(make-array=20'foo=205)))=0A+=09= (array-map!=20a=20=3D=20(make-array=200=205))=0A+=09(equal?=20a=20= (make-array=20#t=205))))=0A+=0A+=20=20=20=20(pass-if=20"asubr"=0A+=20=20=20= =20=20=20(let=20((a=20(make-array=20'foo=205)))=0A+=09(array-map!=20a=20= -=20(make-array=2099=205))=0A+=09(equal?=20a=20(make-array=20-99=205))))=0A= +=0A+=20=20=20=20;;=20in=20Guile=201.6.5=20and=201.6.6=20this=20was=20an=20= error=0A+=20=20=20=20(pass-if=20"1+"=0A+=20=20=20=20=20=20(let=20((a=20= (make-array=20#f=205)))=0A+=09(array-map!=20a=201+=20(make-array=20123=20= 5))=0A+=09(equal?=20a=20(make-array=20124=205))))=0A+=0A+=20=20=20=20= (pass-if=20"rank=200"=0A+=20=20=20=20=20=20(let=20((a=20#0(99))=0A+=20=20= =20=20=20=20=20=20=20=20=20=20(b=20(make-array=200)))=0A+=20=20=20=20=20=20= =20=20(array-map!=20b=20values=20a)=0A+=20=20=20=20=20=20=20=20(equal?=20= b=20#0(99))))=0A+=0A+=20=20=20=20(pass-if=20"rank=202,=20discontinuous"=0A= +=20=20=20=20=20=20(let=20((A=20#2((0=201)=20(2=203)=20(4=205)))=0A+=20=20= =20=20=20=20=20=20=20=20=20=20(B=20#2((10=2011)=20(12=2013)=20(14=20= 15)))=0A+=20=20=20=20=20=20=20=20=20=20=20=20(C=20#2((20)=20(21)=20= (22)))=0A+=20=20=20=20=20=20=20=20=20=20=20=20(X=20(make-array=200=203=20= 5))=0A+=20=20=20=20=20=20=20=20=20=20=20=20(piece=20(lambda=20(X=20w=20= s)=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (make-shared-array=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20X=20(lambda=20(i=20j)=20(list=20i=20(+=20j=20s)))=203=20= w))))=0A+=20=20=20=20=20=20=20=20(array-map!=20(piece=20X=202=200)=20= values=20A)=0A+=20=20=20=20=20=20=20=20(array-map!=20(piece=20X=202=202)=20= values=20B)=0A+=20=20=20=20=20=20=20=20(array-map!=20(piece=20X=201=204)=20= values=20C)=0A+=20=20=20=20=20=20=20=20(and=20(array-equal?=20X=20#2((0=20= 1=2010=2011=2020)=20(2=203=2012=2013=2021)=20(4=205=2014=2015=2022))))))=0A= +=0A+=20=20=20=20(pass-if=20"null=20increments,=20not=20empty"=0A+=20=20=20= =20=20=20(let=20((a=20(make-array=200=202=202)))=0A+=20=20=20=20=20=20=20= =20(array-map!=20a=20values=20(make-shared-array=20#0(1)=20(lambda=20x=20= '())=202=202))=0A+=20=20=20=20=20=20=20=20(array-equal?=20a=20#2((1=201)=20= (1=201))))))=0A+=0A+=20=20(with-test-prefix=20"two=20sources"=0A+=0A+=20=20= =20=20(pass-if-exception=20"closure=200"=20exception:wrong-num-args=0A+=20= =20=20=20=20=20(array-map!=20(make-array=20#f=205)=20(lambda=20()=20#f)=0A= +=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(make-array=20#f=20= 5)=20(make-array=20#f=205)))=0A+=0A+=20=20=20=20(pass-if-exception=20= "closure=201"=20exception:wrong-num-args=0A+=20=20=20=20=20=20= (array-map!=20(make-array=20#f=205)=20(lambda=20(x)=20#f)=0A+=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20(make-array=20#f=205)=20= (make-array=20#f=205)))=0A+=0A+=20=20=20=20(pass-if=20"closure=202"=0A+=20= =20=20=20=20=20(let=20((a=20(make-array=20#f=205)))=0A+=20=20=20=20=20=20= =20=20(array-map!=20a=20(lambda=20(x=20y)=20'foo)=0A+=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20(make-array=20#f=205)=20= (make-array=20#f=205))=0A+=20=20=20=20=20=20=20=20(equal?=20a=20= (make-array=20'foo=205))))=0A+=0A+=20=20=20=20(pass-if-exception=20= "subr_1"=20exception:wrong-num-args=0A+=20=20=20=20=20=20(array-map!=20= (make-array=20#f=205)=20length=0A+=09=09=20=20(make-array=20#f=205)=20= (make-array=20#f=205)))=0A+=0A+=20=20=20=20(pass-if=20"subr_2"=0A+=20=20=20= =20=20=20(let=20((a=20(make-array=20'foo=205)))=0A+=09(array-map!=20a=20= logtest=0A+=09=09=20=20=20=20(make-array=20999=205)=20(make-array=20999=20= 5))=0A+=09(equal?=20a=20(make-array=20#t=205))))=0A+=0A+=20=20=20=20= (pass-if=20"subr_2o"=0A+=20=20=20=20=20=20(let=20((a=20(make-array=20#f=20= 5)))=0A+=09(array-map!=20a=20number->string=0A+=09=09=20=20=20=20= (make-array=2032=205)=20(make-array=2016=205))=0A+=09(equal?=20a=20= (make-array=20"20"=205))))=0A+=0A+=20=20=20=20(pass-if-exception=20= "dsubr"=20exception:wrong-num-args=0A+=20=20=20=20=20=20(let=20((a=20= (make-array=20#f=205)))=0A+=09(array-map!=20a=20sqrt=0A+=09=09=20=20=20=20= (make-array=2016.0=205)=20(make-array=2016.0=205))=0A+=09(equal?=20a=20= (make-array=204.0=205))))=0A+=0A+=20=20=20=20(pass-if=20"rpsubr"=0A+=20=20= =20=20=20=20(let=20((a=20(make-array=20'foo=205)))=0A+=09(array-map!=20a=20= =3D=20(make-array=2099=205)=20(make-array=2077=205))=0A+=09(equal?=20a=20= (make-array=20#f=205))))=0A+=0A+=20=20=20=20(pass-if=20"asubr"=0A+=20=20=20= =20=20=20(let=20((a=20(make-array=20'foo=205)))=0A+=09(array-map!=20a=20= -=20(make-array=2099=205)=20(make-array=2011=205))=0A+=09(equal?=20a=20= (make-array=2088=205))))=0A+=0A+=20=20=20=20(pass-if=20"+"=0A+=20=20=20=20= =20=20(let=20((a=20(make-array=20#f=204)))=0A+=09(array-map!=20a=20+=20= #(1=202=203=204)=20#(5=206=207=208))=0A+=09(equal?=20a=20#(6=208=2010=20= 12))))=0A+=0A+=20=20=20=20(pass-if=20"noncompact=20arrays=201"=0A+=20=20=20= =20=20=20(let=20((a=20#2((0=201)=20(2=203)))=0A+=20=20=20=20=20=20=20=20=20= =20=20=20(c=20(make-array=200=202)))=0A+=20=20=20=20=20=20=20=20(begin=0A= +=20=20=20=20=20=20=20=20=20=20(array-map!=20c=20+=20(array-row=20a=201)=20= (array-row=20a=201))=0A+=20=20=20=20=20=20=20=20=20=20(array-equal?=20c=20= #(4=206)))))=0A+=0A+=20=20=20=20(pass-if=20"noncompact=20arrays=202"=0A+=20= =20=20=20=20=20(let=20((a=20#2((0=201)=20(2=203)))=0A+=20=20=20=20=20=20=20= =20=20=20=20=20(c=20(make-array=200=202)))=0A+=20=20=20=20=20=20=20=20= (begin=0A+=20=20=20=20=20=20=20=20=20=20(array-map!=20c=20+=20(array-col=20= a=201)=20(array-col=20a=201))=0A+=20=20=20=20=20=20=20=20=20=20= (array-equal?=20c=20#(2=206)))))=0A+=0A+=20=20=20=20(pass-if=20= "noncompact=20arrays=203"=0A+=20=20=20=20=20=20(let=20((a=20#2((0=201)=20= (2=203)))=0A+=20=20=20=20=20=20=20=20=20=20=20=20(c=20(make-array=200=20= 2)))=0A+=20=20=20=20=20=20=20=20(begin=0A+=20=20=20=20=20=20=20=20=20=20= (array-map!=20c=20+=20(array-col=20a=201)=20(array-row=20a=201))=0A+=20=20= =20=20=20=20=20=20=20=20(array-equal?=20c=20#(3=206)))))=0A+=0A+=20=20=20= =20(pass-if=20"noncompact=20arrays=204"=0A+=20=20=20=20=20=20(let=20((a=20= #2((0=201)=20(2=203)))=0A+=20=20=20=20=20=20=20=20=20=20=20=20(c=20= (make-array=200=202)))=0A+=20=20=20=20=20=20=20=20(begin=0A+=20=20=20=20=20= =20=20=20=20=20(array-map!=20c=20+=20(array-col=20a=201)=20(array-row=20= a=201))=0A+=20=20=20=20=20=20=20=20=20=20(array-equal?=20c=20#(3=20= 6)))))=0A+=0A+=20=20=20=20(pass-if=20"offset=20arrays=201"=0A+=20=20=20=20= =20=20(let=20((a=20#2@1@-3((0=201)=20(2=203)))=0A+=20=20=20=20=20=20=20=20= =20=20=20=20(c=20(make-array=200=20'(1=202)=20'(-3=20-2))))=0A+=20=20=20=20= =20=20=20=20(begin=0A+=20=20=20=20=20=20=20=20=20=20(array-map!=20c=20+=20= a=20a)=0A+=20=20=20=20=20=20=20=20=20=20(array-equal?=20c=20#2@1@-3((0=20= 2)=20(4=206)))))))=0A+=0A+=20=20;;=20note=20that=20array-copy!=20has=20= the=20opposite=20behavior.=0A+=0A+=20=20(pass-if-exception=20"matching=20= behavior=20I"=20exception:shape-mismatch=0A+=20=20=20=20(let=20((a=20#(1=20= 2))=0A+=20=20=20=20=20=20=20=20=20=20(b=20(make-array=200=203)))=0A+=20=20= =20=20=20=20(array-map!=20b=20values=20a)=0A+=20=20=20=20=20=20(equal?=20= b=20#(1=202=200))))=0A+=0A+=20=20(pass-if=20"matching=20behavior=20II"=0A= +=20=20=20=20(let=20((a=20#(1=202=203))=0A+=20=20=20=20=20=20=20=20=20=20= (b=20(make-array=200=202)))=0A+=20=20=20=20=20=20(array-map!=20b=20= values=20a)=0A+=20=20=20=20=20=20(equal?=20b=20#(1=202))))=0A+=0A+=20=20= ;;=20here=20both=20a=20&=20b=20are=20are=20unrollable=20down=20to=20the=20= first=20axis,=20but=20the=0A+=20=20;;=20size=20mismatch=20limits=20= unrolling=20to=20the=20last=20axis=20only.=0A+=0A+=20=20(pass-if=20= "matching=20behavior=20III"=0A+=20=20=20=20(let=20((a=20#3(((1=202)=20(3=20= 4)=20(5=206))=20((7=208)=20(9=2010)=20(11=2012))))=0A+=20=20=20=20=20=20=20= =20=20=20(b=20(make-array=200=202=202=202)))=0A+=20=20=20=20=20=20= (array-map!=20b=20values=20a)=0A+=20=20=20=20=20=20(array-equal?=20b=20= #3(((1=202)=20(3=204))=20((7=208)=20(9=2010)))))))=0A+=0A+;;;=0A+;;;=20= array-for-each=0A+;;;=0A+=0A+(with-test-prefix=20"array-for-each"=0A+=0A= +=20=20(with-test-prefix=20"1=20source"=0A+=20=20=20=20(pass-if-equal=20= "rank=200"=0A+=20=20=20=20=20=20=20=20'(99)=0A+=20=20=20=20=20=20(let*=20= ((a=20#0(99))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20(l=20'())=0A+=20=20= =20=20=20=20=20=20=20=20=20=20=20(p=20(lambda=20(x)=20(set!=20l=20(cons=20= x=20l)))))=0A+=20=20=20=20=20=20=20=20(array-for-each=20p=20a)=0A+=20=20=20= =20=20=20=20=20l))=0A+=0A+=20=20=20=20(pass-if-equal=20"noncompact=20= array"=0A+=20=20=20=20=20=20=20=20'(3=202=201=200)=0A+=20=20=20=20=20=20= (let*=20((a=20#2((0=201)=20(2=203)))=0A+=20=20=20=20=20=20=20=20=20=20=20= =20=20(l=20'())=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20(p=20(lambda=20= (x)=20(set!=20l=20(cons=20x=20l)))))=0A+=20=20=20=20=20=20=20=20= (array-for-each=20p=20a)=0A+=20=20=20=20=20=20=20=20l))=0A+=0A+=20=20=20=20= (pass-if-equal=20"vector"=0A+=20=20=20=20=20=20=20=20'(3=202=201=200)=0A= +=20=20=20=20=20=20(let*=20((a=20#(0=201=202=203))=0A+=20=20=20=20=20=20=20= =20=20=20=20=20=20(l=20'())=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20(p=20= (lambda=20(x)=20(set!=20l=20(cons=20x=20l)))))=0A+=20=20=20=20=20=20=20=20= (array-for-each=20p=20a)=0A+=20=20=20=20=20=20=20=20l))=0A+=0A+=20=20=20=20= (pass-if-equal=20"shared=20array"=0A+=20=20=20=20=20=20=20=20'(3=202=201=20= 0)=0A+=20=20=20=20=20=20(let*=20((a=20=20#2((0=201)=20(2=203)))=0A+=20=20= =20=20=20=20=20=20=20=20=20=20=20(a'=20(make-shared-array=20a=0A+=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20(lambda=20(x)=0A+=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20(list=20(quotient=20x=204)=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20(modulo=20x=204)))=0A+=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= 4))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20(l=20=20'())=0A+=20=20=20=20= =20=20=20=20=20=20=20=20=20(p=20=20(lambda=20(x)=20(set!=20l=20(cons=20x=20= l)))))=0A+=20=20=20=20=20=20=20=20(array-for-each=20p=20a')=0A+=20=20=20=20= =20=20=20=20l)))=0A+=0A+=20=20(with-test-prefix=20"3=20sources"=0A+=20=20= =20=20(pass-if-equal=20"noncompact=20arrays=201"=0A+=20=20=20=20=20=20=20= =20'((3=201=203)=20(2=200=202))=0A+=20=20=20=20=20=20(let*=20((a=20#2((0=20= 1)=20(2=203)))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20(l=20'())=0A+=20= =20=20=20=20=20=20=20=20=20=20=20=20(rec=20(lambda=20args=20(set!=20l=20= (cons=20args=20l)))))=0A+=20=20=20=20=20=20=20=20(array-for-each=20rec=20= (array-row=20a=201)=20(array-row=20a=200)=20(array-row=20a=201))=0A+=20=20= =20=20=20=20=20=20l))=0A+=0A+=20=20=20=20(pass-if-equal=20"noncompact=20= arrays=202"=0A+=20=20=20=20=20=20=20=20'((3=203=203)=20(2=202=201))=0A+=20= =20=20=20=20=20(let*=20((a=20#2((0=201)=20(2=203)))=0A+=20=20=20=20=20=20= =20=20=20=20=20=20=20(l=20'())=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20= (rec=20(lambda=20args=20(set!=20l=20(cons=20args=20l)))))=0A+=20=20=20=20= =20=20=20=20(array-for-each=20rec=20(array-row=20a=201)=20(array-row=20a=20= 1)=20(array-col=20a=201))=0A+=20=20=20=20=20=20=20=20l))=0A+=0A+=20=20=20= =20(pass-if-equal=20"noncompact=20arrays=203"=0A+=20=20=20=20=20=20=20=20= '((3=203=203)=20(2=201=201))=0A+=20=20=20=20=20=20(let*=20((a=20#2((0=20= 1)=20(2=203)))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20(l=20'())=0A+=20= =20=20=20=20=20=20=20=20=20=20=20=20(rec=20(lambda=20args=20(set!=20l=20= (cons=20args=20l)))))=0A+=20=20=20=20=20=20=20=20(array-for-each=20rec=20= (array-row=20a=201)=20(array-col=20a=201)=20(array-col=20a=201))=0A+=20=20= =20=20=20=20=20=20l))=0A+=0A+=20=20=20=20(pass-if-equal=20"noncompact=20= arrays=204"=0A+=20=20=20=20=20=20=20=20'((3=202=203)=20(1=200=202))=0A+=20= =20=20=20=20=20(let*=20((a=20#2((0=201)=20(2=203)))=0A+=20=20=20=20=20=20= =20=20=20=20=20=20=20(l=20'())=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20= (rec=20(lambda=20args=20(set!=20l=20(cons=20args=20l)))))=0A+=20=20=20=20= =20=20=20=20(array-for-each=20rec=20(array-col=20a=201)=20(array-col=20a=20= 0)=20(array-row=20a=201))=0A+=20=20=20=20=20=20=20=20l)))=0A+=0A+=20=20= (with-test-prefix=20"empty=20arrays"=0A+=0A+=20=20=20=20(pass-if=20= "empty=20other=20than=20last,=20#t"=20;=20fails=20in=202.0.9=20with=20= bad=20a.=0A+=20=20=20=20=20=20(let*=20((a=20(list))=0A+=20=20=20=20=20=20= =20=20=20=20=20=20=20(b=20(make-array=200=202=202))=0A+=20=20=20=20=20=20= =20=20=20=20=20=20=20(c=20(make-shared-array=20b=20(lambda=20(i=20j)=20= (list=20i=20j))=200=202)))=0A+=20=20=20=20=20=20=20=20(array-for-each=20= (lambda=20(c)=20(set!=20a=20(cons=20c=20a)))=20c)=0A+=20=20=20=20=20=20=20= =20(equal?=20a=20'())))=0A+=0A+=20=20=20=20(pass-if=20"empty=20other=20= than=20last,=20f64"=20;=20fails=20in=202.0.9=20with=20out=20of=20range.=0A= +=20=20=20=20=20=20(let*=20((a=20(list))=0A+=20=20=20=20=20=20=20=20=20=20= =20=20=20(b=20(make-typed-array=20'f64=200=202=202))=0A+=20=20=20=20=20=20= =20=20=20=20=20=20=20(c=20(make-shared-array=20b=20(lambda=20(i=20j)=20= (list=20i=20j))=200=202)))=0A+=20=20=20=20=20=20=20=20(array-for-each=20= (lambda=20(c)=20(set!=20a=20(cons=20c=20a)))=20c)=0A+=20=20=20=20=20=20=20= =20(equal?=20a=20'())))=0A+=0A+=20=20=20=20;;=20FIXME=20add=20type=20'b=20= cases.=0A+=0A+=20=20=20=20(pass-if-exception=20"empty=20arrays=20shape=20= check"=20exception:shape-mismatch=0A+=20=20=20=20=20=20(let*=20((a=20= (list))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20(b=20(make-typed-array=20= 'f64=200=200=202))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20(c=20= (make-typed-array=20'f64=200=202=200)))=0A+=20=20=20=20=20=20=20=20= (array-for-each=20(lambda=20(b=20c)=20(set!=20a=20(cons*=20b=20c=20a)))=20= b=20c)))))=0A+=0A+;;;=0A+;;;=20array-for-each-cell=0A+;;;=0A+=0A= +(with-test-prefix=20"array-for-each-cell"=0A+=0A+=20=20(pass-if-equal=20= "1=20argument=20frame=20rank=201"=0A+=20=20=20=20=20=20#2((1=203=209)=20= (2=207=208))=0A+=20=20=20=20=20=20(let*=20((a=20(list->array=202=20'((9=20= 1=203)=20(7=208=202)))))=0A+=20=20=20=20=20=20=20=20(array-for-each-cell=20= 1=20(lambda=20(a)=20(sort!=20a=20<))=20a)=0A+=20=20=20=20=20=20=20=20a))=0A= +=0A+=20=20(pass-if-equal=20"2=20arguments=20frame=20rank=201"=0A+=20=20=20= =20=20=20#f64(8=20-1)=0A+=20=20=20=20=20=20(let*=20((x=20= (list->typed-array=20'f64=202=20'((9=201)=20(7=208))))=0A+=20=20=20=20=20= =20=20=20=20=20=20=20=20(y=20(f64vector=2099=2099)))=0A+=20=20=20=20=20=20= =20=20(array-for-each-cell=201=20(lambda=20(y=20x)=20(array-set!=20y=20= (-=20(array-ref=20x=200)=20(array-ref=20x=201))))=20y=20x)=0A+=20=20=20=20= =20=20=20=20y))=0A+=0A+=20=20(pass-if-equal=20"regression:=20zero-sized=20= frame=20loop=20without=20unrolling"=0A+=20=20=20=20=20=2099=0A+=20=20=20=20= (let*=20((x=2099)=0A+=20=20=20=20=20=20=20=20=20=20=20(o=20(make-array=20= 0.=200=203=202)))=0A+=20=20=20=20=20=20(array-for-each-cell=202=0A+=20=20= =20=20=20=20=20=20(lambda=20(o=20a0=20a1)=0A+=20=20=20=20=20=20=20=20=20=20= (set!=20x=200))=0A+=20=20=20=20=20=20=20=20o=0A+=20=20=20=20=20=20=20=20= (make-shared-array=20(make-array=201.=200=201)=20(const=20'(0=200))=200=20= 3)=0A+=20=20=20=20=20=20=20=20(make-array=202.=200=203))=0A+=20=20=20=20=20= =20x)))=0Adiff=20--git=20a/test-suite/tests/ramap.test=20= b/test-suite/tests/ramap.test=0Adeleted=20file=20mode=20100644=0Aindex=20= bd8a434..0000000=0A---=20a/test-suite/tests/ramap.test=0A+++=20/dev/null=0A= @@=20-1,509=20+0,0=20@@=0A-;;;;=20ramap.test=20---=20test=20array=20= mapping=20functions=20-*-=20scheme=20-*-=0A-;;;;=20=0A-;;;;=20Copyright=20= (C)=202004,=202005,=202006,=202009,=202013=20Free=20Software=20= Foundation,=20Inc.=0A-;;;;=0A-;;;;=20This=20library=20is=20free=20= software;=20you=20can=20redistribute=20it=20and/or=0A-;;;;=20modify=20it=20= under=20the=20terms=20of=20the=20GNU=20Lesser=20General=20Public=0A-;;;;=20= License=20as=20published=20by=20the=20Free=20Software=20Foundation;=20= either=0A-;;;;=20version=203=20of=20the=20License,=20or=20(at=20your=20= option)=20any=20later=20version.=0A-;;;;=20=0A-;;;;=20This=20library=20= is=20distributed=20in=20the=20hope=20that=20it=20will=20be=20useful,=0A= -;;;;=20but=20WITHOUT=20ANY=20WARRANTY;=20without=20even=20the=20implied=20= warranty=20of=0A-;;;;=20MERCHANTABILITY=20or=20FITNESS=20FOR=20A=20= PARTICULAR=20PURPOSE.=20=20See=20the=20GNU=0A-;;;;=20Lesser=20General=20= Public=20License=20for=20more=20details.=0A-;;;;=20=0A-;;;;=20You=20= should=20have=20received=20a=20copy=20of=20the=20GNU=20Lesser=20General=20= Public=0A-;;;;=20License=20along=20with=20this=20library;=20if=20not,=20= write=20to=20the=20Free=20Software=0A-;;;;=20Foundation,=20Inc.,=2051=20= Franklin=20Street,=20Fifth=20Floor,=20Boston,=20MA=2002110-1301=20USA=0A= -=0A-(define-module=20(test-suite=20test-ramap)=0A-=20=20#:use-module=20= (test-suite=20lib))=0A-=0A-(define=20exception:shape-mismatch=0A-=20=20= (cons=20'misc-error=20".*shape=20mismatch.*"))=0A-=0A-(define=20= (array-row=20a=20i)=0A-=20=20(make-shared-array=20a=20(lambda=20(j)=20= (list=20i=20j))=0A-=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20(cadr=20(array-dimensions=20a))))=0A-=0A-(define=20= (array-col=20a=20j)=0A-=20=20(make-shared-array=20a=20(lambda=20(i)=20= (list=20i=20j))=0A-=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20(car=20(array-dimensions=20a))))=0A-=0A-;;;=0A-;;;=20= array-index-map!=0A-;;;=0A-=0A-(with-test-prefix=20"array-index-map!"=0A= -=0A-=20=20(pass-if=20"basic=20test"=0A-=20=20=20=20(let=20((nlst=20= '()))=0A-=20=20=20=20=20=20(array-index-map!=20(make-array=20#f=20'(1=20= 1))=0A-=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20(lambda=20(n)=0A-=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20(set!=20nlst=20(cons=20n=20nlst))))=0A-=20=20=20= =20=20=20(equal?=20nlst=20'(1))))=0A-=0A-=20=20(with-test-prefix=20= "empty=20arrays"=0A-=0A-=20=20=20=20(pass-if=20"all=20axes=20empty"=0A-=20= =20=20=20=20=20(array-index-map!=20(make-typed-array=20'f64=200=200=200)=20= (const=200))=0A-=20=20=20=20=20=20(array-index-map!=20(make-typed-array=20= 'b=20#t=200=200)=20(const=20#t))=0A-=20=20=20=20=20=20(array-index-map!=20= (make-typed-array=20#t=200=200=200)=20(const=200))=0A-=20=20=20=20=20=20= #t)=0A-=0A-=20=20=20=20(pass-if=20"last=20axis=20empty"=0A-=20=20=20=20=20= =20(array-index-map!=20(make-typed-array=20'f64=200=202=200)=20(const=20= 0))=0A-=20=20=20=20=20=20(array-index-map!=20(make-typed-array=20'b=20#t=20= 2=200)=20(const=20#t))=0A-=20=20=20=20=20=20(array-index-map!=20= (make-typed-array=20#t=200=202=200)=20(const=200))=0A-=20=20=20=20=20=20= #t)=0A-=0A-=20=20=20=20;=20the=20'f64=20cases=20fail=20in=202.0.9=20with=20= out-of-range.=0A-=20=20=20=20(pass-if=20"axis=20empty,=20other=20than=20= last"=0A-=20=20=20=20=20=20(array-index-map!=20(make-typed-array=20'f64=20= 0=200=202)=20(const=200))=0A-=20=20=20=20=20=20(array-index-map!=20= (make-typed-array=20'b=20#t=200=202)=20(const=20#t))=0A-=20=20=20=20=20=20= (array-index-map!=20(make-typed-array=20#t=200=200=202)=20(const=200))=0A= -=20=20=20=20=20=20#t))=0A-=0A-=20=20(pass-if=20"rank=202"=0A-=20=20=20=20= (let=20((a=20(make-array=200=202=202))=0A-=20=20=20=20=20=20=20=20=20=20= (b=20(make-array=200=202=202)))=0A-=20=20=20=20=20=20(array-index-map!=20= a=20(lambda=20(i=20j)=20i))=0A-=20=20=20=20=20=20(array-index-map!=20b=20= (lambda=20(i=20j)=20j))=0A-=20=20=20=20=20=20(and=20(array-equal?=20a=20= #2((0=200)=20(1=201)))=0A-=20=20=20=20=20=20=20=20=20=20=20(array-equal?=20= b=20#2((0=201)=20(0=201)))))))=0A-=0A-;;;=0A-;;;=20array-copy!=0A-;;;=0A= -=0A-(with-test-prefix=20"array-copy!"=0A-=0A-=20=20(with-test-prefix=20= "empty=20arrays"=0A-=0A-=20=20=20=20(pass-if=20"empty=20other=20than=20= last,=20#t"=0A-=20=20=20=20=20=20(let*=20((b=20(make-array=200=202=202))=0A= -=20=20=20=20=20=20=20=20=20=20=20=20=20(c=20(make-shared-array=20b=20= (lambda=20(i=20j)=20(list=20i=20j))=200=202)))=0A-=20=20=20=20=20=20=20=20= (array-copy!=20#2:0:2()=20c)=0A-=20=20=20=20=20=20=20=20(array-equal?=20= #2:0:2()=20c)))=0A-=0A-=20=20=20=20(pass-if=20"empty=20other=20than=20= last,=20'f64"=0A-=20=20=20=20=20=20(let*=20((b=20(make-typed-array=20= 'f64=200=202=202))=0A-=20=20=20=20=20=20=20=20=20=20=20=20=20(c=20= (make-shared-array=20b=20(lambda=20(i=20j)=20(list=20i=20j))=200=202)))=0A= -=20=20=20=20=20=20=20=20(array-copy!=20#2:0:2()=20c)=0A-=20=20=20=20=20=20= =20=20(array-equal?=20#2f64:0:2()=20c)))=0A-=0A-=20=20;;=20FIXME=20add=20= empty,=20type=20'b=20cases.=0A-=0A-=20=20=20=20)=0A-=0A-=20=20;;=20note=20= that=20it=20is=20the=20opposite=20of=20array-map!.=20This=20is,=20= unfortunately,=0A-=20=20;;=20documented=20in=20the=20manual.=0A-=0A-=20=20= (pass-if=20"matching=20behavior=20I"=0A-=20=20=20=20(let=20((a=20#(1=20= 2))=0A-=20=20=20=20=20=20=20=20=20=20(b=20(make-array=200=203)))=0A-=20=20= =20=20=20=20(array-copy!=20a=20b)=0A-=20=20=20=20=20=20(equal?=20b=20#(1=20= 2=200))))=0A-=0A-=20=20(pass-if-exception=20"matching=20behavior=20II"=20= exception:shape-mismatch=0A-=20=20=20=20(let=20((a=20#(1=202=203))=0A-=20= =20=20=20=20=20=20=20=20=20(b=20(make-array=200=202)))=0A-=20=20=20=20=20= =20(array-copy!=20a=20b)=0A-=20=20=20=20=20=20(equal?=20b=20#(1=202))))=0A= -=0A-=20=20;;=20here=20both=20a=20&=20b=20are=20are=20unrollable=20down=20= to=20the=20first=20axis,=20but=20the=0A-=20=20;;=20size=20mismatch=20= limits=20unrolling=20to=20the=20last=20axis=20only.=0A-=0A-=20=20= (pass-if=20"matching=20behavior=20III"=0A-=20=20=20=20(let=20((a=20= #3(((1=202)=20(3=204))=20((5=206)=20(7=208))))=0A-=20=20=20=20=20=20=20=20= =20=20(b=20(make-array=200=202=203=202)))=0A-=20=20=20=20=20=20= (array-copy!=20a=20b)=0A-=20=20=20=20=20=20(array-equal?=20b=20#3(((1=20= 2)=20(3=204)=20(0=200))=20((5=206)=20(7=208)=20(0=200))))))=0A-=0A-=20=20= (pass-if=20"rank=200"=0A-=20=20=20=20(let=20((a=20#0(99))=0A-=20=20=20=20= =20=20=20=20=20=20(b=20(make-array=200)))=0A-=20=20=20=20=20=20= (array-copy!=20a=20b)=0A-=20=20=20=20=20=20(equal?=20b=20#0(99))))=0A-=0A= -=20=20(pass-if=20"rank=201"=0A-=20=20=20=20(let*=20((a=20#2((1=202)=20= (3=204)))=0A-=20=20=20=20=20=20=20=20=20=20=20(b=20(make-shared-array=20= a=20(lambda=20(j)=20(list=201=20j))=202))=0A-=20=20=20=20=20=20=20=20=20=20= =20(c=20(make-shared-array=20a=20(lambda=20(i)=20(list=20(-=201=20i)=20= 1))=202))=0A-=20=20=20=20=20=20=20=20=20=20=20(d=20(make-array=200=202))=0A= -=20=20=20=20=20=20=20=20=20=20=20(e=20(make-array=200=202)))=0A-=20=20=20= =20=20=20(array-copy!=20b=20d)=0A-=20=20=20=20=20=20(array-copy!=20c=20= e)=0A-=20=20=20=20=20=20(and=20(equal?=20d=20#(3=204))=0A-=20=20=20=20=20= =20=20=20=20=20=20(equal?=20e=20#(4=202)))))=0A-=0A-=20=20(pass-if=20= "rank=202"=0A-=20=20=20=20(let=20((a=20#2((1=202)=20(3=204)))=0A-=20=20=20= =20=20=20=20=20=20=20(b=20(make-array=200=202=202))=0A-=20=20=20=20=20=20= =20=20=20=20(c=20(make-array=200=202=202))=0A-=20=20=20=20=20=20=20=20=20= =20(d=20(make-array=200=202=202))=0A-=20=20=20=20=20=20=20=20=20=20(e=20= (make-array=200=202=202)))=0A-=20=20=20=20=20=20(array-copy!=20a=20b)=0A= -=20=20=20=20=20=20(array-copy!=20a=20(transpose-array=20c=201=200))=0A-=20= =20=20=20=20=20(array-copy!=20(transpose-array=20a=201=200)=20d)=0A-=20=20= =20=20=20=20(array-copy!=20(transpose-array=20a=201=200)=20= (transpose-array=20e=201=200))=0A-=20=20=20=20=20=20(and=20(equal?=20a=20= #2((1=202)=20(3=204)))=0A-=20=20=20=20=20=20=20=20=20=20=20(equal?=20b=20= #2((1=202)=20(3=204)))=0A-=20=20=20=20=20=20=20=20=20=20=20(equal?=20c=20= #2((1=203)=20(2=204)))=0A-=20=20=20=20=20=20=20=20=20=20=20(equal?=20d=20= #2((1=203)=20(2=204)))=0A-=20=20=20=20=20=20=20=20=20=20=20(equal?=20e=20= #2((1=202)=20(3=204))))))=0A-=0A-=20=20(pass-if=20"rank=202,=20= discontinuous"=0A-=20=20=20=20(let=20((A=20#2((0=201)=20(2=203)=20(4=20= 5)))=0A-=20=20=20=20=20=20=20=20=20=20(B=20#2((10=2011)=20(12=2013)=20= (14=2015)))=0A-=20=20=20=20=20=20=20=20=20=20(C=20#2((20)=20(21)=20= (22)))=0A-=20=20=20=20=20=20=20=20=20=20(X=20(make-array=200=203=205))=0A= -=20=20=20=20=20=20=20=20=20=20(piece=20(lambda=20(X=20w=20s)=0A-=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(make-shared-array=0A-=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20X=20(lambda=20= (i=20j)=20(list=20i=20(+=20j=20s)))=203=20w))))=0A-=20=20=20=20=20=20= (array-copy!=20A=20(piece=20X=202=200))=0A-=20=20=20=20=20=20= (array-copy!=20B=20(piece=20X=202=202))=0A-=20=20=20=20=20=20= (array-copy!=20C=20(piece=20X=201=204))=0A-=20=20=20=20=20=20(and=20= (array-equal?=20X=20#2((0=201=2010=2011=2020)=20(2=203=2012=2013=2021)=20= (4=205=2014=2015=2022))))))=0A-=0A-=20=20(pass-if=20"null=20increments,=20= not=20empty"=0A-=20=20=20=20(let=20((a=20(make-array=200=202=202)))=0A-=20= =20=20=20=20=20(array-copy!=20(make-shared-array=20#0(1)=20(lambda=20x=20= '())=202=202)=20a)=0A-=20=20=20=20=20=20(array-equal?=20#2((1=201)=20(1=20= 1))))))=0A-=0A-;;;=0A-;;;=20array-map!=0A-;;;=0A-=0A-(with-test-prefix=20= "array-map!"=0A-=0A-=20=20(pass-if-exception=20"no=20args"=20= exception:wrong-num-args=0A-=20=20=20=20(array-map!))=0A-=0A-=20=20= (pass-if-exception=20"one=20arg"=20exception:wrong-num-args=0A-=20=20=20=20= (array-map!=20(make-array=20#f=205)))=0A-=0A-=20=20(with-test-prefix=20= "no=20sources"=0A-=0A-=20=20=20=20(pass-if=20"closure=200"=0A-=20=20=20=20= =20=20(array-map!=20(make-array=20#f=205)=20(lambda=20()=20#f))=0A-=20=20= =20=20=20=20#t)=0A-=0A-=20=20=20=20(pass-if-exception=20"closure=201"=20= exception:wrong-num-args=0A-=20=20=20=20=20=20(array-map!=20(make-array=20= #f=205)=20(lambda=20(x)=20#f)))=0A-=0A-=20=20=20=20(pass-if-exception=20= "closure=202"=20exception:wrong-num-args=0A-=20=20=20=20=20=20= (array-map!=20(make-array=20#f=205)=20(lambda=20(x=20y)=20#f)))=0A-=0A-=20= =20=20=20(pass-if-exception=20"subr_1"=20exception:wrong-num-args=0A-=20=20= =20=20=20=20(array-map!=20(make-array=20#f=205)=20length))=0A-=0A-=20=20=20= =20(pass-if-exception=20"subr_2"=20exception:wrong-num-args=0A-=20=20=20=20= =20=20(array-map!=20(make-array=20#f=205)=20logtest))=0A-=0A-=20=20=20=20= (pass-if-exception=20"subr_2o"=20exception:wrong-num-args=0A-=20=20=20=20= =20=20(array-map!=20(make-array=20#f=205)=20number->string))=0A-=0A-=20=20= =20=20(pass-if-exception=20"dsubr"=20exception:wrong-num-args=0A-=20=20=20= =20=20=20(array-map!=20(make-array=20#f=205)=20sqrt))=0A-=0A-=20=20=20=20= (pass-if=20"rpsubr"=0A-=20=20=20=20=20=20(let=20((a=20(make-array=20'foo=20= 5)))=0A-=09(array-map!=20a=20=3D)=0A-=09(equal?=20a=20(make-array=20#t=20= 5))))=0A-=0A-=20=20=20=20(pass-if=20"asubr"=0A-=20=20=20=20=20=20(let=20= ((a=20(make-array=20'foo=205)))=0A-=09(array-map!=20a=20+)=0A-=09(equal?=20= a=20(make-array=200=205))))=0A-=0A-=20=20=20=20;;=20in=20Guile=201.6.4=20= and=20earlier=20this=20resulted=20in=20a=20segv=0A-=20=20=20=20(pass-if=20= "noop"=0A-=20=20=20=20=20=20(array-map!=20(make-array=20#f=205)=20noop)=0A= -=20=20=20=20=20=20#t))=0A-=0A-=20=20(with-test-prefix=20"one=20source"=0A= -=0A-=20=20=20=20(pass-if-exception=20"closure=200"=20= exception:wrong-num-args=0A-=20=20=20=20=20=20(array-map!=20(make-array=20= #f=205)=20(lambda=20()=20#f)=0A-=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20(make-array=20#f=205)))=0A-=0A-=20=20=20=20(pass-if=20= "closure=201"=0A-=20=20=20=20=20=20(let=20((a=20(make-array=20#f=205)))=0A= -=09(array-map!=20a=20(lambda=20(x)=20'foo)=20(make-array=20#f=205))=0A-=09= (equal?=20a=20(make-array=20'foo=205))))=0A-=0A-=20=20=20=20= (pass-if-exception=20"closure=202"=20exception:wrong-num-args=0A-=20=20=20= =20=20=20(array-map!=20(make-array=20#f=205)=20(lambda=20(x=20y)=20#f)=0A= -=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(make-array=20#f=20= 5)))=0A-=0A-=20=20=20=20(pass-if=20"subr_1"=0A-=20=20=20=20=20=20(let=20= ((a=20(make-array=20#f=205)))=0A-=20=20=20=20=20=20=20=20(array-map!=20a=20= length=20(make-array=20'(x=20y=20z)=205))=0A-=20=20=20=20=20=20=20=20= (equal?=20a=20(make-array=203=205))))=0A-=0A-=20=20=20=20= (pass-if-exception=20"subr_2"=20exception:wrong-num-args=0A-=20=20=20=20=20= =20(array-map!=20(make-array=20#f=205)=20logtest=0A-=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20(make-array=20999=205)))=0A-=0A-=20=20=20= =20(pass-if=20"subr_2o"=0A-=20=20=20=20=20=20(let=20((a=20(make-array=20= #f=205)))=0A-=09(array-map!=20a=20number->string=20(make-array=2099=20= 5))=0A-=09(equal?=20a=20(make-array=20"99"=205))))=0A-=0A-=20=20=20=20= (pass-if=20"dsubr"=0A-=20=20=20=20=20=20(let=20((a=20(make-array=20#f=20= 5)))=0A-=09(array-map!=20a=20sqrt=20(make-array=2016.0=205))=0A-=09= (equal?=20a=20(make-array=204.0=205))))=0A-=0A-=20=20=20=20(pass-if=20= "rpsubr"=0A-=20=20=20=20=20=20(let=20((a=20(make-array=20'foo=205)))=0A-=09= (array-map!=20a=20=3D=20(make-array=200=205))=0A-=09(equal?=20a=20= (make-array=20#t=205))))=0A-=0A-=20=20=20=20(pass-if=20"asubr"=0A-=20=20=20= =20=20=20(let=20((a=20(make-array=20'foo=205)))=0A-=09(array-map!=20a=20= -=20(make-array=2099=205))=0A-=09(equal?=20a=20(make-array=20-99=205))))=0A= -=0A-=20=20=20=20;;=20in=20Guile=201.6.5=20and=201.6.6=20this=20was=20an=20= error=0A-=20=20=20=20(pass-if=20"1+"=0A-=20=20=20=20=20=20(let=20((a=20= (make-array=20#f=205)))=0A-=09(array-map!=20a=201+=20(make-array=20123=20= 5))=0A-=09(equal?=20a=20(make-array=20124=205))))=0A-=0A-=20=20=20=20= (pass-if=20"rank=200"=0A-=20=20=20=20=20=20(let=20((a=20#0(99))=0A-=20=20= =20=20=20=20=20=20=20=20=20=20(b=20(make-array=200)))=0A-=20=20=20=20=20=20= =20=20(array-map!=20b=20values=20a)=0A-=20=20=20=20=20=20=20=20(equal?=20= b=20#0(99))))=0A-=0A-=20=20=20=20(pass-if=20"rank=202,=20discontinuous"=0A= -=20=20=20=20=20=20(let=20((A=20#2((0=201)=20(2=203)=20(4=205)))=0A-=20=20= =20=20=20=20=20=20=20=20=20=20(B=20#2((10=2011)=20(12=2013)=20(14=20= 15)))=0A-=20=20=20=20=20=20=20=20=20=20=20=20(C=20#2((20)=20(21)=20= (22)))=0A-=20=20=20=20=20=20=20=20=20=20=20=20(X=20(make-array=200=203=20= 5))=0A-=20=20=20=20=20=20=20=20=20=20=20=20(piece=20(lambda=20(X=20w=20= s)=0A-=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (make-shared-array=0A-=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20X=20(lambda=20(i=20j)=20(list=20i=20(+=20j=20s)))=203=20= w))))=0A-=20=20=20=20=20=20=20=20(array-map!=20(piece=20X=202=200)=20= values=20A)=0A-=20=20=20=20=20=20=20=20(array-map!=20(piece=20X=202=202)=20= values=20B)=0A-=20=20=20=20=20=20=20=20(array-map!=20(piece=20X=201=204)=20= values=20C)=0A-=20=20=20=20=20=20=20=20(and=20(array-equal?=20X=20#2((0=20= 1=2010=2011=2020)=20(2=203=2012=2013=2021)=20(4=205=2014=2015=2022))))))=0A= -=0A-=20=20=20=20(pass-if=20"null=20increments,=20not=20empty"=0A-=20=20=20= =20=20=20(let=20((a=20(make-array=200=202=202)))=0A-=20=20=20=20=20=20=20= =20(array-map!=20a=20values=20(make-shared-array=20#0(1)=20(lambda=20x=20= '())=202=202))=0A-=20=20=20=20=20=20=20=20(array-equal?=20a=20#2((1=201)=20= (1=201))))))=0A-=0A-=20=20(with-test-prefix=20"two=20sources"=0A-=0A-=20=20= =20=20(pass-if-exception=20"closure=200"=20exception:wrong-num-args=0A-=20= =20=20=20=20=20(array-map!=20(make-array=20#f=205)=20(lambda=20()=20#f)=0A= -=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(make-array=20#f=20= 5)=20(make-array=20#f=205)))=0A-=0A-=20=20=20=20(pass-if-exception=20= "closure=201"=20exception:wrong-num-args=0A-=20=20=20=20=20=20= (array-map!=20(make-array=20#f=205)=20(lambda=20(x)=20#f)=0A-=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20(make-array=20#f=205)=20= (make-array=20#f=205)))=0A-=0A-=20=20=20=20(pass-if=20"closure=202"=0A-=20= =20=20=20=20=20(let=20((a=20(make-array=20#f=205)))=0A-=20=20=20=20=20=20= =20=20(array-map!=20a=20(lambda=20(x=20y)=20'foo)=0A-=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20(make-array=20#f=205)=20= (make-array=20#f=205))=0A-=20=20=20=20=20=20=20=20(equal?=20a=20= (make-array=20'foo=205))))=0A-=0A-=20=20=20=20(pass-if-exception=20= "subr_1"=20exception:wrong-num-args=0A-=20=20=20=20=20=20(array-map!=20= (make-array=20#f=205)=20length=0A-=09=09=20=20(make-array=20#f=205)=20= (make-array=20#f=205)))=0A-=0A-=20=20=20=20(pass-if=20"subr_2"=0A-=20=20=20= =20=20=20(let=20((a=20(make-array=20'foo=205)))=0A-=09(array-map!=20a=20= logtest=0A-=09=09=20=20=20=20(make-array=20999=205)=20(make-array=20999=20= 5))=0A-=09(equal?=20a=20(make-array=20#t=205))))=0A-=0A-=20=20=20=20= (pass-if=20"subr_2o"=0A-=20=20=20=20=20=20(let=20((a=20(make-array=20#f=20= 5)))=0A-=09(array-map!=20a=20number->string=0A-=09=09=20=20=20=20= (make-array=2032=205)=20(make-array=2016=205))=0A-=09(equal?=20a=20= (make-array=20"20"=205))))=0A-=0A-=20=20=20=20(pass-if-exception=20= "dsubr"=20exception:wrong-num-args=0A-=20=20=20=20=20=20(let=20((a=20= (make-array=20#f=205)))=0A-=09(array-map!=20a=20sqrt=0A-=09=09=20=20=20=20= (make-array=2016.0=205)=20(make-array=2016.0=205))=0A-=09(equal?=20a=20= (make-array=204.0=205))))=0A-=0A-=20=20=20=20(pass-if=20"rpsubr"=0A-=20=20= =20=20=20=20(let=20((a=20(make-array=20'foo=205)))=0A-=09(array-map!=20a=20= =3D=20(make-array=2099=205)=20(make-array=2077=205))=0A-=09(equal?=20a=20= (make-array=20#f=205))))=0A-=0A-=20=20=20=20(pass-if=20"asubr"=0A-=20=20=20= =20=20=20(let=20((a=20(make-array=20'foo=205)))=0A-=09(array-map!=20a=20= -=20(make-array=2099=205)=20(make-array=2011=205))=0A-=09(equal?=20a=20= (make-array=2088=205))))=0A-=0A-=20=20=20=20(pass-if=20"+"=0A-=20=20=20=20= =20=20(let=20((a=20(make-array=20#f=204)))=0A-=09(array-map!=20a=20+=20= #(1=202=203=204)=20#(5=206=207=208))=0A-=09(equal?=20a=20#(6=208=2010=20= 12))))=0A-=0A-=20=20=20=20(pass-if=20"noncompact=20arrays=201"=0A-=20=20=20= =20=20=20(let=20((a=20#2((0=201)=20(2=203)))=0A-=20=20=20=20=20=20=20=20=20= =20=20=20(c=20(make-array=200=202)))=0A-=20=20=20=20=20=20=20=20(begin=0A= -=20=20=20=20=20=20=20=20=20=20(array-map!=20c=20+=20(array-row=20a=201)=20= (array-row=20a=201))=0A-=20=20=20=20=20=20=20=20=20=20(array-equal?=20c=20= #(4=206)))))=0A-=0A-=20=20=20=20(pass-if=20"noncompact=20arrays=202"=0A-=20= =20=20=20=20=20(let=20((a=20#2((0=201)=20(2=203)))=0A-=20=20=20=20=20=20=20= =20=20=20=20=20(c=20(make-array=200=202)))=0A-=20=20=20=20=20=20=20=20= (begin=0A-=20=20=20=20=20=20=20=20=20=20(array-map!=20c=20+=20(array-col=20= a=201)=20(array-col=20a=201))=0A-=20=20=20=20=20=20=20=20=20=20= (array-equal?=20c=20#(2=206)))))=0A-=0A-=20=20=20=20(pass-if=20= "noncompact=20arrays=203"=0A-=20=20=20=20=20=20(let=20((a=20#2((0=201)=20= (2=203)))=0A-=20=20=20=20=20=20=20=20=20=20=20=20(c=20(make-array=200=20= 2)))=0A-=20=20=20=20=20=20=20=20(begin=0A-=20=20=20=20=20=20=20=20=20=20= (array-map!=20c=20+=20(array-col=20a=201)=20(array-row=20a=201))=0A-=20=20= =20=20=20=20=20=20=20=20(array-equal?=20c=20#(3=206)))))=0A-=0A-=20=20=20= =20(pass-if=20"noncompact=20arrays=204"=0A-=20=20=20=20=20=20(let=20((a=20= #2((0=201)=20(2=203)))=0A-=20=20=20=20=20=20=20=20=20=20=20=20(c=20= (make-array=200=202)))=0A-=20=20=20=20=20=20=20=20(begin=0A-=20=20=20=20=20= =20=20=20=20=20(array-map!=20c=20+=20(array-col=20a=201)=20(array-row=20= a=201))=0A-=20=20=20=20=20=20=20=20=20=20(array-equal?=20c=20#(3=20= 6)))))=0A-=0A-=20=20=20=20(pass-if=20"offset=20arrays=201"=0A-=20=20=20=20= =20=20(let=20((a=20#2@1@-3((0=201)=20(2=203)))=0A-=20=20=20=20=20=20=20=20= =20=20=20=20(c=20(make-array=200=20'(1=202)=20'(-3=20-2))))=0A-=20=20=20=20= =20=20=20=20(begin=0A-=20=20=20=20=20=20=20=20=20=20(array-map!=20c=20+=20= a=20a)=0A-=20=20=20=20=20=20=20=20=20=20(array-equal?=20c=20#2@1@-3((0=20= 2)=20(4=206)))))))=0A-=0A-=20=20;;=20note=20that=20array-copy!=20has=20= the=20opposite=20behavior.=0A-=0A-=20=20(pass-if-exception=20"matching=20= behavior=20I"=20exception:shape-mismatch=0A-=20=20=20=20(let=20((a=20#(1=20= 2))=0A-=20=20=20=20=20=20=20=20=20=20(b=20(make-array=200=203)))=0A-=20=20= =20=20=20=20(array-map!=20b=20values=20a)=0A-=20=20=20=20=20=20(equal?=20= b=20#(1=202=200))))=0A-=0A-=20=20(pass-if=20"matching=20behavior=20II"=0A= -=20=20=20=20(let=20((a=20#(1=202=203))=0A-=20=20=20=20=20=20=20=20=20=20= (b=20(make-array=200=202)))=0A-=20=20=20=20=20=20(array-map!=20b=20= values=20a)=0A-=20=20=20=20=20=20(equal?=20b=20#(1=202))))=0A-=0A-=20=20= ;;=20here=20both=20a=20&=20b=20are=20are=20unrollable=20down=20to=20the=20= first=20axis,=20but=20the=0A-=20=20;;=20size=20mismatch=20limits=20= unrolling=20to=20the=20last=20axis=20only.=0A-=0A-=20=20(pass-if=20= "matching=20behavior=20III"=0A-=20=20=20=20(let=20((a=20#3(((1=202)=20(3=20= 4)=20(5=206))=20((7=208)=20(9=2010)=20(11=2012))))=0A-=20=20=20=20=20=20=20= =20=20=20(b=20(make-array=200=202=202=202)))=0A-=20=20=20=20=20=20= (array-map!=20b=20values=20a)=0A-=20=20=20=20=20=20(array-equal?=20b=20= #3(((1=202)=20(3=204))=20((7=208)=20(9=2010)))))))=0A-=0A-;;;=0A-;;;=20= array-for-each=0A-;;;=0A-=0A-(with-test-prefix=20"array-for-each"=0A-=0A= -=20=20(with-test-prefix=20"1=20source"=0A-=20=20=20=20(pass-if-equal=20= "rank=200"=0A-=20=20=20=20=20=20=20=20'(99)=0A-=20=20=20=20=20=20(let*=20= ((a=20#0(99))=0A-=20=20=20=20=20=20=20=20=20=20=20=20=20(l=20'())=0A-=20=20= =20=20=20=20=20=20=20=20=20=20=20(p=20(lambda=20(x)=20(set!=20l=20(cons=20= x=20l)))))=0A-=20=20=20=20=20=20=20=20(array-for-each=20p=20a)=0A-=20=20=20= =20=20=20=20=20l))=0A-=0A-=20=20=20=20(pass-if-equal=20"noncompact=20= array"=0A-=20=20=20=20=20=20=20=20'(3=202=201=200)=0A-=20=20=20=20=20=20= (let*=20((a=20#2((0=201)=20(2=203)))=0A-=20=20=20=20=20=20=20=20=20=20=20= =20=20(l=20'())=0A-=20=20=20=20=20=20=20=20=20=20=20=20=20(p=20(lambda=20= (x)=20(set!=20l=20(cons=20x=20l)))))=0A-=20=20=20=20=20=20=20=20= (array-for-each=20p=20a)=0A-=20=20=20=20=20=20=20=20l))=0A-=0A-=20=20=20=20= (pass-if-equal=20"vector"=0A-=20=20=20=20=20=20=20=20'(3=202=201=200)=0A= -=20=20=20=20=20=20(let*=20((a=20#(0=201=202=203))=0A-=20=20=20=20=20=20=20= =20=20=20=20=20=20(l=20'())=0A-=20=20=20=20=20=20=20=20=20=20=20=20=20(p=20= (lambda=20(x)=20(set!=20l=20(cons=20x=20l)))))=0A-=20=20=20=20=20=20=20=20= (array-for-each=20p=20a)=0A-=20=20=20=20=20=20=20=20l))=0A-=0A-=20=20=20=20= (pass-if-equal=20"shared=20array"=0A-=20=20=20=20=20=20=20=20'(3=202=201=20= 0)=0A-=20=20=20=20=20=20(let*=20((a=20=20#2((0=201)=20(2=203)))=0A-=20=20= =20=20=20=20=20=20=20=20=20=20=20(a'=20(make-shared-array=20a=0A-=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20(lambda=20(x)=0A-=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20(list=20(quotient=20x=204)=0A-=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20(modulo=20x=204)))=0A-=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= 4))=0A-=20=20=20=20=20=20=20=20=20=20=20=20=20(l=20=20'())=0A-=20=20=20=20= =20=20=20=20=20=20=20=20=20(p=20=20(lambda=20(x)=20(set!=20l=20(cons=20x=20= l)))))=0A-=20=20=20=20=20=20=20=20(array-for-each=20p=20a')=0A-=20=20=20=20= =20=20=20=20l)))=0A-=0A-=20=20(with-test-prefix=20"3=20sources"=0A-=20=20= =20=20(pass-if-equal=20"noncompact=20arrays=201"=0A-=20=20=20=20=20=20=20= =20'((3=201=203)=20(2=200=202))=0A-=20=20=20=20=20=20(let*=20((a=20#2((0=20= 1)=20(2=203)))=0A-=20=20=20=20=20=20=20=20=20=20=20=20=20(l=20'())=0A-=20= =20=20=20=20=20=20=20=20=20=20=20=20(rec=20(lambda=20args=20(set!=20l=20= (cons=20args=20l)))))=0A-=20=20=20=20=20=20=20=20(array-for-each=20rec=20= (array-row=20a=201)=20(array-row=20a=200)=20(array-row=20a=201))=0A-=20=20= =20=20=20=20=20=20l))=0A-=0A-=20=20=20=20(pass-if-equal=20"noncompact=20= arrays=202"=0A-=20=20=20=20=20=20=20=20'((3=203=203)=20(2=202=201))=0A-=20= =20=20=20=20=20(let*=20((a=20#2((0=201)=20(2=203)))=0A-=20=20=20=20=20=20= =20=20=20=20=20=20=20(l=20'())=0A-=20=20=20=20=20=20=20=20=20=20=20=20=20= (rec=20(lambda=20args=20(set!=20l=20(cons=20args=20l)))))=0A-=20=20=20=20= =20=20=20=20(array-for-each=20rec=20(array-row=20a=201)=20(array-row=20a=20= 1)=20(array-col=20a=201))=0A-=20=20=20=20=20=20=20=20l))=0A-=0A-=20=20=20= =20(pass-if-equal=20"noncompact=20arrays=203"=0A-=20=20=20=20=20=20=20=20= '((3=203=203)=20(2=201=201))=0A-=20=20=20=20=20=20(let*=20((a=20#2((0=20= 1)=20(2=203)))=0A-=20=20=20=20=20=20=20=20=20=20=20=20=20(l=20'())=0A-=20= =20=20=20=20=20=20=20=20=20=20=20=20(rec=20(lambda=20args=20(set!=20l=20= (cons=20args=20l)))))=0A-=20=20=20=20=20=20=20=20(array-for-each=20rec=20= (array-row=20a=201)=20(array-col=20a=201)=20(array-col=20a=201))=0A-=20=20= =20=20=20=20=20=20l))=0A-=0A-=20=20=20=20(pass-if-equal=20"noncompact=20= arrays=204"=0A-=20=20=20=20=20=20=20=20'((3=202=203)=20(1=200=202))=0A-=20= =20=20=20=20=20(let*=20((a=20#2((0=201)=20(2=203)))=0A-=20=20=20=20=20=20= =20=20=20=20=20=20=20(l=20'())=0A-=20=20=20=20=20=20=20=20=20=20=20=20=20= (rec=20(lambda=20args=20(set!=20l=20(cons=20args=20l)))))=0A-=20=20=20=20= =20=20=20=20(array-for-each=20rec=20(array-col=20a=201)=20(array-col=20a=20= 0)=20(array-row=20a=201))=0A-=20=20=20=20=20=20=20=20l)))=0A-=0A-=20=20= (with-test-prefix=20"empty=20arrays"=0A-=0A-=20=20=20=20(pass-if=20= "empty=20other=20than=20last,=20#t"=20;=20fails=20in=202.0.9=20with=20= bad=20a.=0A-=20=20=20=20=20=20(let*=20((a=20(list))=0A-=20=20=20=20=20=20= =20=20=20=20=20=20=20(b=20(make-array=200=202=202))=0A-=20=20=20=20=20=20= =20=20=20=20=20=20=20(c=20(make-shared-array=20b=20(lambda=20(i=20j)=20= (list=20i=20j))=200=202)))=0A-=20=20=20=20=20=20=20=20(array-for-each=20= (lambda=20(c)=20(set!=20a=20(cons=20c=20a)))=20c)=0A-=20=20=20=20=20=20=20= =20(equal?=20a=20'())))=0A-=0A-=20=20=20=20(pass-if=20"empty=20other=20= than=20last,=20f64"=20;=20fails=20in=202.0.9=20with=20out=20of=20range.=0A= -=20=20=20=20=20=20(let*=20((a=20(list))=0A-=20=20=20=20=20=20=20=20=20=20= =20=20=20(b=20(make-typed-array=20'f64=200=202=202))=0A-=20=20=20=20=20=20= =20=20=20=20=20=20=20(c=20(make-shared-array=20b=20(lambda=20(i=20j)=20= (list=20i=20j))=200=202)))=0A-=20=20=20=20=20=20=20=20(array-for-each=20= (lambda=20(c)=20(set!=20a=20(cons=20c=20a)))=20c)=0A-=20=20=20=20=20=20=20= =20(equal?=20a=20'())))=0A-=0A-=20=20=20=20;;=20FIXME=20add=20type=20'b=20= cases.=0A-=0A-=20=20=20=20(pass-if-exception=20"empty=20arrays=20shape=20= check"=20exception:shape-mismatch=0A-=20=20=20=20=20=20(let*=20((a=20= (list))=0A-=20=20=20=20=20=20=20=20=20=20=20=20=20(b=20(make-typed-array=20= 'f64=200=200=202))=0A-=20=20=20=20=20=20=20=20=20=20=20=20=20(c=20= (make-typed-array=20'f64=200=202=200)))=0A-=20=20=20=20=20=20=20=20= (array-for-each=20(lambda=20(b=20c)=20(set!=20a=20(cons*=20b=20c=20a)))=20= b=20c)))))=0A--=20=0A2.7.3=0A=0A= --Apple-Mail=_C05A2854-9EDB-476D-AE5C-EF5B1F5E02F5 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset=us-ascii --Apple-Mail=_C05A2854-9EDB-476D-AE5C-EF5B1F5E02F5--