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

World: r3wp

[Rebol School] Rebol School

PatrickP61
26-Jul-2007
[583]
So if i read you right, then if I didn't do new-line/all, and tried 
to probe Out-block, it would show the entire contents as one large 
string, whereas new-line/all will allow probe to show each value 
as a spearate line.  Right?
Volker
26-Jul-2007
[584x2]
as lots of strings in one line
and with the new-line all strings in own lines
PatrickP61
26-Jul-2007
[586x4]
I see how it works now  -- Thank you Anton and Volker!!
Thank you Reblek  -- didn't see your answer at first!
My teachers, Anton and Rebolek have submitted two answers.  The difference 
between them is that Anton's answer will insert a tab between varying 
numbers of  values per line, where Rebolek will insert a tab in-between 
col 1 and col2 (assuming only 2 columns in the array).  Is that a 
correct interpretation?
Anton, I understand Rebolek answer, but I want to understand your 
answer too.

 I'm wondering about the line: repeat N -1 + length? Blk [append append 
 Line Blk/:N tab]  

does Rebol do the inner append first  (in math expressions) like 
this:  [append ( append Line Blk/:N ) tab]
and then do this for the number of "lines" in the array
N	Out-block
0	[]
1	"Col A1^-Col B1"
2	"Col A1^-Col B1"	"2^-3"
3	"Col A1^-Col B1"	"2^-3"	{line "3"^-col "b"}


I think I see the above progression, but not sure about Blk [append 
Line last Blk]  Is this advancing the starting position within In-array?
Gregg
27-Jul-2007
[590]
...insert a tab between varying numbers of  values per line <versus> 
... insert a tab in-between col 1 and col2
 -- Correct.


On new-line, it's kind of advanced because it doesn't insert a newline 
(CR/LF), but rather a hidden marker between values that REBOL uses 
when molding blocks.
PatrickP61
27-Jul-2007
[591]
Hi Gregg -- Is that primarily for display purposes, or could it be 
used for other things?
Gregg
27-Jul-2007
[592x2]
On "append append", yes. You could also do it like this: "append 
line join blk/:n tab", the difference being that APPEND modifies 
its series argument, and JOIN does not.


REPEAT is 1-based, not zero, Anton is using "-1 + length? blk" rather 
than "(length? blk) - 1" or "subtract length? blk 1". The first of 
those cases requires the paren because "-" is an op! which will be 
evaluated before the length? func, so REBOL would see it like this 
"length? (blk - 1)", which doesn't work.
For display or formatted output. It's *very* useful when generating 
code for example.
PatrickP61
27-Jul-2007
[594]
Sounds like more advanced stuff than I'm understanding right now. 
 I'll read up on the terms. 

When I get REBOL code solution, I'd like to understand how Rebol 
is processing the code.  What it does logically first, and logically 
second... I think I get confused about when Rebol does the evaluations.
Gregg
27-Jul-2007
[595x3]
You shouldn't have to worry about new-line at all. It's actually 
relatively new, so we all lived without it for a long time.
It can be confusing at times, and even once you know what you're 
doing, you sometimes have to think about it a bit. The up-side is 
that you have a great deal of control once you know how to use it.
I should point out that NEW-LINE, as Anton used it, is a handy shortcut 
that takes the place of foreach+print for simple console display.
PatrickP61
27-Jul-2007
[598]
I am looking forward for the Rebol lightbult to go on full power!!! 
 I think it just takes me playing around with rebol more to get there!
[unknown: 9]
27-Jul-2007
[599]
Yes...that will happen.  The best way is to try to teach what you 
know now to someone else.  To Teach is to learn.
Geomol
27-Jul-2007
[600]
Patrick, before I started with REBOL, I had many years of experience 
with many different languages, both as a hobby and professional. 
It wasn't hard for me to grasp new languages, because every new one 
always reminded me of some other language, I already knew. Then I 
came to REBOL, and I could make small scripts after a few days. But 
it took me more than a year to really "get it". And it's just the 
best language, I've ever programmed in. It keeps amaze me after all 
these years, and I constantly find new things, new ways of doing 
things. From your posts here, you're having a very good start, as 
I see it. Just keep hacking on that keyboard, and don't forget to 
have fun!
btiffin
27-Jul-2007
[601]
Patrick; Check out http://www.rebol.org/cgi-bin/cgiwrap/rebol/art-display-article.r?article=lf019t
 It's an experiment in rebol.org hosting public wiki articles.  Plus 
I'm plugging my own work  :)
Vladimir
3-Oct-2007
[602x4]
Well first of all ....Im new here... :) joined yesterday... and I 
have a problem on my hands.....
Here is a piece of code from graphic editor.... I have problems with 
"insert-event-func"
pixel_face: make face [
    size: pixel_size
    edge: none
	color: black
    data: 0
]

...

pane-func: func [face index] [
    index: (index - 1)
    either integer? index [
        if index < ((grid_size/x) * (grid_size/y)) [
        	xx: (index // (grid_size/x)) + 1
        	yy: to-integer ((index / (grid_size/x)) + 1)
            pixel_face/data: index
            pixel_face/offset/y: ((yy - 1) * (pixel_size/y))
            pixel_face/offset/x: ((xx - 1) * (pixel_size/x))
            pixel_face/color: pick paleta sprite-colors/:yy/:xx
            return pixel_face
        ]
    ][
 ;       return to-integer index/y / 20 + 1
    ]
]

key-event: func [face event] [
    if event/type = 'key [
	            switch event/key [
                        up [cursor_y: cursor_y - 1]
	            		down [cursor_y: cursor_y + 1]
                        left [cursor_x: cursor_x - 1]
                        right [cursor_x: cursor_x + 1]

                       ]
           		sprite-colors/:cursor_y/:cursor_x: 2
	            show grid
            ]
    if event/type = 'time [
		? now/time
    	cursor_color: (3 - cursor_color)
   		sprite-colors/:cursor_y/:cursor_x: :cursor_color
        show grid
	]
    event
]
 
