• Home
  • Script library
  • AltME Archive
  • Mailing list
  • Articles Index
  • Site search
 

World: r4wp

[Rebol School] REBOL School

Arnold
23-Jun-2012
[452]
Would have searched for hours if I hadn't posted this :-D
BrianH
23-Jun-2012
[453x2]
Petr, if you need a quick command line codepage converter program, 
try txtcnv32 here: http://www.ltr-data.se/files/txtcnv32.zip

It lets you specify code pages by number. The documentation of the 
code page numbers is here:

    http://msdn.microsoft.com/en-us/library/windows/desktop/dd317756(v=vs.85).aspx
It's just a 3KB wrapper around the Windows code page conversion functions. 
There's source too.
Gregg
23-Jun-2012
[455]
Arnold, for the dir issue:

>> ?? dirize
dirize: func [
    {Returns a copy of the path turned into a directory.}
    path [file! string! url!]
][

    either #"/" <> pick path length? path [join path #"/"] [copy path]
]

>> ?? undirize
undirize: func [
    {Returns a copy of the path with any trailing "/" removed.}
    path [file! string! url!]
][
    path: copy path
    if #"/" = pick path length? path [clear back tail path]
    path
]
Arnold
23-Jun-2012
[456x2]
In the original script I use a change-dir to get into the right directory. 
Then renaming is just the rename filename newname. I stuffed the 
renaming into a function and changed the variable names. Everywhere 
but in this place where I wanted to rename the file for real and 
I forgot to change old to new.... so here I tried debugging it while 
using the complete path and filename, because I was afraid there 
could be an issue there.
The positive side of things is I am starting to make real errors 
in stead of messing about with the functions in REBOL.
Arnold
26-Jun-2012
[458]
Is there any other way to make an iterated label or text item in 
VID then the way stated in http://www.rebolforces.com/zine/rzine-1-03/#sect5.
or http://www.rebol.com/docs/view-face-other.htmlbecause this seems 
to me to be too complicated for REBOL. At least for me.
Henrik
26-Jun-2012
[459]
it depends on what you want to do. LIST is not very flexible.
Arnold
26-Jun-2012
[460]
Well I found a more promising way here http://www.codeconscious.com/rebol/view-notes.html
What I want to do is have a number of text/labels that I want to 
show a short text from a block of values. So I prefer to do it in 
a loop like loop 8 [mylabel/index/text: myblock/index]
Henrik
26-Jun-2012
[461x2]
If the number of texts doesn't vary, it might be simpler to make 
the fields manually instead of using an iterated face. The reason 
for this is that you need to write the SUPPLY code yourself, which 
will run every time you run the code and will run on every mouse 
move, if your text has a FEEL object with ENGAGE, OVER or DETECT 
functions, whereas simply making 8 texts once with VID is both faster 
and requires less code.
iterated faces are best for large arrays of faces.
Arnold
26-Jun-2012
[463]
I'll stick to the keep it simple strategy then, only 32 labels in 
my little app. I am recreating my Java mirror-game applet using REBOL 
Thank you very much Henrik!
Henrik
26-Jun-2012
[464]
NP. I don't usually mess around with iterated faces unless I really 
need to, so I have some standard styles for lists that abstracts 
this stuff away.
Endo
27-Jun-2012
[465x2]
Anyone has a good idea to count number of values in a block? Ofcourse 
it is not difficult to write, but I want to ee some clever ideas 
:)

>> b: ["a" k 99 k k 99 55 "a" 1]
>> count-values b
== ["a" 2 k 3 99 2 55 1]  ;value-count
* ee = see
Sunanda
27-Jun-2012
[467]
I'm a regular user of Joel's 'tally function:
   http://www.rebol.org/ml-display-message.r?m=rmlKDDS
MaxV
27-Jun-2012
[468]
WOW!
Endo
27-Jun-2012
[469x2]
I wrote another function which returns in the above format, so I 
can SELECT/SKIP 2,  to get the number of occurence of the value, 
and it doesn't use SORT, uses REMOVE-EACH instead.
it:


>> f: func [b /local c r n1 n2] [r: copy [] foreach v unique b [c: 
copy b n1: length? c remove-each w c [v = w] n2: length? c append 
r reduce [v n1 - n2]] r]
>> a: [a b c c a a b b c d d e e e f f h f f g h]
>> f a
== [a 3 b 3 c 3 d 2 e 3 f 4 h 2 g 1]
Oh small mistake, no need to COPY each time: this is much better:

f: func [b /local c r n1 n2] [r: copy [] foreach v unique b: copy 
b [n1: length? b remove-each w b [v = w] n2: length? b append r reduce 
[v n1 - n2] ] r ]
Maxim
27-Jun-2012
[471]
that is a massively interesting mail from Joel Neely.  


He is one of the old-time rebolers I miss most.  He has a very good 
sense of how to explain his points.
Endo
27-Jun-2012
[472]
Interesting, my tally function and Joel's, work almost in same speed, 
53 sec. for 1 million execution for both.
Maxim
27-Jun-2012
[473]
just found a very handy idiom ( not new, just rarely discussed and 
possibly missed by many ):

help function!


this lists all known functions in the global scope (same for     
help native!    help action!)


