r3wp [groups: 83 posts: 189283]
  • Home
  • Script library
  • AltME Archive
  • Mailing list
  • Articles Index
  • Site search
 

World: r3wp

[Core] Discuss core issues

Pekr
15-Sep-2010
[18133x2]
sorry if I will propose a nonsense, or if the solution already exists, 
but - when using REBOL for data extraction (using parse) and forming 
a block or CSV as a result, I often come to the need of append-only-if-the-item-does-not-exist-already, 
so using following idiom:

if not found? find target value [append target value]


What about adding /not refinement (or other name), so that I could 
append only unique values?
Also - is there any way of how to easily find out, if the block is 
unique? Should I apply 'unique, and compare the length before and 
after? Pity 'unique has /skip refinement, but does not have /compare 
one (as 'sort has), so that I can't set, when I have e.g. record 
of 5 items, I want to 1) set the record size (/skip) 2) select fields, 
upon which we want to define uniquess - could be an integer offset, 
or a block of positions [1 3] ... 'sort allows at least the offset 
via /compare
Sunanda
15-Sep-2010
[18135]
Two partial workarounds to your first issue Petr (I've used them 
both or various data sets):


1.  simply APPEND each time, then when the set is complete use UNIQUE 
to deduplicate

2.  if not alter target value [append target value]
   this ensures that VALUE is the last entry in TARGET
Henrik
15-Sep-2010
[18136]
2 is more efficient, since UNIQUE always copies.
Pekr
15-Sep-2010
[18137]
but as for efficiency, does the alter really differs from "if not 
found? find?"
Henrik
15-Sep-2010
[18138]
ALTER removes a value, if it's found.
Pekr
15-Sep-2010
[18139]
which is the reverse, but the same, as appending only in the case, 
if not found :-)
Henrik
15-Sep-2010
[18140]
ALTER is not really useful in its current form.
Oldes
15-Sep-2010
[18141x3]
I found not use ALTER as it's not native.. I usually use the solution 
UNIQUE where the block is not much large, but if efficiency is needed, 
I would just go with:

unless find blk val [append blk val]
(I found = I would)
I don't want to add new refinements for such a easy to do solutions 
as they would slow every APPEND a little bit.
Pekr
15-Sep-2010
[18144]
it is just, at least for me, when using append at all - it is very 
often used idiom ...
Graham
15-Sep-2010
[18145]
some people prefer this construct

all [
	find blk val
	append blk val
]
Henrik
15-Sep-2010
[18146]
that would be ANY instead of ALL.
Graham
15-Sep-2010
[18147x2]
oh yeah :)
two characters shorter than Oldes' solution
Pekr
15-Sep-2010
[18149x2]
that's programmer's solution, but it does not read as nicely as - 
if not found? find blk val [append blk val] :-)
yes, Oldes' version reads even nicely ...
Graham
15-Sep-2010
[18151x3]
Who says?
These are just idioms ...
I always have to think twice or more when i come across 'unless :)
Pekr
15-Sep-2010
[18154x2]
And I have to think more than twice, when using combination of NOT 
ALL, NOT ANY :-)
Can I somehow get a difference of two blocks, with different sizes? 
Trying to avoid loops, but I will use loop most probably anyway ...

blk1 structure: [contract user tarif]
blk2 structure: [contract user street town tarif]


I know there are functions like intersect/difference, they even have 
/skip refinement, but those most probably can't treat different record 
sizes?
Oldes
15-Sep-2010
[18156]
Graham, you are not english native speaker? For me it's easy.. I 
learned that UNLESS = IF NOT and so I use it:) http://www.edufind.com/english/grammar/IF9.cfm
Pekr
15-Sep-2010
[18157]
I remember UNLESS from extended basic of ZX Spectrum. And I lowed 
the word itself, dunno why :-)
Oldes
15-Sep-2010
[18158x2]
Are you looking for this?

>> difference [contract user tarif] [contract user street town tarif]
== [street town]
or what result do you expect?
Pekr
15-Sep-2010
[18160x2]
no, sorry ... those are just structures, but blocks contain real 
data, hundreds and thousands of records ...
but never mind, I will use loop and look-up, no problem, just laziness 
:-)
Graham
15-Sep-2010
[18162]
unless is one more character than if not .. so why use it?
Ladislav
15-Sep-2010
[18163]
I guess, that what Pekr wants should be implemented carefully, otherwise 
it may end up being slow...
Oldes
15-Sep-2010
[18164]
Graham.. that's easy... because UNLESS is faster then IF NOT
Maxim
15-Sep-2010
[18165]
I really think, again, that  'append-or-insert-only-if-the-item-does-not-exist-already 
 should be a native in R3.


its a function MOST of us would use on a frequent basis.  it would 
be very usefull and its very powerfull with a /skip refinement
Pekr
15-Sep-2010
[18166]
agreed ...
Ladislav
15-Sep-2010
[18167]
As opposed to that, my opinion is, that it should not be a native, 
since no significant speedup against a mezzanine would be observable
Maxim
15-Sep-2010
[18168x2]
we can start with a mezz... but because of the find and then insert/tail 
and all the possible refinements its needs to handle... overall, 
it will be faster as a native.
this function will often be used in loops, and the less functions 
and REBOL stack usage you have the bigger the speed gains.
Anton
15-Sep-2010
[18170x2]
Yes, I agree that it would be useful built in. (Whether it's native 
or mezz, doesn't really bother me.)
(Graham, "unless" = 6 chars = "if not")
Graham
15-Sep-2010
[18172]
ascii printable characters ... we are talking about saving ink here!
Maxim
15-Sep-2010
[18173]
yes and LCD fatique too
Graham
15-Sep-2010
[18174]
No body wants "unless" burnt into their screens!
Gregg
15-Sep-2010
[18175]
I would like to see a version of REBOL where only the bare minimum 
natives are implemented and everything else is a mezz. It's possible 
that REBOL would run many months faster if not preamturely optimized. 
;-)
Henrik
15-Sep-2010
[18176]
I'd be interested in seeing how small an executable could be made, 
if utterly everything was stripped, even file and network access.
Gregg
15-Sep-2010
[18177]
That might be interesting, but not terribly useful.
Henrik
15-Sep-2010
[18178]
well, then you can say that you can fit your software on a floppy 
and wave a 5.25" floppy in people's faces :-)
Gregg
15-Sep-2010
[18179x2]
We can do that now. Base is ~270K.
It's really hard, now, to find media small enough to make an "it 
fits" claim. :-) I think the smallest memory sticks I have are 64MB.
Henrik
15-Sep-2010
[18181]
I wonder if you can fit a script onto those square barcodes.
Graham
15-Sep-2010
[18182]
sure....