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: Re: propose deprecation of generalized-vector-* Date: Thu, 21 Feb 2013 02:13:59 +0100 Message-ID: <96617E9F-D83C-48EE-B84D-7CD45C4181C2@bluewin.ch> References: <0F432FA1-CFF8-4A22-A477-5291A1B9925D@bluewin.ch> <87ip9mgzp4.fsf@gnu.org> <878v7m5xdh.fsf@pobox.com> <2E5FFE0D-9001-409C-BCD4-9EE3BF9883F0@bluewin.ch> <87mww0nu8l.fsf@pobox.com> <2D31D517-08F8-4D07-84DB-098E335AE0AD@bluewin.ch> <874nh9boqe.fsf@pobox.com> NNTP-Posting-Host: plane.gmane.org Mime-Version: 1.0 (Apple Message framework v1085) Content-Type: multipart/mixed; boundary=Apple-Mail-64-849949982 X-Trace: ger.gmane.org 1361409254 7373 80.91.229.3 (21 Feb 2013 01:14:14 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Thu, 21 Feb 2013 01:14:14 +0000 (UTC) Cc: guile-devel@gnu.org To: Andy Wingo Original-X-From: guile-devel-bounces+guile-devel=m.gmane.org@gnu.org Thu Feb 21 02:14:37 2013 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 1U8Kk6-0004bK-Tz for guile-devel@m.gmane.org; Thu, 21 Feb 2013 02:14:35 +0100 Original-Received: from localhost ([::1]:33918 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1U8Kjm-0005oI-In for guile-devel@m.gmane.org; Wed, 20 Feb 2013 20:14:14 -0500 Original-Received: from eggs.gnu.org ([208.118.235.92]:42762) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1U8Kji-0005o1-7r for guile-devel@gnu.org; Wed, 20 Feb 2013 20:14:12 -0500 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1U8Kjd-0007GX-DM for guile-devel@gnu.org; Wed, 20 Feb 2013 20:14:10 -0500 Original-Received: from zhbdzmsp-smta15.bluewin.ch ([195.186.99.132]:56666) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1U8Kjd-0007FK-37 for guile-devel@gnu.org; Wed, 20 Feb 2013 20:14:05 -0500 Original-Received: from [195.186.227.131] ([195.186.227.131:55401] helo=zhhdzmsp-smta14.bluewin.ch) by zhbdzmsp-smta15.bluewin.ch (envelope-from ) (ecelerity 2.2.3.47 r(39824M)) with ESMTP id 61/60-26473-8D475215; Thu, 21 Feb 2013 01:14:01 +0000 Original-Received: from [10.0.1.10] (62.202.82.184) by zhhdzmsp-smta14.bluewin.ch (8.5.142) (authenticated as dll@bluewin.ch) id 511CD83E008B5F4A; Thu, 21 Feb 2013 01:14:00 +0000 In-Reply-To: <874nh9boqe.fsf@pobox.com> X-Mailer: Apple Mail (2.1085) X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 195.186.99.132 X-BeenThere: guile-devel@gnu.org X-Mailman-Version: 2.1.14 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-bounces+guile-devel=m.gmane.org@gnu.org Xref: news.gmane.org gmane.lisp.guile.devel:15791 Archived-At: --Apple-Mail-64-849949982 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset=windows-1252 On Feb 18, 2013, at 16:55, Andy Wingo wrote: > It could make sense, yes. What do others think? What happens for > array-set!? Care to propose a patch? Patch is attached. It looks a bit unwieldy because I am duplicating = scm_array_handle_pos(), and I also had to fix the recent array_ref_1 = optimization, but it shouldn't be slower for the old use.=20 array-set! does what you would expect, obj must be an array of rank =3D = the number of indices missing. (define A #2((0 1) (2 3))) (array-set! A #(7 8) 0) A =3D> #2((7 8) (2 3)) When all the indices are given, it works exactly as before, so one can = still do stupid things like (define A #2((0 1) (2 3))) (array-set! A #0(9) 0 0) and get A =3D> #2((#0(9) 1) (2 3)) and not A =3D> #2((9 1) (2 3)). The lesson is to avoid rank-0 arrays except in the deep of libraries. arrays.test fails in three places. Twice because I don't fail with the = right exception 'wrong-num-indices', I don't know how to do that. Once = because (array-set! rank-2 one index) doesn't fail on the missing index, = but on the attempted copy. I haven't fixed these tests and I haven't = added more. --- It was interesting to read the other replies, thank you (plural). It was = disappointing that nobody seems to be using arrays, but not very = surprising. I use them a fair amount, but mostly for interfacing with = C/C++. I do little with them in Guile since 1) the facilities are really = not there or they are inconvenient to use, 2) when I need arrays I need = speed and Guile isn't there either (yet!). More than getting this patch accepted (as it is or with different = function names), my concern is that what this patch does cannot be done = on the user side except through make-shared-array, which is too slow. So = I think there's a good argument that scm_i_make_array(), = SCM_I_ARRAY_V(), SCM_I_ARRAY_BASE() and SCM_I_ARRAY_DIMS() should be = published. Now some optional motivation: In other languages that have arrays, rank-0 arrays are not = differentiated from the scalar inside. This is the right approach if you = want to treat arrays of any rank as values. Then you can say that a = rank-n array is ------------------- a rank-n array of rank-0 cells a rank-(n-1) array of rank-1 cells ... a rank-1 array of rank-(n-1) cells a rank-0 array of rank-n cells =3D a rank-n cell. Figure 1. ------------------- The extended versions of array-ref and array-set! allow you to use a = rank-n array as any of these. Old Guile used to have something called =91enclosed arrays=92, they are = described in the 1.6 manual. This is a mechanism inspired by APL that = allows one to split an array as in Figure 1, so that if you have a = function that operates on rank-k arrays, you can array-map! it on arrays = of any rank >=3D k. Example: (define A #((1 2) (3 4) (5 6)) (define (sqr x) (* x x)) (define (norm v) (+ (sqr (array-ref v 0)) (sqr (array-ref v 1)))) (define out #(0 0 0)) (array-map! out norm (enclosed-array A 1)) out =3D> #(5 25 61), hopefully (I don't have Guile 1.6 here to try). In later versions of APL (and most obviously in J) people realized that = this is a bad way to go about things, since the reason you want to split = A in rank-1 cells is =91norm=92. That is, rank-1 is a property of the = function =91norm=92. And you don't need to do any conversions to iterate = over the rank-1 cells of A; you only need to move a pointer on each = iteration, but to do this array-map! should be aware of the rank of the = procedure in each of its arguments. I didn't want to mess with the C implementation of array-map! for what = is only a proof of concept. One can do something passable in Guile by = using the version of array-ref in the patch, since (array-ref A 0) -> #(1 2), apply norm to this (array-ref A 1) -> #(3 4), apply norm to this, etc. I have a module that does this, not much more. I'll see if I can upload = it somewhere, it could use a review. Finally, to fuel the discussion of what kind of array operations Guile = should provide, here is a list similar things that I have read about. I = imagine there are many more. The software is all open source. Scheme (!) http://trac.sacrideo.us/wg/wiki/ArraysCowan This is a proposal for R7RS large, very early-stages. Python http://www.scipy.org/Tentative_NumPy_Tutorial Haskell = http://research.microsoft.com/en-us/um/people/simonpj/papers/ndp/rarrays.p= df http://www.haskell.org/haskellwiki/Numeric_Haskell:_A_Repa_Tutorial Perl http://pdl.perl.org/ J http://www.jsoftware.com/ http://www.jsoftware.com/help/jforc/contents.htm =97 I like this one a = lot. There're also many classic articles on APL on the jsoftware site. C++ http://blitz.sourceforge.net/ This one is dying for somebody to port it to C++11, but it does general = rank (although compile-time only) and has clever features, e.g. = TensorIndex. There's also Matlab/Octave (bad language, I'm not a fan). There's Fortran, for which I don't have a good link, but a lot of the = array-compiler literature is about Fortran. There's SAC = (http://www.sac-home.org/) as an example of a very =91static=92 array = language. There're array languages targeting supercomputers, e.g. ZPL = (http://www.cs.washington.edu/research/zpl/home/).=20 Myself I have used Matlab way too much and numpy some. I have played = with the J interpreter. > Uniform vectors are just bytevectors. The only difference between the > different kinds of uniform vectors is a "type" field indicating the > "natural" type of the object. The type field is set when a bytevector > is created, and is used in the generic array-ref functionality, and in > the printer. >=20 > One consequence is that you can (s8vector-ref #u8(#xff) 0) =3D> -1. c64 <-> f64 is something that I have found useful myself. Regards, Daniel ------------------ --Apple-Mail-64-849949982 Content-Disposition: attachment; filename=0001-Extend-array-ref-array-set-to-work-with-cells-of-ran.patch Content-Type: application/octet-stream; name="0001-Extend-array-ref-array-set-to-work-with-cells-of-ran.patch" Content-Transfer-Encoding: quoted-printable =46rom=20f85aaa7dec597b1d45830a3d346b55f3d3cefbff=20Mon=20Sep=2017=20= 00:00:00=202001=0AFrom:=20Daniel=20Llorens=20=0A= Date:=20Wed,=2020=20Feb=202013=2022:44:06=20+0100=0ASubject:=20[PATCH]=20= Extend=20array-ref,=20array-set!=20to=20work=20with=20cells=20of=20rank=20= >=200=0A=0A*=20libguile/generalized-arrays.c=0A=20=20-=20scm_array_ref:=20= if=20the=20index=20list=20comes=20up=20short,=20return=20the=20cell=20at=20= the=0A=20=20=20=20position=20computed=20up=20to=20then.=0A=20=20-=20= scm_array_set_x:=20if=20the=20index=20list=20comes=20up=20short,=20use=20= the=20cell=20at=20the=0A=20=20=20=20position=20computed=20up=20to=20then=20= as=20destination=20for=20o.=0A=20=20-=20s_scm_i_array_ref:=20branch=20to=20= the=20optimization=20only=20if=20rank=20of=20v=20matches.=0A=20=20-=20= s_scm_i_array_set_x:=20idem.=0A---=0A=20libguile/generalized-arrays.c=20= |=20127=20++++++++++++++++++++++++++++++++++--------=0A=201=20file=20= changed,=20103=20insertions(+),=2024=20deletions(-)=0A=0Adiff=20--git=20= a/libguile/generalized-arrays.c=20b/libguile/generalized-arrays.c=0A= index=209382e81..086019f=20100644=0A---=20= a/libguile/generalized-arrays.c=0A+++=20b/libguile/generalized-arrays.c=0A= @@=20-256,17=20+256,49=20@@=20scm_c_array_ref_2=20(SCM=20array,=20= ssize_t=20idx0,=20ssize_t=20idx1)=0A=20=20=20return=20res;=0A=20}=0A=20=0A= -=0A=20SCM=0A-scm_array_ref=20(SCM=20v,=20SCM=20args)=0A+scm_array_ref=20= (SCM=20a,=20SCM=20args)=0A=20{=0A-=20=20scm_t_array_handle=20handle;=0A-=20= =20SCM=20res;=0A-=0A-=20=20scm_array_get_handle=20(v,=20&handle);=0A-=20=20= res=20=3D=20scm_array_handle_ref=20(&handle,=20scm_array_handle_pos=20= (&handle,=20args));=0A-=20=20scm_array_handle_release=20(&handle);=0A-=20= =20return=20res;=0A+=20=20int=20k,=20arank;=0A+=20=20ssize_t=20pos=20=3D=20= 0;=0A+=20=20SCM=20i=20=3D=20args;=0A+=20=20SCM=20o;=0A+=20=20= scm_t_array_handle=20ah;=0A+=20=20scm_t_array_dim=20*=20as;=0A+=20=20= scm_array_get_handle=20(a,=20&ah);=0A+=20=20as=20=3D=20= scm_array_handle_dims=20(&ah);=0A+=20=20k=20=3D=20arank=20=3D=20= scm_array_handle_rank=20(&ah);=0A+=20=20for=20(;=20k>0=20&&=20= scm_is_pair=20(i);=20--k,=20++as,=20i=3Dscm_cdr=20(i))=20{=0A+=20=20=20=20= ssize_t=20ik=20=3D=20scm_to_ssize_t=20(scm_car=20(i));=0A+=20=20=20=20if=20= (iklbnd=20||=20ik>as->ubnd)=20{=0A+=20=20=20=20=20=20= scm_array_handle_release=20(&ah);=0A+=20=20=20=20=20=20scm_out_of_range=20= (NULL,=20scm_list_2=20(a,=20args));=0A+=20=20=20=20}=0A+=20=20=20=20pos=20= +=3D=20(ik-as->lbnd)*as->inc;=0A+=20=20}=0A+=20=20if=20(k>0)=20{=0A+=20=20= =20=20if=20(k=3D=3Darank)=20{=0A+=20=20=20=20=20=20o=20=3D=20a;=0A+=20=20= =20=20}=20else=20{=0A+=20=20=20=20=20=20scm_t_array_dim=20*=20os;=0A+=20=20= =20=20=20=20o=20=3D=20scm_i_make_array=20(k);=0A+=20=20=20=20=20=20= SCM_I_ARRAY_V=20(o)=20=3D=20SCM_I_ARRAY_V=20(a);=0A+=20=20=20=20=20=20= SCM_I_ARRAY_BASE=20(o)=20=3D=20pos=20+=20SCM_I_ARRAY_BASE=20(a);=20/*=20= since=20arank>1.=20*/=0A+=20=20=20=20=20=20os=20=3D=20SCM_I_ARRAY_DIMS=20= (o);=0A+=20=20=20=20=20=20for=20(;=20k>0;=20--k,=20++as,=20++os)=20{=0A+=20= =20=20=20=20=20=20=20os->ubnd=20=3D=20as->ubnd;=0A+=20=20=20=20=20=20=20=20= os->lbnd=20=3D=20as->lbnd;=0A+=20=20=20=20=20=20=20=20os->inc=20=3D=20= as->inc;=0A+=20=20=20=20=20=20}=0A+=20=20=20=20}=0A+=20=20}=20else=20if=20= (scm_is_null=20(i))=20{=0A+=20=20=20=20o=20=3D=20scm_array_handle_ref=20= (&ah,=20pos);=20/*=20these=20may=20be=20non-arrays.=20*/=0A+=20=20}=20= else=20{=0A+=20=20=20=20scm_array_handle_release=20(&ah);=0A+=20=20=20=20= scm_misc_error=20(NULL,=20"too=20many=20indices",=20scm_list_2=20(a,=20= args));=0A+=20=20}=0A+=20=20scm_array_handle_release=20(&ah);=0A+=20=20= return=20o;=0A=20}=0A=20=0A=20=0A@@=20-295,29=20+327,70=20@@=20= scm_c_array_set_2_x=20(SCM=20array,=20SCM=20obj,=20ssize_t=20idx0,=20= ssize_t=20idx1)=0A=20=0A=20=0A=20SCM=0A-scm_array_set_x=20(SCM=20v,=20= SCM=20obj,=20SCM=20args)=0A+scm_array_set_x=20(SCM=20a,=20SCM=20o,=20SCM=20= args)=0A=20{=0A-=20=20scm_t_array_handle=20handle;=0A-=0A-=20=20= scm_array_get_handle=20(v,=20&handle);=0A-=20=20scm_array_handle_set=20= (&handle,=20scm_array_handle_pos=20(&handle,=20args),=20obj);=0A-=20=20= scm_array_handle_release=20(&handle);=0A+=20=20int=20k,=20arank;=0A+=20=20= ssize_t=20pos=20=3D=200;=0A+=20=20SCM=20i=20=3D=20args;=0A+=20=20= scm_t_array_handle=20ah;=0A+=20=20scm_t_array_dim=20*=20as;=0A+=20=20= scm_array_get_handle=20(a,=20&ah);=0A+=20=20as=20=3D=20= scm_array_handle_dims=20(&ah);=0A+=20=20k=20=3D=20arank=20=3D=20= scm_array_handle_rank=20(&ah);=0A+=20=20for=20(;=20k>0=20&&=20= scm_is_pair=20(i);=20--k,=20++as,=20i=3Dscm_cdr=20(i))=20{=0A+=20=20=20=20= ssize_t=20ik=20=3D=20scm_to_ssize_t=20(scm_car=20(i));=0A+=20=20=20=20if=20= (iklbnd=20||=20ik>as->ubnd)=20{=0A+=20=20=20=20=20=20= scm_array_handle_release=20(&ah);=0A+=20=20=20=20=20=20scm_misc_error=20= (NULL,=20"out=20of=20range",=20scm_list_2=20(a,=20args));=0A+=20=20=20=20= }=0A+=20=20=20=20pos=20+=3D=20(ik-as->lbnd)*as->inc;=0A+=20=20}=0A+=20=20= if=20(k>0)=20{=0A+=20=20=20=20SCM=20ai;=0A+=20=20=20=20if=20(k=3D=3Darank)= =20{=0A+=20=20=20=20=20=20ai=20=3D=20a;=0A+=20=20=20=20}=20else=20{=0A+=20= =20=20=20=20=20scm_t_array_dim=20*=20ais;=0A+=20=20=20=20=20=20ai=20=3D=20= scm_i_make_array=20(k);=0A+=20=20=20=20=20=20SCM_I_ARRAY_V=20(ai)=20=3D=20= SCM_I_ARRAY_V=20(a);=0A+=20=20=20=20=20=20SCM_I_ARRAY_BASE=20(ai)=20=3D=20= pos=20+=20SCM_I_ARRAY_BASE=20(a);=20/*=20since=20arank>1.=20*/=0A+=20=20=20= =20=20=20ais=20=3D=20SCM_I_ARRAY_DIMS=20(ai);=0A+=20=20=20=20=20=20for=20= (;=20k>0;=20--k,=20++as,=20++ais)=20{=0A+=20=20=20=20=20=20=20=20= ais->ubnd=20=3D=20as->ubnd;=0A+=20=20=20=20=20=20=20=20ais->lbnd=20=3D=20= as->lbnd;=0A+=20=20=20=20=20=20=20=20ais->inc=20=3D=20as->inc;=0A+=20=20=20= =20=20=20}=0A+=20=20=20=20}=0A+=20=20=20=20/*=20an=20error=20is=20still=20= possible=20here=20if=20o=20and=20ai=20don't=20match.=20*/=0A+=20=20=20=20= scm_array_copy_x=20(o,=20ai);=0A+=20=20}=20else=20if=20(scm_is_null(i))=20= {=0A+=20=20=20=20scm_array_handle_set=20(&ah,=20pos,=20o);=0A+=20=20}=20= else=20{=0A+=20=20=20=20scm_array_handle_release=20(&ah);=0A+=20=20=20=20= scm_misc_error=20(NULL,=20"too=20many=20indices",=20scm_list_2=20(a,=20= args));=0A+=20=20}=0A=20=20=20return=20SCM_UNSPECIFIED;=0A=20}=0A=20=0A=20= =0A=20SCM_DEFINE=20(scm_i_array_ref,=20"array-ref",=201,=202,=201,=0A=20=20= =20=20=20=20=20=20=20=20=20=20=20(SCM=20v,=20SCM=20idx0,=20SCM=20idx1,=20= SCM=20idxN),=0A-=09=20=20=20=20"Return=20the=20element=20at=20the=20= @code{(idx0,=20idx1,=20idxN...)}\n"=0A-=20=20=20=20=20=20=20=20=20=20=20=20= "position=20in=20array=20@var{v}.")=0A+=09=20=20=20=20"Return=20the=20= rank-(n-k)=20cell=20at=20the=20@code{(idx0=20idx1=20..=20idx(k-1))}\n"=0A= +=20=20=20=20=20=20=20=20=20=20=20=20"position=20in=20n-rank=20array=20= @var{v}.")=0A=20#define=20FUNC_NAME=20s_scm_i_array_ref=0A=20{=0A=20=20=20= if=20(SCM_UNBNDP=20(idx0))=0A=20=20=20=20=20return=20scm_array_ref=20(v,=20= SCM_EOL);=0A=20=20=20else=20if=20(SCM_UNBNDP=20(idx1))=0A-=20=20=20=20= return=20scm_c_array_ref_1=20(v,=20scm_to_ssize_t=20(idx0));=0A+=20=20=20= =20if=20(scm_c_array_rank=20(v)=3D=3D1)=0A+=20=20=20=20=20=20return=20= scm_c_array_ref_1=20(v,=20scm_to_ssize_t=20(idx0));=0A+=20=20=20=20else=0A= +=20=20=20=20=20=20return=20scm_array_ref=20(v,=20scm_cons=20(idx0,=20= SCM_EOL));=0A=20=20=20else=20if=20(scm_is_null=20(idxN))=0A-=20=20=20=20= return=20scm_c_array_ref_2=20(v,=20scm_to_ssize_t=20(idx0),=20= scm_to_ssize_t=20(idx1));=0A+=20=20=20=20if=20(scm_c_array_rank=20= (v)=3D=3D2)=0A+=20=20=20=20=20=20return=20scm_c_array_ref_2=20(v,=20= scm_to_ssize_t=20(idx0),=20scm_to_ssize_t=20(idx1));=0A+=20=20=20=20else=0A= +=20=20=20=20=20=20return=20scm_array_ref=20(v,=20scm_cons=20(idx0,=20= scm_cons=20(idx1,=20SCM_EOL)));=0A=20=20=20else=0A=20=20=20=20=20return=20= scm_array_ref=20(v,=20scm_cons=20(idx0,=20scm_cons=20(idx1,=20idxN)));=0A= =20}=0A@@=20-326,17=20+399,23=20@@=20SCM_DEFINE=20(scm_i_array_ref,=20= "array-ref",=201,=202,=201,=0A=20=0A=20SCM_DEFINE=20(scm_i_array_set_x,=20= "array-set!",=202,=202,=201,=0A=20=20=20=20=20=20=20=20=20=20=20=20=20= (SCM=20v,=20SCM=20obj,=20SCM=20idx0,=20SCM=20idx1,=20SCM=20idxN),=0A-=09=20= =20=20=20"Set=20the=20element=20at=20the=20@code{(idx0,=20idx1,=20= idxN...)}=20position\n"=0A-=09=20=20=20=20"in=20the=20array=20@var{v}=20= to=20@var{obj}.=20=20The=20value=20returned=20by\n"=0A-=20=20=20=20=20=20= =20=20=20=20=20=20"@code{array-set!}=20is=20unspecified.")=0A+=09=20=20=20= =20"Set=20the=20rank-(n-k)=20cell=20at=20the=20@code{(idx0=20idx1=20..=20= idx(k-1))}\n"=0A+=20=20=20=20=20=20=20=20=20=20=20=20"position=20in=20= the=20n-rank=20array=20@var{v}=20to=20the=20k-rank=20array\n"=0A+=20=20=20= =20=20=20=20=20=20=20=20=20"@var{obj}.=20=20The=20value=20returned=20is=20= unspecified.")=0A=20#define=20FUNC_NAME=20s_scm_i_array_set_x=0A=20{=0A=20= =20=20if=20(SCM_UNBNDP=20(idx0))=0A=20=20=20=20=20scm_array_set_x=20(v,=20= obj,=20SCM_EOL);=0A=20=20=20else=20if=20(SCM_UNBNDP=20(idx1))=0A-=20=20=20= =20scm_c_array_set_1_x=20(v,=20obj,=20scm_to_ssize_t=20(idx0));=0A+=20=20= =20=20if=20(scm_c_array_rank=20(v)=3D=3D1)=0A+=20=20=20=20=20=20= scm_c_array_set_1_x=20(v,=20obj,=20scm_to_ssize_t=20(idx0));=0A+=20=20=20= =20else=0A+=20=20=20=20=20=20scm_array_set_x=20(v,=20obj,=20scm_cons=20= (idx0,=20SCM_EOL));=0A=20=20=20else=20if=20(scm_is_null=20(idxN))=0A-=20=20= =20=20scm_c_array_set_2_x=20(v,=20obj,=20scm_to_ssize_t=20(idx0),=20= scm_to_ssize_t=20(idx1));=0A+=20=20=20=20if=20(scm_c_array_rank=20= (v)=3D=3D2)=0A+=20=20=20=20=20=20scm_c_array_set_2_x=20(v,=20obj,=20= scm_to_ssize_t=20(idx0),=20scm_to_ssize_t=20(idx1));=0A+=20=20=20=20else=0A= +=20=20=20=20=20=20scm_array_set_x=20(v,=20obj,=20scm_cons=20(idx0,=20= scm_cons=20(idx1,=20SCM_EOL)));=0A=20=20=20else=0A=20=20=20=20=20= scm_array_set_x=20(v,=20obj,=20scm_cons=20(idx0,=20scm_cons=20(idx1,=20= idxN)));=0A=20=0A--=20=0A1.8.1.1=0A=0A= --Apple-Mail-64-849949982 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset=us-ascii --Apple-Mail-64-849949982--