On 2015-12-12 02:39, Kay C Lan wrote:
So the 3 possibilities are:

1) The example I gave in my last post. However many tabs and spaces would
remain the same, they would be ordered, tabs before spaces, segments
(words) would be placed between them. There would only be one white space between each segment (word) so some segments might have tabs between them
and others spaces.You might end up with multiple tab/spaces at the
beginning of the output, just as you end up with multiple empty items at the beginning of a sorted List if there are multiple empty items. This is
ugly.

I think this one perhaps rules itself out by virtue of the fact it does (as you say) seem 'ugly' and also reorders the whitespace in (from any one particular point of view in terms of what you might want to achieve) a fixed, but arbitrary order. It doesn't preserve structure between parts which is perhaps what you would want if you want to do 'something' with the whitespace.

2) The List is outputted with a single space between each segment. This
would mean that if there happened to be tabs or multiple spaces between
certain segments, these would be removed/converted. This is helpful.

This is certainly the simplest option (implementation wise), however it does 'hide' the fact that you are losing information when you do a 'sort words'.

3) A straight reshuffle, where the actual segments are reordered whilst
preserving the white space location:

[tab][tab]Mark[space][space]Geoff[tab]Kevin[space][tab]Richard[space][space]

would become:

[tab][tab]Geoff[space][space]Kevin[tab]Mark[space][tab]Richard[space][space]

This last case, although less helpful to me, would arguable be the computer logical thing to do, all you've done is asked to sort the segments (words); the number of characters remains the same, the location of the white space
has remained the same, the only thing that has changed is the order in
which the words appear - and that's what you asked for. When you think
about it, that's really all that sort by line or item does, it leaves the
CRs and commas in place and just shuffles things about.

This approach occurred to me the other day but I couldn't think of a use-case at the time. However, your example of processing text structured tables and such does suggest that it could well be useful in some circumstances. It also has the advantage of being the natural extension of what line/item delimiter sort (should) do - the case of preserving a trailing delimiter is a direct extension of the idea that sort does the following:

1) Find the ranges of the things you want to sort in the string.

2) Compute the new order of the substrings (from the ranges) based on the requested sort.

3) Rebuild the string replacing the original ranges in the original string with the reordered substrings.

It also means that whether or not a text chunk is 'sortable' (in the sense I described in a previous email) is immaterial as the output string is directly derived from the input string. (There would still be the caveat that you might break the invariants I previously described though for some chunks - such as sentence).

All LC has to do is pick one, implement it and then publish it. If people don't like the choice then they have to roll their own, but they have to
roll their own now anyway. Whilst I'd think most people needing to sort
words would like the 'benefits' of option 2, I hate to say it, but I think
option 3 would be the 'safer' road LC could go down.

It is possible to potentially have your cake and eat it here.

We could have a string sort (as we do now), which does its best to preserve original structure (as described in your option 3) - as you say this would do *precisely* what you asked, but you have to be aware of some edge cases which might bite you in some cases.

In addition we could add explicit chunk splitting and combine operations, and a sort which could act on a numerically keyed array. In this case, option 2 becomes:

  split tValue by word
  sort tValue
  combine tValue using space

Here you would be able to choose explicitly what delimiter you want to use in the output string.

If we made it so that you could do:

  split <expr> by item
  combine <expr> by item

Then 'sort string' for items would actually be:

  split tValue by item
  sort tValue
  combine tValue by item

The subtlety here is that the 'by item' forms would understand trailing delimiter rules (which is essentially that if your string-list's last item is empty, then you must have a trailing delimiter). Note that you can only have 'combine' for strict delimited chunks (which item and line are) for the reasons we have been discussing - there isn't an 'obvious' choice for the delimiter for things like word.

Of course, I've just realized that the proposed invariant rules for sort don't even hold for item and line - since you can now have multi-character item and line delimiters:

  set the itemDelimiter to ",c,"
  get "c,foo,c,bar,c"
  sort items of it
  put it

Here, with the given delimiter, the input string breaks down into:
  [c,foo] [,c,] [bar,c]
Which, when sorted becomes:
  [bar,c] [,c,] [c,foo]
And then recombined gives you:
  bar,c,c,c,foo
Which breaks up as:
  [bar] [,c,] [c] [,c,] [foo]

This breaks the proposed invariant rules. Thus, the invariant argument for determining what 'sort' is essentially useless already - it doesn't generalize to the features we've already added. Therefore, I think structure preservation (option 3) is definitely winning in terms of 'underlying logic'.

Warmest Regards,

Mark.

--
Mark Waddingham ~ m...@livecode.com ~ http://www.livecode.com/
LiveCode: Everyone can create apps

_______________________________________________
use-livecode mailing list
use-livecode@lists.runrev.com
Please visit this url to subscribe, unsubscribe and manage your subscription 
preferences:
http://lists.runrev.com/mailman/listinfo/use-livecode

Reply via email to