From: utzoo!watmath!kdmoen
Newsgroups: net.lang.apl
Title: Re: Indexing
Article-I.D.: watmath.4523
Posted: Fri Feb 11 04:05:53 1983
Received: Fri Feb 11 07:24:34 1983

  Your indexing operations are a bit deceptive:
	I1 .lh I2 .lh A   equals   A[ I1; I2 ]
	       but doesn't equal   I1 .lh (I2 .lh A)

But yes, I agree.  Indexing in APL is inconsistent with the rest
of the language.  In particular, I feel that the action of replacing
part of an array value with something else should not be so closely
coupled to the assignment operation.  So here are some alternatives:

Introducing @, the selection & replacement function.
		@ array		<-> array (ie, the identity operation)
    replacement @ array		<-> replacement
		@[index] array	<-> selects subelements from array
    replacement @[index] array	<-> creates a new array with the
				    subelements selected by index
				    replaced by replacement

Thus,		A[index] <- replacement		in the old notation
becomes		A <- replacement @[index] A

Also,		0 @[3] .io 5	<-> 1 2 0 4 5

Note that indexing is now achieved by applying something similar to
an axis to the @ operator.  In the old APL, indexing could be applied
to any array value, but indexing with replacement could only be applied
to a variable.  This has been generalized, and the assignment statement
has been greatly simplified as a result.

The @ operator without an 'axis' doesn't look too useful, except perhaps
in 'expr2 @ expr1'.  Perhaps it could be used with operators.

Another syntax, achieving roughly the same effect, is:
		array [index]		-- as in normal APL
		array [index] replacement	-- as above

Thus,		A[index] <- replacement
becomes		A <- A [index] replacement

			Doug Moen, ...!watmath!kdmoen