insert-event-func :key-event

grid: make face [
    offset: ((screen_size - window_size) / 2)
    size: window_size
    rate: 00:00:05
    color: blue
    effect: [gradient]
    pane: :pane-func
]

view/new grid
do-events
No matter where I put the rate: 1 element I get 24 events in one 
second..... How can I slow this down?
Oldes
3-Oct-2007
[606]
Which events? If from keyboard, you have to filter them in your key-event 
function.
Vladimir
3-Oct-2007
[607x3]
That is what I do in key-event func....:  if event/type = 'time [
		? now/time
    	cursor_color: (3 - cursor_color)
Problem is that events are always happening the same rate... no matter 
what I do....
I tried to put rate:1 in my grid face.... I tried to put it in pixel_face... 
I tried to put it in pane-func...
Oldes
3-Oct-2007
[610]
Here is simplified your problem:
ke: func[f e][ if e/type = 'time [print now/time/precise] e]
insert-event-func :ke
view layout [box with [rate: 10]]


But I cannot help you. I'm not a view guru. It looks you should not 
use insert-event-func if you don't want to get all time events.
Vladimir
3-Oct-2007
[611x2]
:)
yeah... I guess its a mix between insert-event-func and iterated 
pane..... pane is generated every time and my adding rate element 
to it doesn't effect global rate..... thanks for answer!
Oldes
3-Oct-2007
[613]
Use somethink like:

view layout [
	box with [
		rate: 10
		feel: make feel [
			engage: func [f a e] [
				if a = 'time [print now/time/precise]
			]
		]
	]
]
Vladimir
3-Oct-2007
[614x8]
I'm just typing something like that.... :)
I will check if iterated pane is the source of problem....
pane is not a problem...... your code works (as it should) :)
I know it works, but I remember puting insert-event-func there for 
a reason.... If I remember I couldnt get keyboard response from my 
iterated pane somehow.... I'll try it again ....
Thanks for help!
Done it! All I needed was:  system/view/focal-face: grid
I guess I should read docs more :)
Sorry for spamming this gruoup... but I was wrong.... I mixed to 
source files... Editid one and ran another... so ... it still doesnt 
work.......
Oldes
3-Oct-2007
[622x2]
If you want just blinking cursor, don't use insert-event-func, but 
just something like that:
cursorMover: func[f e][
	if e/type = 'key [
		switch e/key [
            up    [cursor/offset/y: cursor/offset/y - 10]
	        down  [cursor/offset/y: cursor/offset/y + 10]
            left  [cursor/offset/x: cursor/offset/x - 10]
            right [cursor/offset/x: cursor/offset/x + 10]
		]
		show cursor
	]
	e
]
insert-event-func :cursorMover

view layout/size [
	cursor: box 10x10 with [
		rate: 10
		colors: [0.0.0 255.255.255]
		feel: make feel [
			engage: func [f a e] [
				if a = 'time [
					f/color: first head reverse f/colors
					show f
				]
			]
		]
	]
] 400x400
(I mean don't use the insert-event-func for changing color but only 
for geting the key events)
Izkata
3-Oct-2007
[624]
It looks like the event function isn't being triggered for the box, 
but rather for system/view/screen-face or something -

>> ke: func [f e][if e/type = 'time [print f/text]]
>> insert-event-func :ke
>> view layout [box "Testing" with [rate: 1]]
none
none

None of them print "Testing", as a call from the box should
Vladimir
3-Oct-2007
[625x4]
Thanks Oldes! I did it.... I used insert-event-func for key events 
and feel for time events....
But, why? Ohhhh why do I need to do it like that? :)
I red part of docs (6.4 Focus and Keyboard Events)  but it doesnt 
help......... Well so far I'm ok, my editor can move on.... :)
But I would love to know: How to set key press event on something 
so that it would be timed? Or how to make insert-event-func function 
get called in precise timed intervals?
Oldes
4-Oct-2007
[629]
insert-event-func is simply used for global events, you can use it 
to detect 'close, 'resize, 'active and 'inactive as well. Why you 
should have such a event handlers in feels?
Vladimir
4-Oct-2007
[630]
I'm actually interested only in keypress events...

But I have to limit the rate of events... I know there is the rate 
element in every face, and I did make it work for time event and 
that is ok.
But I couldn't make keypress event occur in timed intervals.

I'm not saying I have to have it. Maybe it just isnt supossed to 
be. But it says in docs:


The focal-face must be set to a valid face object (one that is part 
of a pane in the face hierarchy) and the system/view/caret (explained 
in next section) must also be set in order to:
   1. Receive keyboard 
events ....

So I put this inside engage func:

system/view/focal-face: face
system/view/caret: tail ""


And now it works... I dont even use caret but you have to set it 
to some bogus value!


So in my opinion rate element has no influence on key events (if 
I type like crazy I get 19 key events for 1 second...).

But I can make some sort of counter and simply do keypress response 
only when I want to...
Gregg
4-Oct-2007
[631]
The event handling system will call your insert-event-func handler 
as fast as it can, if there are availalbe events, and there will 
always be time events, occurring at whatever rate REBOL uses them. 
I don't know of any way to control when, or how often, your func 
is called.
Vladimir
4-Oct-2007
[632]
Its ok like this... :) I can make what ever I need for my editor 
using this method. I guess things will be more controllable in R3...
Thanks again for help!