obviously you can do this for all datatypes, so its very handy to 
get the names of stuff you often forget, like the internal color 
names (help  tuple! )
Ladislav
27-Jun-2012
[474x4]
Interesting, my tally function and Joel's, work almost in same speed, 
53 sec. for 1 million execution for both.
 - I guess that the version using SORT should be much faster.
As far as I remember, it should be available from the ML as well.
Aha, I checked and Joel's code actually *is* using SORT, which means 
it is O(n * log n) algorithm. While, at the same time, the above 
REMOVE-EACH is O(n * n), which is *much* slower as far as I am concerned.
Sorry, I meant that the above REMOVE-EACH based algorithm can be 
roughly O(n * n)
Steeve
27-Jun-2012
[478x2]
(Search for fast-tally in Altme groups)
using the unique trick:
fast-tally: func [b [block!] /local u i] [
	b: sort b
	u: unique b
	i: 1
	until [
		b: any [find b u/2 tail b]
		u/1: as-pair u/1 negate i - i: index? b
		tail? u: next u
	]
	head u
]

And also, the radix algo is pretty good (if the max value is not 
too large)
radix: func [b [block!] /local u maxv] [
	maxv: 0
	foreach v b [maxv: max maxv v]
	u: head insert/dup make block! maxv 0 maxv
	foreach v b [
		u/:v: u/:v + 1
	]
	u
]
in R2, use maximum-of instead of:
>> foreach v b [maxv: max maxv v]
Ladislav
27-Jun-2012
[480x3]
FAST-TALLY does not look like being universal. (I suppose it is designed 
to work only for B's containing integers...)
...and its speed cannot exceed the speed of more universal tallies 
in a significant way
...the RADIX algorithm looks even less universal (needs positive 
integers I guess)
Steeve
27-Jun-2012
[483]
Well, if you want to say that these algos need adaptations to fit 
every ones needs, you're right )
Ladislav
28-Jun-2012
[484x2]
I wanted to tell that they are too specialized while bringing no 
speed advantage compared to Joel's code.
However, Joel's TALLY is not universal either. Joel criticized the 
problem with exceptions of the LESSER? function in his ML posting. 
But there are also exceptions related to the EQUAL? function which 
make his implementation non-universal (for some blocks B their elements 
are incomparable using the EQUAL? function). Such blocks cannot be 
processed using Joel's TALLY.
Arnold
29-Jun-2012
[486]
Found the way to use labels that are indexed: I already had them 
in a panel like this 		
panel-1: panel [across
		    space 0x0

      label "_" label "_" label "_" label "_" ; just use an underscore 
      to see it on screen 
		    label "_" label "_" label "_" label "_"
		]

in a function change them like this f: func [] [     for n 1 8 1 
[

      waarde: to-string pick randwaarden n ; randwaarden is a block of 
      values

      do rejoin ["panel-1/pane/" n "/text: " waarde]]] ; I always use rejoin 
      in these situations.
Henrik
29-Jun-2012
[487]
This is REBOL, so no need to DO strings. It's slower and costs memory:

f: does [
	repeat n length? panel-1/pane [
		label/:n/text: to-string pick randwaarden n 
	]
	show panel-1
]
Arnold
29-Jun-2012
[488]
I am glad there is always a better way to be found! That solution 
is more scalable in the funtion part. Now I'll be off looking for 
an easy way to add extra labels on the fly. Guess that must be possible 
by adding a block [label "_"] to the pane?
Henrik
29-Jun-2012
[489x3]
You can do that, although that requires you to re-layout the pane. 
I don't know the code behind the panel, so that may or may not be 
the best way to do it. It's not the fastest way though. You can manually 
add a face object to the pane block, but you will then have to calculate 
its offset, initialize it by hand and resize the parent panel to 
fit the new face.
But remember that the panel block as described with [across space 
0x0 label "_" ... etc. is only a description. Adding something to 
that block will not affect your current layout. The LAYOUT function 
parses the block into a tree of objects (faces), which then can be 
displayed with VIEW.
So, you either re-build that layout, or you manipulate the face object 
tree directly.
Arnold
29-Jun-2012
[492]
main: layout block
view main

...function or other action for computing what block should become...
main: layout block ;set it again
unview/all
view main
Henrik
29-Jun-2012
[493]
you can make it a bit smoother than that by wrapping the whole thing 
in a panel and assigning a new face tree to that panel every time. 
Then you won't need to close and reopen the window.
Arnold
29-Jun-2012
[494]
Like that?
Henrik
29-Jun-2012
[495x3]
try this interactive test:

view layout [p: panel [button]]

escape to console and type:

p/pane: get in layout/tight [field 100] 'pane

show p
This replaces the pane in the panel P.
Then you will of course need to resize the panel and the window.
Arnold
29-Jun-2012
[498]
Within a panel sure would be smoother. Some larger layouts would 
require resizing as well. 

The example did what was to be expected. And I learned how to return 
to the running REBOL script after escaping in the terminal window!
Henrik
29-Jun-2012
[499x2]
it's a great way to interactively test and workout techniques for 
updating layouts.
when escaping to the console, events are no longer processed in the 
window. to continue getting events in the window, type:

do-events
Arnold
30-Jun-2012
[501]
I changed 1 label the font/color by setting panel1/pane/:n/text/font/color: 
white  and now all text fields including ones not on the panel are 
written in white. :-(