[Scilab-users] a{i, j} specific extraction syntax with {} should not be introduced

Samuel Gougeon sgougeon at free.fr
Thu Feb 18 13:45:12 CET 2016


Hello Cédric,

Thanks for your answer. I am aware of what cells are.
I understand the reported error messages.
The new {} heterogeneous concatenators are ones of the best new features 
that Scilab 6 offers.
But i strongly disagree with the present implementation of {} as 
extractors and inserters,
because they are not user-oriented, look useless, and are unhandy.

Your answer does not provide any example that could not be dealt with () 
instead of {},
i.e. for which no unambiguous implementation with () could exist.

I am answering to some points in the thread of your message, with a user 
point of view:

Le 18/02/2016 11:03, Cedric Delamarre a écrit :
> Hello Samuel,
>
> Cells are specific container which can contain any types of Scilab, but
> each element of a Cell matrix is a Cell. So, the rules for a Cell are
> same than the rules for a matrix of something.
>
> This feature is consistent with matrix extraction because when you
> extract from or insert to a matrix of constant, the result is a matrix
> of constant.
.
Sorry, but this rational looks absolutely not user-oriented.
When a user builds a cell array, he/she is aware that it is a container 
of mixed data,
not a matrix with the same type of objects. The fact that actually all 
objects are wrapped
in a elementary cell to look with the same type is an internal 
consideration.
The matrix becomes a matrix of pointers toward objects. OK. Pointers 
have all the same
type: pointer. OK. And then? If users want to deal with homogeneous 
pointers,
they code in C/C++,  not in Scilab language.
There is no reason to expect extracting from a cell array, one by one, 
objects that all
have the same type = "cell", since it is chosen to be an heterogeneous 
container!
And the user rather wishes to use a syntax to insert or extract parts of 
the array in a way that
is the most simple, direct, intuitive and unambiguous as possible. And 
so the nearest
to the matrix syntax as possible.
This is why addressing cells contents with the same symbols () as used 
for matrix,
and only these ones, should be of high priority.
> For example:
> m = [1 2 3];
> m(1:2) // extracts a matrix of constant
> m(4) = 4 // inserts a constant
> s = ["this" "is a" "string"];
> s(1:2) // extracts a matrix of strings
> s(4) = "true?" // inserts a string
> a={1, %s, "test"};
> a(1:2) // extracts a matrix of cells
> a(4) = {5} // inserts a cell
Exactly the same could be done with a(4) = 5. There is absolutely no 
ambiguity about what the user wish to do there. Is there?

> This insert a cell at the forth position of "a" as you can insert a
> constant in a matrix of constant and not a string.
>
> For example:
> m(5) = "5"// m is an homogeneous container not of type string => Error is OK
> s(5) = 5// s is an homogeneous container not of type decimal => Error is OK
> a(5) = 5// a is an heterogeneous container accepting *any* type of data => 
> This could and should be handled
>
> But, because Cells array can contain any Scilab types, we need a new
> operator to insert another type in a cell.
>
> a{4} = [5 5 5]
> This insert the matrix of constant at the forth position of "a".
a(4) = [5 5 5]  // could handle it exactly in the same way

> a{4} = {5 5 5}
> This insert the Cell array at the forth position of "a".
a(4) = {5 5 5}  // could handle it exactly in the same way.
Since size([4],"*")~=size({5 5 5}, "*"), there is absolutely no 
ambiguity about what must be done.
If there was, a(4) = { {5 5 5} } could be used.

By the way, to use a syntax completely consistent, why {5 5 5} is used 
instead of { {5} {5} {5}} in your example?
As far as i understand, the result of {5 5 5} is a 1x3 array of cells, 
so cells that are horizontally concatenated:
External { ..} concatenate them, and the listed objects should be cells, 
not direct data.
But { 5 5 5 } *automatically* wraps listed data in a cell before 
concatenating them.
This is exactly the type of automatism that should be silently performed 
on every scalar data involved in cells,
as well for extraction and insertion, what we claim for.

> a(4:6) = {5 5 5}
> This insert each cell elements in "a".
OK for that. It is straightforward, and unambiguous.
For this kind of operation, the distributive assignment is performed
*with absolutely no respect with unmatching sizes/formats of the 
recipient and of the source*.
Only the linearized indices of components are used. Example:
c = {%pi %i %t ; %z "abc" list(1,"a")}
--> c(:,1) = { 1 2 }     // an horizontal array feeds a column, and *it 
is fine and OK!*
  c  =
   [1x1 constant]  [1x1 constant]  [1x1 boolean]
   [1x1 constant]  [1x1 string  ]  [    list   ]

*This is why using a list() as linearized/serialized data source could 
and should do exactly the same*:
c([3 1 2]) = list("cde", %s, %e) // should be accepted and performed in 
a /distributive/ way, whereas
c([3 1 2]) = {list("cde", %s, %e)} // isaccepted but performed in a 
/replicative/ way.

> ../..
When the JIMS module was published as a part of Scilab, there were two 
main issues concerning usages and users:
* The first one was about wrapping/unwrapping java objects from/into 
scilab objects.
    These wrapping/unwrapping operations were implemented, but were not 
done automatically.
    Yet, afterwards, they have been set as the default mode in order to be
    done in a transparent way for users. And it is very great, because 
most users
    do not want to deal with internal handlings. They have an object and 
only one,
    and they don't care about the way it is encoded on the Scilab side 
or on the java side.

* The second issue was about indexing numbers, that started at 0 instead 
of 1 as
    with any other type of scilab object. This was modified in order to 
keep an
    homogeneous indexation policy.

With the present implementation of cells, we have exactly the same kind 
of issues.
{} insertion and extraction operators should really be abandoned.
*Or, again, please provide cases for which these**would be demonstrated 
as mandatory*.
And single data should be automatically wrapped or unwrapped from their 
cell
container in a transparent way. When there could be an ambiguity at 
insertion,
the user can always force the wrapping by using some {} around the data 
source.

I haven't found any SEP presenting usages of new {} as extractors, 
inserters, and concatenators.
It would be great to have a pointer about such a document.
Otherwise, i am afraid that we would miss a great opportunity to make 
Scilab really
friendly to deal with mixed data. Improvements could be done with 
existing structures.
And mistakes should be avoided before launching new cells features.

{} extractors/inserters look to have been implemented in memory of the 
former .entries
mlist field. But this way to address contents was directly connected to 
the technical way
cells were encoded, as mlists. Cells are no longer mlists. Please forget 
completely  .entries
and remove a{} addressing.

Best regards
Samuel

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.scilab.org/pipermail/users/attachments/20160218/170ce73d/attachment.htm>


More information about the users mailing list