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

AltME groups: search

Help · search scripts · search articles · search mailing list

results summary

worldhits
r4wp1023
r3wp10555
total:11578

results window for this page: [start: 3301 end: 3400]

world-name: r3wp

Group: I'm new ... Ask any question, and a helpful person will try to answer. [web-public]
Henrik:
29-Jun-2006
normand, also remember that rebol can do date checking, so you don't 
have to check that manually as well
Geomol:
12-Jul-2006
If you allow more than one refinement at a time, an approach is to 
build up the code in a block, depending on the refinements (using 
if), and then evaluate the block at the end of the function. Example:


f: func [/a /b /c] [blk: copy [] if a [append blk [print "ref a active"]] 
if b [append blk [print "ref b active"]] if c [append blk [print 
"ref c active"]] do blk]

>> f/c/a
ref a active
ref c active
Pekr:
31-May-2007
well, REBOL 2.0 generation allows mainly PITS (programming in the 
small). Some are building tools, or just some styles for View, then 
release to public. PPL do build applications, but I am not sure those 
are "killer" ones. E.g. AltME - secure from the very beginning, fine 
for your small team, but is that killer app? Hard to tell :-)
RayA:
31-May-2007
I believe in Carl's vision "REBOL is perfect for lightweight distributed 
applications". Users need light-weight responsive gui clients that 
can work both online and offline. The evolution of the Web is moving 
(slowly) in this direction, with AJAX/Flash/JavaFX as examples of 
a more responsive and rich gui clients, BUT it's too complex and 
unreliable. The industry is adding kludge upon kludge to "fix" the 
problems resulting in further complexity and code bloat, but what 
is needed is a clean approach that captures the essence of what made 
the web a phenomal success in the first place - any body could set 
up/develop a web site and they did. Enterprise data centers need 
scalable, reliable, manageable (server) applications that run 24x7 
on commodity hardware ata reasonable price. The user PC's should 
require zero management for the applications, which is the primary 
(only?) attraction of the web ui. Question if the application is 
simple to manage and delivers the functionality the user wants, why 
do they need a fat complex os? As an example my kids get online to 
play games, research homework, etc. and they hate it (so do I) when 
the PC/OS gets in the way. Also, that PC/OS is a major source of 
 trouble with viruses and lack of (simple) control to what my kids 
can access.
DaveC:
31-May-2007
Hi RayA and Welcome. 


I am a new to AltMe too. I think you are right about the evolution 
of the web. The Desktop OS has become an application in itself (IMHO). 
It's the focus of so much angst, controversy and complication. (Nailing 
my personal colours to post here: I declare myself a BSD UNIX type. 
I can still install the latest version in much less than 100MB of 
HD space and 32MB ram and 100Mhz CPU. In fact I run it on an old 
Toshiba laptop with that spec and get real work done)


I think, in principle, DOS was my idea of a good OS (I know, I know...) 
It was small, fast a stable. Yes - lockups were common when pushed, 
but I found it was the application that crashed rather than DOS itself. 
Ok. back in the world of the 21st Century, an OS need many many times 
the resources of DOS just to get itself booted. But basically, all 
I want from the OS is to let the applications get on with the job 
in hand.


What attracts me to Rebol is that it is clean and lightweight. Designed 
by a man who I respect as a Computer Scientist. (And, of course, 
the Rebol community, which collectively one might say is a "killer 
app" too). It's very productive and I'm building internal information 
systems with it.  I've got a few ideas to build my own apps outside 
of work, that is an exciting prospect for the future. 


I keep trying other frameworks/languges and over the last six years 
or so I've lost the "Rebol way" and strayed from the one true path! 
I do find myself coming back to Rebol as I run into more library 
conflict/dependency/blot features of some of the other languages 
I used. Maybe I'm getting impatient of complicated technology now 
I'm older. I just get tired of having to search the internet for 
the latest whatever.so.1 lib, or what have you. I'm making a general 
point here BTW - I know there are some very good language implimentations 
out there.


I don't know what the next killer app will be, but I do think there 
is a place for a machine "Powered by REBOL" which boots in a few 
seconds, lets me communicate, write view images, multimedia, code 
my own Rebol apps from a set of built in services, oh and the battery 
lasts for days - not hours!
It would have to display HTML too (legacy web :-))


So there you go, a bit of a rant from an old geezer technologist 
. Now where's me 8" floppies I need to boot that PDP-11?
Gregg:
31-May-2007
Does REBOL provide architecture documentation/guidelines and/or frameworks 
for the development of scalable, fault tolerant, manageable, with 
hot code swapping for soft real-time 24x7 applications?
 


Petr already covered the basics (Thanks for doing that Petr!), so 
I'll just chime in with opinions. 


I've been using REBOL since 2001. No tool is perfect, and REBOL is 
no exception, but there are only a few things I think it really isn't 
suited for even in its current form. It was not designed for programming 
in the large, but that's a benefit as much as a drawback, until you 
start building larger systems. IME, REBOL does require a different 
mindset if you want to get the most out of it. You can write code 
as you would in many other languages, but you won't see the big benefits 
REBOL offers if you do. It's still a good tool, even used that way.


The docs and tools you asked about don't exist in official form, 
but there are a lot of "pieces" in the community. I'm working on 
something now that has those same goals.
Henrik:
31-May-2007
I find myself changing the mindset with REBOL every few years, because 
for a long time I was afraid of for example, using PARSE. PARSE is 
so central and important that it can change the way you work with 
REBOL, if you have stayed away from it. I had the same experience 
when starting to use the SDK and when starting to do networking stuff 
in REBOL to let scripts communicate with eachother.


It's not just a new set of ideas that turn up that lets me add to 
existing scripts, but doing the same scripts in entirely different 
ways. I feel I know about 30-40% of REBOL. :-) It's so damn deep.
RayA:
31-May-2007
Thanks everyone for your prompt and honest comments.


Why did I join this community? The primary reason is to be part of 
a small, smart and passionate group who think differently, which 
when combined with REBOL is a very powerful combination. Therefore 
it would seem that focusing the resources of the community on a "killer" 
application leveraging REBOL3 would increase the chance of REBOL 
becoming main stream, and as a side effect possibly allow part time 
REBOL developers to become full time REBOL developers. As an example, 
think what Ruby on Rails did for Ruby. Wouldn't it be nice to get 
paid to do what you love!


IMO/E I believe it's very important for the application vendors to 
have very close and strong ties with the platform vendor so architectures 
and features can be designed and exist at the correct layer. Also, 
if something needs to be implemented in the application but really 
belongs in the platform, it can be done in a way that enables that 
feature to be migrated in the future with minimal impact and extra 
work. This seems to fit with REBOL's history of improving based on 
experience.


I'd like to think it's possible to build great applications in 3 
months, with new releases every three months as required based on 
requirements, so I don't have the time (and maybe not even the ability) 
to spend years learning REBOL. I'd also argue that for a company 
to be successful, it needs a small team to have a number of diverse 
skills which is focused on delivering the product. I mentioned when 
I first signed on that I would be interested to meet REBOL gurus 
who are in Northern California and see what happens when interesting 
(or not) people get together. Sorry for the length of this post and 
thanks for listening.
Henrik:
31-May-2007
About dialects: You may not know what it is, so I'll give a brief 
real example of what I did, when adding a dialect to my database 
system. It does 3 different database operations, the details don't 
matter, but here goes:

lock-state: db/release locker-id current-object
set [lock-state current-object] db/add-object locker-id
if all ['locked-by-me = lock-state object? current-object] [
  current-object: db/advance locker-id current-object
]


This is RPC based, which means I call specific functions in the database 
over the network, pass parameters, get stuff back in return and maintain 
database environment variables. This is how you do it traditionally.

Now with a dialect, you can say something like this:

do-database [release add advance]


As you can see, it's an incredible code reduction. Same 3 operations. 
A part of it is of course that database environment variables are 
maintained internally and are not really a part of the dialect, which 
further reduces code. But I consider it a side effect of dialecting 
and makes it easier to design a uniform way of talking to the database.

Now which method would you expose to a third party developer? :-)
Henrik:
31-May-2007
Pekr, the functions would have specific and different input parameters. 
That's not required here. For example above, the 'add word, adds 
an object to the database. The 'advance word advances the same object 
to the next stage (hard to explain), but I don't have to pass the 
object again, since the dialect parser is not finished with parsing 
and keeps the variables in the air automatically.


Besides, do-database is only 1 network operation. The traditional 
one requires 3.
Geomol:
3-Jun-2007
I think, it is a plus to know functional programming. And if the 
programmer is used to do more than one thing in each line/statement, 
that will help also, when learning REBOL. Things like:

insert back tail serie somefunc + 1


is often seen in REBOL. Experience with scripting languages is probably 
also a plus. I too had a background on the Amiga, staring in 1987 
with an A500. In the 90'ies I started to explore the operating system 
more closely, and then it was natural to check out, what Carl was 
up to. Prior to REBOL, I've programmed in many languages incl. C, 
C++, 6502 ASM, PASCAL, COBOL, LOGO and sh and csh scripting. I develop 
many different things with REBOL from graphical applications, games 
and astronomical applications to tools, languages, databases, xml-stuff, 
word processor, etc. It's very few things, I would choose another 
language than REBOL to do.
BrianH:
3-Jun-2007
I first got into REBOL on a complete whim - back then I used to learn 
and make new programming languages for fun.


If you want to understand PARSE, it helps to have some background 
in parser generators, particularly recursive decent ones like Coco 
or Antlr. You can do more with PARSE, but the basic way you structure 
parse rules follows the LL model. Knowing regular expressions will 
not help.
Oldes:
3-Jun-2007
using...

def go_crazy
    capture_image until @camera.memory_card_full?
end


...seems to be useless if you need to do more than just call one 
function.... but I don't know Ruby at all, so maybe I'm wrong
Geomol:
4-Jun-2007
I think, performance should win over expressiveness. I'm think, we 
don't have
action unless condition

in REBOL, because it'll cost in performance to check, if there is 
an 'unless' after the action. As it is now, the REBOL intepreter 
knows what to do most of the time. Operators are the exception of 
the rule.
Gregg:
4-Jun-2007
Since REBOL requires a programmer to 

think differently", in general what type of person, skill set, and/or 
background is required for a person to be a good REBOL programmer?" 


You just have to be open minded, and I think it helps to be curious. 
You also need to understand that REBOL is high level, but not safe 
in the sense of being dumbed-down so you can't do dangerous things. 
You can do *very* dangerous things in REBOL. You don't have direct 
mem access, so the risk is mainly to your own app, but since it's 
almost infinitely flexible, you can create works of art, or hideous 
beasts.


 "what attracted everyone on this newsgroup to REBOL? And, in general, 
 what type of applications are people trying to build?"


The small size, built-in GUI, and tiney-but-powerful demos are what 
attracted me initially. To be able to download the EXE, install it, 
and run 5 or 6 GUI demos in a couple miuntes just blew people away 
in 2001 when I showed it to them. What keeps me here is that there's 
nothing else that's as much fun to work in (for me). It can be frustrating 
too, I won't lie about that, but the benefits so far outwiegh the 
negatives for me, that I hate having to use other languages now. 
I also love the community. I would count some of the people here 
as close friends now, and it's very satisfying to collaborate with 
them, even just on fun little projects.


What *really* excites me, though, is that I think we're still only 
tapping about 5% of REBOL's potential, maybe less. If you write code 
in REBOL like other languages, there are benefits but they aren't 
earth-shattering. When we get to the point that 10% of REBOLers write 
dialects, and 90% of REBOLers use them, and use REBOL as an interchange 
format, then we'll really be taking advantage of REBOL.
BrianH:
4-Jun-2007
Geomol, I wouldn't know about R3 but in R2 ops are a little faster 
than their prefix equivalents. The reason is that DO already knows 
which words are ops, while it has to look up other words to figure 
out what they are. This lookup takes more time than just grabbing 
the right action out of the op table. It does have to retrieve the 
index into the op table from the value assigned to the op, but it's 
still faster than general action lookup. Try assigning a non-op value 
to an op word - it will error on evaluation.
BrianH:
4-Jun-2007
Why did I join the community? Because when I joined, REBOL was still 
pretty new.


R2 wasn't there yet - the first alphas for it came a few months after 
I started playing with the language. Most of the low-level behavior 
of the language was completely undocumented outside of RT, and they 
were still trying to position the language as easy to use, easy to 
learn, high level. It still looked like R1 - Scheme with a different 
syntax - but it was different.


A challenge. So I dug in. I tested every function, everything I could 
find out. I asked a lot of questions on the mailing list. If they 
weren't answered, I dug in further and figured it out myself. And 
I got into a lot of really interesting arguments with the people 
on the list, testing and probing the language until all of the undocumented 
stuff became clear.


Those early arguments became the low-level documentation of REBOL. 
And then came the books, and the community got bigger. I started 
using REBOL at work, even when it wasn't the language I was supposed 
to be using - code is easier to generate with REBOL than it is to 
write directly in other languages. More fun too. That's the hook: 
REBOL is fun.


There is a principle I read in a Heinlein essay years ago: The principle 
of Creative Laziness. He wrote about the guy who invented the automatic 
pilot, back in World War 2, because piloting back then was a big 
hassle and he was too lazy to do it. Instead of doing the drudge 
work he did the more interesting task of figuring out how to automate 
it. If necessity is the mother of invention, then laziness is its 
father. Laziness is a virtue.


That's what dialecting is all about: Automating the drudge work and 
wrapping it in a nice little language because it's more fun than 
doing it manually. More efficient too, a lot of the time.


Do you know who REBOL appeals to the most? Engineers, scientists, 
hackers, analysts, problem solvers. People with opinions, people 
with enough of a twisted sense of humor, of the world, that they 
don't want to just sit still and accept the way that they are told 
the world is - they want to figure it out and remake it if necessary. 
Interesting people: REBOL's other hook.

Welcome to the cool kids' table!
Will:
8-Jun-2007
HELLO, do you have a simple solution, I'd like 'z to stay 10, eg 
it should be a local in the function
z: 10

a: func ['word body][

  foreach row [1 2 3][
    set word row

    reduce body
  ]

]

a z [print z]

print z
Gregg:
8-Jun-2007
Look at the source for FOR. If that technique works for you, it will 
lead you to something like this:

z: 10
a: func ['word body /local do-body] [
  do-body: func reduce [[throw] word] body
  foreach row [1 2 3] [do-body row]
]
a z [print z]
print z
PatrickP61:
17-Jul-2007
What is the best way to get an formatted timestamp that matches IBM 
DB2 in this form: ccyy-mm-dd-hh:mm:ss.nnnnnn

I tried this, but I'm stuck on how to extract out the nanoseconds 
from Now/precise:


Timestamp: rejoin [ now/year "-" now/month "-" now/day "-" now/time 
".000000" ]


Also, if the month or day is less than 2 digits, I need a leading 
zero -- how can I do this easily?
Gregg:
17-Jul-2007
I have a format func that isn't on REBOL.org (yeah, I know...; it 
requires another func, etc.) if you have to do a lot of formats and 
don't want to roll them all. Anyway, let me know if you want me to 
send it Patrick.
PatrickP61:
17-Jul-2007
OK -- I'm perplexed as to when does things get evaluated.

If I have a variable like Now-TS: to get the formatted time, it will 
be resolved immediately and return the time.

If later, after I wait 1 second, I want to print the new formatted 
timestamp, it returns the exact same value as before, when I know 
the time has acutally changed.  How do I get the time now to be resolved 
again?  Example code:

print now/precise		gives 17-Jul-2007/14:35:21.308-5:00 
 wait 1

 print now/precise		gives 17-Jul-2007/14:35:22.324-5:00	now/precise 
 is evaluated immediately

 Now-timestamp: 
	rejoin [
		Now/year "-" Now/month "-" Now/day "-" 
		first Now/time "." second Now/time "." third Now/time "000" ] 

 print Now-timestamp			gives	2007-7-17-14.35.22.0000	
 wait 1 

 print Now-timestamp			gives	2007-7-17-14.35.22.0000		the exact same 
 time -- not evaluated immediately


Is it this way because Now-timestamp has been assigned and already 
evaluated  -- if so, how do I have it reevaluate it again?
BrianH:
17-Jul-2007
DOES is a shortcut for creating a function, DO evaluates its value 
directly. A variable is not evaluated when assigned - the value is, 
and then it is assigned to the variable. You don't really "define" 
variables in REBOL, but the distinction may be more complicated than 
you need to worry about for now.
PatrickP61:
17-Jul-2007
Thanks Brian.  I will play around with it a little more.  Just to 
re-iterate my understanding of rebol assignments


A variable is not evaluated when assigned - the value is, and then 
it is assigned to the variable. You don't really 
define" variables in REBOL"

So at the time of assignment, the text following the : is assigned 
to the variable but is not evaluated.  That is to say the variable 
is like a pointer to the text string that was typed in.

Does that mean that Rebol will not do evaluations until it needs 
to.  For example:
In-file:	%file_path_name.txt
In-text:	Read In-file

write %out-file-path-name.txt In-text		<-- this is where the evaluation 
occurs to resolve all the above?  Is that right?
BrianH:
17-Jul-2007
REBOL variables don't really need to be declared, as such, but you 
do need to declare function parameters and object fields. Some of 
the REBOL language look like they are declaring variables, but they 
really are doing something different.
PatrickP61:
18-Jul-2007
Thanks for your patience with me.  I'm wrong about the evaluation. 
 It is done at the time of the assignment returing whatever value 
to the variable.  The reason Now-timestamp had identical values, 
even after waiting 1 second was that it was evaluated once, with 
a value put into it, then the wait happened, then I simply re-printed 
the same value as before, because I did not re-do the variable.  
I think I was making it harder than it really is.

I don't understand this statment:

Later on you can either do a full evaluation of the word by stating 
it directly ( a ) or you can just retrieve its value by using a get-word 
( :a )


Are you saying that I can simply type Now-timestamp to have it re-evaluated 
at that time?
Gregg:
18-Jul-2007
If you read the Core manual on REBOL.com, it has a pretty good explanation 
of the four word types (normal, lit, set, and get). The other thing 
to understand is when blocks, and nested blocks, are reduced (evaluated). 
That can be tricky to figure out sometimes, because funcs like PRINT 
do it automatically.


If you can get a handle on when things are evaluated--and don't stress 
when you have to add a REDUCE or COMPOSE but aren't sure why--and 
if you can grok the four word types, you 'll be in great shape.
PatrickP61:
19-Jul-2007
Hi all -- I didn't mean to cause additional entries to other libraries 
-- just tried to format it in my own routine.  But since there is 
interest, I double checked the official IBM SQL reference manual 
for timestamps.

So for the record and for your information:


Although there are many many different forms (Japanese, Europe etc), 
I only focused on two elements, the ANSI  ISO timestamp, and IBM 
SQL timestamp standard.  So in the IBM book "DB2 UDB for iSeries 
SQL Reference V5R370" under "Data Types, Datetime values, table 10 
page 70":

_________________________________________________________________________________________________

Table 10. Formats for String Representations of Timestamps
Format Name			Time Format						Example

ANSI/ISO SQL standard	TIMESTAMP ’yyyy-mm-dd hh:mm:ss.nnnnnn’	TIMESTAMP 
’1990-03-02 08:30:00.010000’

IBM SQL			’yyyy-mm-dd-hh.mm.ss.nnnnnn’			’1990-03-02-08.30.00.010000’
14–character form		’yyyymmddhhmmss’					’19900302083000’

_________________________________________________________________________________________________


For the record, I think I confused the two types.  Notice the embedded 
space between the date and time as well as : separators for ANSI/ISO, 
while the IBM SQL standard contains it all (no embedded space) and 
uses periods to separate the time elements, which I will easily fix 
in my version. -- You may wish to do the same for any new form of 
date you have.
PatrickP61:
19-Jul-2007
Thanks btiffin -- Yes I agree that having a library of common routines 
is the way to go.  I'm new and just learning how to play with Rebol 
with the approach of -- If I do it this way, what will rebol do, 
rather than, use the library to find common routines, and use it, 
which of course I would do to solve a specific problem.  Rebol.org 
is a great resource!
PatrickP61:
19-Jul-2007
Hi all,  As you may have guessed from my above posts, I'm trying 
to write a script that will convert a formatted report into a table 
or CSV.  I'm new and just playing around to understand the process. 
 


In any event, I did search rebol.org on CSV and found the CSV.r script 
which seems to a part of what I would like to do.


But here is my concern.  The Mold-CSV function does not handle all 
the different kinds of strings that can occur.  I'm talking about 
embedded " or {.  I would like a function that can handle all strings 
properly into CSV.

Take this example:
 In-block:	[
	[	"C A1"	"C B1"	] 
	[	2		3		] 
	[	"2"		"3"		] 
	[	"4a"    	"4b"	]
	[	"5a x" 	"5b y"	]
	[	""7a,""	""7b,""	]
	[	""a8"""	""b8"""	]	
	]


Mold-CSV In-block doesn't handle 7a or a8 lines properly since the 
"" terminates a string.  You could replace the first and last " with 
a brace {} but that does some funny things too.
PatrickP61:
19-Jul-2007
Anton,  What do you think of this approach -- I'm just thinking it 
through and am not sure if I have covered all the bases.

Since my input can contain any number of symbols, commas, single 
and double quotes, and rarely, but possibly braces, what if I attack 
the problem a different way.  Whenever an embedded comma, or double 
quote or something like that occurs within an spreadsheet cell, it 
will require some kind of "extra" formatting like two quotes or the 
like.  It may even be that there are unique combinations of such 
symbols, rare as that would be, to have complex formatting of an 
input block for rebol to convert it properly for CSV.


What if I shift gears and look at a TAB delimited file instead.  
I know that I will never have TAB embedded in my cells, and that 
I deal with the entire block as a series instead.  I could embed 
TAB wherever needed to separate the columns and leave the remaining 
string the way it is.  Would that work, or would I still need to 
do some formatting to handle it.  I think I'll open an excel spreadsheet, 
and work in reverse to see what it needs for TAB delimited file. 
 Any comments?
RobertS:
1-Aug-2007
Put another way, what is the rule for when a word must explicitly 
bear the sigil prefix of  :  ? I.e., when is a get-word! required 
and when does any word suffice?  ::word is an error but   to file! 
:myString  in a func is no different from  to file! myString   and 
how do you pur carriage-returns into this message-post box!  ;-)
Gabriele:
3-Aug-2007
hmm, not sure i understand here. what do you want to add to docbase?
btiffin:
3-Aug-2007
I was just kidding...I'm about half way through using your pdf-maker 
(v2) to document the R2 datatypes regarding  to string! form mold. 
 Blog http://www.rebol.net/r3blogs/0092.htmlbut like I everything 
I do now-a-days, it comes pre-expired  :)
Gabriele:
4-Aug-2007
what you say instead is that some values do not have a mold representation, 
so that they mold to something that once evaluated, returns the value 
(eg make object! ... and so on).
Geomol:
5-Aug-2007
From the previous discussion I got the impression, that everything 
is words, when they're typed in, or viewed as output. My reasoning 
goes as: if NONE is a word when inside a block (initally without 
specifying, what we do with that block), then everything inside a 
block must be words (initially). Then the input parser take that 
block and figure out, what's inside. Some of the stuff inside ende 
up as other datatypes (in this case integer!), others are left as 
words. Or?

What I find a bit peculiar is, that things like [integer! none +] 
are left as words and not being parsed to the expected datatypes.
Gabriele:
5-Aug-2007
looking up the values of words is something that is not what LOAD 
is supposed to do. you could load a dialect block or just some data. 
words can be used just as symbols, not to reference values.
RobertS:
5-Aug-2007
>>system/console/prompt: [ reform [ now/time ">> "]]  ;; good tutorial 
candidate from 'Rebol for Dummies' by Ralph Roberts
>>to-integer #2A  ;; Hex. But what was the question?

>>big-Q: does [ rejoin [ none ". But the answer is: " to integer! 
#2A]]
>>big-Q

>>little-Q: [ rejoin [ none ". But the answer is: " to integer! #2A]]
>> do little-Q

>> do big-Q ;; now you get an error because none is the has-no-value 
word
>> type? none 
>> path? 'none/first
RobertS:
25-Aug-2007
More and more I think that was is not obvious is no longer obvious 
once it is obvious

There is an 'active' LISP tutorial that would be a good model for 
a 'Rebol for newbies'

I would like to use the approach taken in the 2.3 "Official Guide" 
book to introduce unit testing in Rebol for TDD "from-the-get-go"

In Smaltlalk we used to count on newbies exploring in a workspace: 
we reaped a culture where people thoght the point of O-O was to write 
subclasses and create deep hierarchies like, say, Collection.  What 
was obvious was just wrong.  Messages were the point, not classes, 
let alone sub-classing.  Am I wrong to suggest to anyone new: "buy 
as used copy of "The Official Guide" " ?  For Oz, which is so much 
like Rebol, I do not hesitate to recommend Peter Van Roy's CTM from 
MIT Press.  Scheme has 'Little Schemer' and 'Simply Scheme'   The 
latter would be my model for an interactive tutorial in which you 
LEARN.  Smalltalk was supposed to be about how we model things ( 
how we learn how things interact )

I think it fair to say that it failed.  Classes were not the point. 
 Objects were not the point.  Things went wrong early on in abandoning 
the Actor Model in early 70's     I am hoping Rebol3  is getting 
it right ;-)   ( Io, the language, is quite inspiring ( www.iolanguage.com 
) but I still think Oz is a great intro to Rebol (they, too, lack 
an effective learning tool to "think in Oz " )
RobertS:
26-Aug-2007
Can u tell me why we use datetype  unset!  in the func  list-dir 
 but not in the func  to-logic 
I.e.  why do we not have
   to logic!
return false when I pass in it an unset!
?

Or am I missing something here ?  Maybe I miss what is the diff between 
 'qwetr  being type set-word! and it not having a binding yet or 
my having sent
    unset 'qwetr

Is this like the  diff in other lang's between  nil_or_null and undefined_or_undeclared 
?
btiffin:
26-Aug-2007
Robert;  By definition in REBOL the only logical false values are 
#[false] and #[none]  So for instance, integer! 0 is logcally true, 
which took me by surprise at first, but that is the way of REBOL. 
 Surprise! Usually pleasant. :)


Aside: The other words that evaluate as false; no, off (others?) 
do not have a pure lexical form so, #[off] is not a loadable value 
but the word off still evaluates to #[false].


And  to logic! get/any 'an-unset-word  will evaluate as #[true], 
as back to the defintion, only #[false] and #[none] are false.  As 
far as I understand it anyway.
RobertS:
31-Aug-2007
; I did a dif between the functions in VIEW and those in CORE for 
a default install.  What I get is this ( I hope it is useful to have 
al 106  in one place )

 alert  brightness?  caret-to-offset  center-face  choose  clear-face 
  clear-fields  confine  crypt-strength?

 dbug  deflag-face  desktop  dh-compute-key  dh-generate-key  dh-make-key 
  do-events  do-face  do-face-alt  do-thru  

 draw  dsa-generate-key  dsa-make-key  dsa-make-signature  dsa-verify-signature 
  dump-face  dump-pane  edge-size?  

 editor  emailer  exists-thru?  find-key-face  find-window  flag-face 
  flag-face?  flash  focus  get-face  

 get-net-info  get-style  hide  hide-popup  hilight-all  hilight-text 
  hsv-to-rgb  in-window?  inform  

 insert-event-func  inside?  install  launch-thru  layout  link-relative-path 
  load-image  load-stock  

 load-stock-block  load-thru  local-request-file  make-face  notify 
  offset-to-caret  open-events  outside?  

 overlap?  path-thru  read-net  read-thru  remove-event-func  request 
  request-color  request-date  request-dir  

 request-download  request-file  request-list  request-pass  request-text 
  reset-face  resize-face  rgb-to-hsv  

 rsa-encrypt  rsa-generate-key  rsa-make-key  screen-offset?  scroll-drag 
  scroll-face  scroll-para  set-face  

 set-font  set-para  set-style  set-user  show  show-popup  size-text 
  span?  stylize  textinfo  unfocus  

 uninstall  unlight-text  unview  vbug  view  viewed?  win-offset? 
  within?
Allen:
3-Sep-2007
not as much fun as exploring/learning with your own funcs, but help 
"?" can do some great things, including matching on datatype "? tuple!" 
is a quick way to lookup colours.
RobertS:
12-Sep-2007
; using a context there is no problem traversing a path into nested 
blocks. But there is using nexted blocks alone.  Here is my first 
answer to this...
>> t1: [a "one" b "two" c "three"]
== [a "one" b "two" c "three"]
>> t2: [f t1]
== [f t1]
>> t1/b
== "two"
>> t2/f
== t1
>> t2/f/b
** Script Error: Cannot use path on word! value
** Where: halt-view
** Near: t2/f/b
>> pword: func [path 'word /local blk] [
[    return to-path reduce[path :word]]
>> do pword t2/f c
== "three"

; pword is my first pass at a function to traverse nested blocks 
which are not in an object; the alternative appears to be
blk:  get t2/f
aPathDeeper: make path! [ blk c ]
; anyone know anoth path to take?
RobertS:
12-Sep-2007
; this issue persists 
>> t2: [functor t1]
== [functor t1]
>> p3: to-path reduce[ t2/functor 'x]
== t1/x
>> do p3
== [f "for"]
>> p3: to-path reduce[ t2/functor 'x/f]
== t1/x/f
>> do p3
** Script Error: Invalid path value: x/f
** Where: halt-view
** Near: t1/x/f
; there seems to be no way to "append'" to a path ??
RobertS:
12-Sep-2007
>> p4: to-lit-path [t1 x/f]
== 't1/x/f
>> do p4
** Script Error: Invalid path value: x/f
** Where: halt-view
** Near: t1/x/f
>> t1/x/f
== "for"
RobertS:
12-Sep-2007
; this works
>> p4: to-lit-path 't1/x/f
== 't1/x/f
>> do p4
== "for"

; but it is no help if t am trying to pass in the path the I wish 
to "extend" deeper
RobertS:
12-Sep-2007
>> p4: to-path "t1/x/f"
== t1/x/f
>> do p4
** Script Error: Invalid path value: t1/x/f
** Where: halt-view
** Near: t1/x/f
>> type? p4
== path!
>> get first p4

** Script Error: get expected word argument of type: any-word object 
none
** Where: halt-view
** Near: get first p4

; using get first or get second or get last usually is handy diagnosing 
what is reported as a path but in fact fails as a path
RobertS:
13-Sep-2007
I am trying to compare what I can do in Rebol to what I can do in 
another language with functors

What hamstrings me is that a path cannot be extended unless the blocks 
are literally nested or in an object

I am hoping some one will da ythat in R3 path! is more like a series!
path: this/thing
path: append path 'what
rez: path
Chris:
13-Sep-2007
The path is not valid, so long as you are trying to resolve it with 
'do.
RobertS:
13-Sep-2007
The path! that my 'pword func returns responds as expected to 'do
Chris:
13-Sep-2007
Iin your example (again, if I understand correctly), 'do (or default 
behaviour) resolves each stage in the path.  So, with a given path 
-- t2/f/b -- it'll go t2/f == 't1-- but this is just a word, not 
the value associated with the word.

It's equivalent to this:
val: 't1
val/b
Chris:
13-Sep-2007
join to-path do path 'a
Chris:
13-Sep-2007
path: 't2/f
do join to-path do path 'a
Group: Announce ... Announcements only - use Ann-reply to chat [web-public]
Terry:
18-Feb-2005
Do i need to put up my hand to go potty?  Or will setting the status 
to "bathroom" be ok?
Gregg:
26-Feb-2005
Let me try this again. 


RT hosts this world for REBOL discussions, and they graciously don't 
complain that we have a lot of off-topic channels, probably because 
they understand that's how people work. It is for the REBOL community.


There aren't any set rules here, nor do I think we need them. I think 
that, as a community, we need some non-REBOL channels, just not so 
many; and not so "loud" (i.e. active) that they consistently shadow 
the REBOL content. If each of us "self monitors", there should be 
no problem. i.e. if you find yourself writing a lot more non-REBOL-related 
messages than REBOL-related ones, consistently over time, think about 
whether that's adding value to the world.  


I disagree somewhat with the view of "let them opt out of a group 
if they don't like it", because that puts the power in the hands 
of one group to drive others away. That's just me.


To me, a group belongs here, and a conversation has value, if it 
is of interest to the vast majority ofere people who are part of 
it. 

Here are a couple suggestions:


1) Don't post a long stream of uninterrupted messages. If there's 
a subject on your mind, post a message or two on it, and see if anyone 
responds. If not, don't keep posting more messages on that subject.


2) If a non-REBOL conversation involves only two or three people 
and/or is argumentative in nature, go private or off-world. Again, 
this is not our world; let's not abuse RT's storage and bandwidth.

Thanks!
Coccinelle:
11-Mar-2005
I updated the sql-protocol script. It's always on the script library 
here http://www.rebol.org/cgi-bin/cgiwrap/rebol/view-script.r?script=sql-protocol.r

The only change is related to the sql dialect for the FROM clause. 
Now the following syntaxes are possible:
   FROM table table ... (existing syntax)
   FROM [table alias] [table alias] (existing syntax)
   FROM table AS alias table AS alias (new syntax like SQL)
   FROM alias: table alias: table (new syntax more "rebolish")


What do you prefer, something very near to SQL or something more 
in the spirit of REBOL.

Your feedback is welcome, I prefer by mail ([marco-:-ladyreb-:-org])
Rebolek:
8-Jun-2005
I've updated my two years old Texture Studio (now TextureX) to work 
under new View betas, you can try it - do http://krutek.info/rebol/texturex.r
Graham:
11-Jun-2005
What's the menu system do ?  Moving to ann-reply
ChristianE:
12-Jun-2005
Next version is 0.2.0 and features an experimental SLIDER-ITEM in 
menus. A bit of a proof of concept, but fun stuff. To run the demo, 
do the link below.
Carl:
8-Jul-2005
I would like your permission to publish some of the groups here on 
R3 to the web site. See:
http://www.rebol.net/article/0183.html


The only groups that will be published will be those that have descriptions 
that contain the string [web-public].


If I do not hear any objections (post them to "Carl Only" group), 
I will fire up the scripts and get this started.
[unknown: 9]:
31-Dec-2005
The Gripe:


Go here www.Rebol.org, then go here: http://www.ruby-lang.org/en/, 
then here: http://java.sun.com/, hell even go here, http://msdn.microsoft.com/vbasic/, 
now go back to www.Rebol.com


Even if you don't know what the language is or does, do you want 
to go to Rebol.org?  The main page looks like the last page in the 
basement of a website.  Almost like an "error page"

O There is no single location for all Rebol information.

O Rebol.net, Rebol.com, and Rebol.org are spread out and run by RT. 
O There is no pizzas!
O I don't "feel" community when I visit these sites.


I know I'm not talking to my audience when I say; "think of this 
like a night club" but this is what this is all about.  People want 
to "be where the fun is happening."  Even programmers.

My Suggestion:

O We need a site controlled by the developers.

O We need a forum where people can bitch and meet each other, and 
feel welcome.

O The site needs to have a consistent dynamic attractive template.

O The site needs to be a clearing house for all other sites.  Teach 
and directing people to all the resources.

O The site needs to paint a picture as opposed to describe everything 
with a thousand words.

What is entailed:


O Start a new site, I would propose "RebolCentral.com"  I'm willing 
to pay for it, but I don't want to be in charge of it, I suggest 
we make it a committee.


O The main page should cover every topic and reason anyone would 
come to the site.  This means we support every country and other 
site.  The idea here is a clearing house of centralized information. 


O News: The site needs to gather news worthy information and post 
that at the top.  The site is not alive unless people have a way 
to post their information.  This means that there needs to be at 
least one editor, if not several that share the task.  Every time 
a product is updated, the new features are mentioned.  When Carl 
updates his blog, it gets a single sentence directing people there, 
unless it is news of a release of something.  Etc.


O Product Reviews:   This is key.  Products need to be rated, reviewed, 
categorized, voted on.

O Video Archive: All the videos of all the talks ever given   


O Tutorials:  there are a lot of tutorials out there, but which are 
best?  We need to review the tutorials, rate them by Beginner, Intermediate, 
Advanced.  


O Forum: Start with major topics, and then break it down.  The forum 
needs to direct people to other countries, or support the other countries 
right in the forum.  Great simple forum: http://discussion.treocentral.com/index.php?styleid=1


O Respect the real estate.  The #1 mistake people make is treating 
their websites like just pages.  This is just like real estate, location 
location location.  We need to place the content based on where people 
are going.  So you build the basic site, watch it for a couple of 
weeks, then shift things around based on where people are actually 
going. 


O More art, more photos, more community.   It needs to feel inviting: 
http://msdn.microsoft.com/events/pdc/

Stone soup:


I will pay for, host, and supply a fast linux system (w/archive). 
 

I will help design the templates, and provide (and buy if needed) 
great art for the site.

I will not run the site, nor control the content, but I expect there 
to be in place all the items outlined above, set up in a manner that 
it a) runs itself, b) puts the power in the hands of the developers.
François:
18-Feb-2006
Yes, why not, but i do not want to pollute with forums that would 
not concerned much people...
Carl:
2-Mar-2006
You can reach him at email on rebol.com if necessary. (I do not put 
his email address here to avoid spam harvesting).
Henrik:
28-Sep-2006
HTTP Tools. A small script containing a few functions to read the 
HTTP header of a webserver. It doesn't do much, but the main purpose 
is to determine which scripting language is used on a specific webserver. 
I use it to upload ASP and PHP scripts to various webservers, without 
having the user needing to know the scripting language in advance. 
It's not very strong yet and some servers will not reveal this information, 
but I hope it can be built into a reliable tool for determining scriping 
language over time.

http://hmkdesign.dk/rebol/http-tools/http-tools.r

Example:

>> server-type http://rebol.com
== "Apache"
>> x-power-type http://www.hmkdesign.dk
== "php"
>> x-power-type http://www.microsoft.com
== "asp"
Louis:
11-Oct-2006
REBOL [
    Title:   "Slideshow"
    Date:    12-Oct-2006
    Name:    'SLIDESHOW  ; For window title bar
    Version: 1.0.0
    File:    %slideshow.r
    Author:  "Louis A. Turk"
    Rights:  "Public Domain; use at your own risk."
    Needs:   "A version of REBOL/VIEW supporting sound"

    Purpose: {To make possible simple, easy to make narrated slide shows.

              Hopefully can be used with the REBOL plugin to show narriated slides
              on a web site.

              Hopefully can an effective tool to teach REBOL programming.
    }
    Note: {
        The concept and design originated with Louis A. Turk.

        DideC helped considerably by answering programming questions and 
        giving bits of code;
        it would not have been possible without his help.
	Josh also answered programming questions.


        You can make wav files using the free program Audacity. http://audacity.sourceforge.net


        Advanced JEPG Compressor does and excellent job compressing graphics 
        files so they load 
        faster, but is not free.
    }
    History: [
        1.0.0 [ "First release." "Louis"]
    ]

    Language: 'English
]

;Requires a data file named %slides.r containing lines of blocks 
in the following format:

;Each block must contain: (1) slidename, (2) overlay, (3) caption, 
(4) sound.

;Example block: [%slide1.jpg "Overlay text." "A caption!" %sound.wav]
;Use "" for no overlay or caption.


;file: request-file/title/only "Select the slides data file to use." 
"Select Data File"

file: %slides.txt ;uncomment the above line, and comment this one 
to select data files with different names.
slides: load file
narrate: func [talk] [ ;--- Manage the sound
    sound-port: open sound://
    insert sound-port load talk
    wait sound-port
    close sound-port
]

view/new win: layout/size [] 650x650 ;<= Set the max size you need
wait 0  ;---Initialize REBOL's internal event handler.
foreach slide  slides [ ;--- Start the slide show
    set [graphic overlay caption narration] slide
    lay: layout [
        origin 0

        banner center bold red "A REBOL Produced Narriated Slide Show" 
        image graphic overlay 500x400 frame black [unview] [quit]
        text 500 bold caption
        button "Quit" center [quit]
    ]
    center-face/with lay win
    append clear win/pane lay
    show win
    narrate narration
]
do-events
Group: rebcode ... Rebcode discussion [web-public]
Henrik:
26-Oct-2005
never send a checklist to do a voting applications' job :-)
[unknown: 5]:
26-Oct-2005
I don't know enough about rebcode to do any voting - there any docs 
yet?
BrianH:
28-Oct-2005
Or for that matter, you could do an add or sub to n before you use 
it.
BrianH:
28-Oct-2005
If the table-base is a pointer to the table (as it is here) any rebasing 
would require math. The question is whether you want to do that math 
every time, or just when you need to.
Volker:
28-Oct-2005
You need to do it every time you switch. Its not 0-based, its always 
table-based.
BrianH:
28-Oct-2005
(Sorry to answer my own question) A state machine could be implemented 
as a brab with an indirect offset block at the head of a loop - that's 
a good use I guess. With an indirect label block (or absolute offsets) 
you could do the machine without the loop, just branches at the end 
of each state, but if you had to do runtime searching for the labels 
that wouldn't be faster.
BrianH:
29-Oct-2005
How would you do it, like this?

cmp.i: ["Sets a variable to -1,0,1 if two values are <,=,>" word! 
word! | integer! word! | integer!]

cmp.d: ["Sets a variable to -1,0,1 if two values are <,=,>" word! 
word! | decimal! word! | decimal!]
BrianH:
29-Oct-2005
Your example bra3 there didn't act that way - the result of a sub 
isn't referenced. Do you want to fix your example?
Pekr:
30-Oct-2005
simply what I wanted to ask - if that is normal with such VMs in 
other languages or we simply do allow such crashes because of various 
reasons (e.g. preferring speed, not doing checks etc.)
BrianH:
30-Oct-2005
JVM and CLR VMs do a lot of testing of their bytecode sequences before 
execution, as part of their security testing. Until someone makes 
a type-inferencer for rebcode, it won't be safe to use without manually 
reviewing every function before use, or only using rebcode generated 
by trusted compilers. It is much like machine code in that way.
BrianH:
30-Oct-2005
I haven't been able to come up with a way to exploit these crashes 
(nor am I likely able to do so), but crashing the process repeatedly 
can be a good denial-of-service technique. Type flow analysis is 
a must for rebcode, so be extra careful with your data type testing!
Henrik:
30-Oct-2005
To me the BRAB example in the rebcode docs in section 2.8 is quite 
unclear. "The brab opcode allows computed branch offsets to be created". 
You can say the same about BRA, BRAF and BRAT as well. :-)


I have no idea what this opcode does, except that it looks vaguely 
similar to a SWITCH so it would be doing multiple branches somehow. 
It would have helped to see output results from the code and to have 
a better initial explanation on how to use BRA with integer indexes 
and an explanation of the B in BRAB. Do you agree?
BrianH:
30-Oct-2005
Henrik, they actually do a good job at explaining what the index 
is for:

The first argument to the opcode is normally a block, and the second 
is a zero-based index into that block. The value at that position 
is fetched and assumed to be the integer offset for the branch.

Now all they need to do is replace the word "computed" with "indexed".
Group: !REBOL3-OLD1 ... [web-public]
Geomol:
11-Apr-2006
First, second, ... go up to tenth. We don't have eleventh. You need 
to do serie/11 to get the 11'th element.
Rebolek:
11-Apr-2006
Geomol: "So pairs need to be extended somehow into a datatype, which 
is like a vector, but with integers instead of decimals." --- decimal! 
is better in my opinion. It's consistent with current behaviour whre 
you can do 
>> block/4.5
and decimal part is truncated.
Henrik:
11-Apr-2006
during a bath, I thought up a Grand Master Plan:


1. Build a dialect that could handle scientific/symbolic math on 
the hard core level

2. Make it possible to take an equation and draw it up correctly 
with DRAW, a pretty print equation display. The same dialect would 
be used as above.

3. Use that to display pretty equations inline in makedoc2/3 documents!

4. Some people are working on a postscript dialect which hopefully 
eventually will be able to use DRAW blocks as an input, thereby allowing 
you to create equations on the console and convert it to DRAW or 
PS at the same time as having the ability to do calculations. That 
would be powerful.

Say:

calculate [2 [m] / 3 [cm]] ; would return the result as needed
calculate/draw [2 [m] / 3 [cm]] ; would return a DRAW block

postscript calculate/draw [2 [m] / 3 [cm]] ; would convert that DRAW 
block to postscript
Maxim:
11-Apr-2006
most people stop when they actually try to do a concrete application 
within constrains and realise many things within the implementation 
of this or that... well, just falls short of working.
Anton:
11-Apr-2006
net-utils/net-log join "Type: " type: any [
	    all [new-dir? 'new-dir] 
	    all [new? 'new] 
	    all [dir-read? port 'dir] 

     all [port/state/flags and system/standard/port-flags/open-append 
     <> 0 'app] 
	    'file
	] 
	do select [
	    file [

  confirm-cmd port either port/algorithm = 'nlst [nlst-check] [list-check] 
		accept-connect port type 
		parse-dir-list port 
		if tmp: select locals/dir-cache to-file port/target [
		    port/status: first tmp 
		    port/date: third tmp 

      if any [none? port/size: second tmp 1024 > port/size] [port/size: 
      0]
		] 
		data-connect port 
		confirm-cmd port binary-type-check 
		if 0 < cmd-port/state/index: port/state/index [
		    confirm-cmd port restart-check
		] 
		confirm-cmd port read-check
	    ] 
	    new [confirm-cmd port write-check] 
	    new-dir [confirm-cmd port mkdir-check] 

     dir [confirm-cmd port either port/algorithm = 'nlst [nlst-check] 
     [list-check]] 
	    app [confirm-cmd port append-check]
	] type 
	accept-connect port type 
	if type = 'dir [
	    port/size: port/state/tail: parse-dir-list port
	]
    ] 
    port
]
close: func [port /local cmd-port cache-size][
    cmd-port: port/locals/cmd-port 
    if not dir-read? port [error-try? [confirm-transfer port]] 

    net-utils/net-log reform ["Caching cmd-port" cmd-port/host cmd-port/local-port 
    cmd-port/remote-port] 
    cmd-port/host: cmd-port/locals/tuple
Chris:
13-Apr-2006
From the Roadmap: "Greater Locality Support 

It's time for REBOL to do a better job at supporting native languages 
and character-sets. Our goal to expand support with locality and 
unicode enhancements. In addition, it is a goal to release 3.0 with 
French, Italian, and perhaps one/two other languages as part of the 
standard distribution."
Gregg:
14-Apr-2006
The current library interface is servicable, but could be improved.

For example, char arrays in C structs are a real pain to deal with,

there is redundancy if you're importing a number of routines, from 

the same library, and extra work is required to deal with pointers
to values.

The biggest issue for me seems to be that I have to use COMPOSE 

heavily to get the results I want, or there's a lot of duplication
in struct and routine defs.

--- Easier Routine Declarations

The only thing I've addressed in my lib interface dialect is
making it easier to declare routines. I posted it to REBOl.org
for discussion:


http://www.rebol.org/cgi-bin/cgiwrap/rebol/view-script.r?script=lib-dialect.r

--- Pointers


This is maybe a bit of an extreme example, but I had to do it, so 
it's not purely theoretical.

    LPINT-def: [value [integer!]] none

    LPINT: make struct! LPINT-def none

This struct shows where a nested struct is needed.

    _FAX_JOB_PARAM-def: compose/deep/only [

        SizeOfStruct    [integer!]      ; DWORD structure size, in bytes

        RecipientNumber [string!]       ; LPCTSTR   pointer to recipient's 
        fax number

        RecipientName   [string!]       ; LPCTSTR   pointer to recipient's 
        name

        Tsid            [string!]       ; LPCTSTR   pointer to transmitting 
        station identifier

        SenderName      [string!]       ; LPCTSTR   pointer to sender's name

        ;SenderName      [struct! [value [string!]]]       ; LPCTSTR   pointer 
        to sender's name

        SenderCompany   [string!]       ; LPCTSTR   pointer to sender's company

        SenderDept      [string!]       ; LPCTSTR   pointer to sender's department

        BillingCode     [string!]       ; LPCTSTR   pointer to billing code

        ScheduleAction  [integer!]      ; DWORD job scheduling action code

        ;ScheduleTime    [struct! (SYSTEMTIME-def)]        ; SYSTEMTIME  
          time to send fax
            wYear       [short]
            wMonth      [short]
            wDayOfWeek  [short]
            wDay        [short]
            wHour       [short]
            wMinute     [short]
            wSecond     [short]
            wMilliseconds [short]

        DeliveryReportType  [integer!]      ; DWORD e-mail delivery report 
        type

        DeliveryReportAddress [string!]     ; LPCTSTR   pointer to e-mail 
        address

        DocumentName        [string!]       ; LPCTSTR   pointer to document 
        name to display
        CallHandle          [integer!]      ; HCALL reserved
        ;_PTR   Reserved[3]  [integer!]      ; DWORD must be zero
        _PTR-0  [integer!]      ; DWORD must be zero
        _PTR-1  [integer!]      ; DWORD must be zero
        _PTR-2  [integer!]      ; DWORD must be zero
        _PTR-3  [integer!]      ; DWORD must be zero
    ]
    _FAX_JOB_PARAM: make struct! _FAX_JOB_PARAM-def none
    _FAX_JOB_PARAM/SizeOfStruct: length? third _FAX_JOB_PARAM

    fax-complete-job-params: make routine! compose/deep/only [

        JobParams     [struct! (LPINT-def)] ; ptr to job information struct

        CoverPageInfo [struct! (LPINT-def)] ; ptr to cover page struct
        return:       [integer!]
    ] winfax.dll "FaxCompleteJobParamsA"

So, the API call returns pointers to structs containing the 
data we want; to get it we need to dereference the pointers
after the call.

    complete-job-params: func [
        /local
            params-ptr cover-ptr    ; API return pointers

            params cover            ; REBOL structs with data from API
    ][
        ; allocate return pointer structs for API call
        params-ptr: make-LPINT
        cover-ptr: make-LPINT

        ; make the API call

        reduce either 0 <> fax-complete-job-params params-ptr cover-ptr [

            ; get data from pointers returned by the API

            params: get-dereferenced-data params-ptr _FAX_JOB_PARAM-def

            cover:  get-dereferenced-data cover-ptr  _FAX_COVERPAGE_INFO-def
        ...



Getting the de-ref'd data is the real pain, and seems like it might
be unsafe in the way I did it, though it worked.

    get-dereferenced-data: func [

        {Given a pointer to memory, copy the target data into a REBOL struct.}

        pointer [struct!]   "LPINT structure whose /value is the data pointer"

        struct-def [block!] "The struct you want returned with data"
        /local struct data orig-pointer result
    ] [

        struct: make struct! compose/deep/only [ ; make wrapper struct
            sub [struct! (struct-def)]
        ] none

        orig-pointer: third struct              ; store original inner pointer

        change third struct third pointer       ; change inner pointer to 
        ref'd data

        data: copy third struct/sub             ; copy data from the inner 
        struct

        change third struct orig-pointer        ; restore inner pointer

        result: make struct! struct-def none    ; make result struct

        change third result data                ; change data in result struct
        struct: data: orig-pointer: none
        result
    ]


--- char arrays in structs, or as routine parameters

You can't just declare a fixed size block or string to do this, 
you have to (AFAIK), have individual elements for each item.
That's a huge pain if you have a 128 element array, so I end
up generating them dynamically. I think that was Cyphre's idea
originally, but I don't have notes on it.

    make-elements: func [name count type /local result][
        if not word? type [type: type?/word type]
        result: copy "^/"
        repeat i count [
            append result join name [i " [" type "]" newline]
        ]
        to block! result
    ]

    GUID: make struct! GUID-def: compose [
        Data1   [integer!]  ; unsigned long
        Data2   [short]     ; unsigned short
        Data3   [short]     ; unsigned short
        (make-elements 'Data4 8 #"@")  ; unsigned char
    ] none


--- MAKE-ing structs

How do other people make structs from prototypes? 

    make-struct: func [prototype /copy /with data] [
        make struct! prototype either copy
            [second prototype]
            [either with [reduce [data]][none]]
    ]


--- BSTR type

I've only needed it for one project, but it might be worth 
finding out if it would be worth adding BSTR support for
Windows, as a routine datatype.
Maxim:
14-Apr-2006
in the best of worlds I'd prefer it if we could read all the info 
from a .h file and convert it into a rebol file ready to load the 
dll...
Gregg, Do you think this is possible?
Gregg:
15-Apr-2006
I've done some little C processor dialect ideas as well, mainly to 
handle DEFINEs and convert structs to REBOL friendly data. I think 
those kinds of tools are useful and, for the amount of use they get, 
I prefer that approach to trying to do a complete C processor/loader. 
Ultimately, that might be good for some people, but I still want 
an interface dialect in REBOL that makes things easy to read and 
understand from a REBOL perspective. I think "dialect first, then 
tools".
Karol:
20-Apr-2006
I found learning rebol very easy because of it is just about words 
if you know 50 words you can write script if you know 200 you do 
it better. All those namespaces, dictionaries, classes ,trees or 
whatever does not help in writing programms and you need to remember 
more things. Using rebol is like using foreign language. Rebol has 
contexts and dialects for changing meaning of word. Maybe every script 
should work in its own context from default? I notice that many scripts 
are written in that way with use of 'set to put something to global 
context. And to be practical I use editor with syntax highlighting 
so every word from global context (set only) are blue so i can easly 
see if I redefine global word - after all it's just warning like 
in any language
Volker:
20-Apr-2006
I agree. Toi master a language, i have to master the core-features. 
And if there are a lot of them, that slows down. And i can do the 
same things with current features in a slightly diferent way, i am 
lazy, so keep core small :)
Volker:
20-Apr-2006
Is namespacing the only way to do it?
Volker:
20-Apr-2006
I would add "how to do them in rebol". In case of namespaces, maybe 
a more dialected approach could be usefull.
Pekr:
20-Apr-2006
Volker - then any new concept addition will ruin rebol for you, as 
you will have to learn it ... View is gonna be overhauled too - changes 
to face and who knows what .... from recent blogs, I can only see 
positives in getting them. I have a trust in Carl and that he is 
going to do those things in sensitive way ...
Maxim:
20-Apr-2006
only admin level users can really do anything to spoof networking... 
normal unpriviledged users cannot change system files, thus cannot 
change libs.
Maxim:
20-Apr-2006
now tell your IT manager or CTO that you have to do all of this just 
to get the user name and that you really want to use REBOL...  ;-)
Maxim:
21-Apr-2006
It has just occured to me that if REBOL needs a niche and actually 
wants to have REBOL work in the Large... that they need to do only 
one thing.   Embrace XML.   its got everything going for it, there 
is nothing to invent (just read specs and implement, like protocol 
RFCs).
Maxim:
21-Apr-2006
REBOL should not use XML internally, but should be made to be as 
XML literate as is possible.  imagine if we could simply tell any 
current IT management that all they need to USE all of that $ they 
invested in those obscure tools, is Load and then they can actually 
do stuff with it.
Henrik:
21-Apr-2006
there is some merit to that: what if the rebol developer quits? they 
don't exactly camp out in everybody's backyard. java developers do.
Gabriele:
26-Apr-2006
closures haven't much to do with threading. although they are reentrant, 
while normal funcs are not (in r2; I guess it may be possible to 
make normal funcs reentrant in r3).
BrianH:
26-Apr-2006
Personally, I've never really considered the "copy problem" a problem. 
When you don't copy something it doesn't get copied. When you do 
it does. Series aren't immediate values, they are reference values. 
Same for objects. Every language design choice could be considered 
a bug or a feature - it all depends on how you use it. I've found 
more advantages to the way that REBOL functions work now.


The only real problem I've run into is functions keeping references 
to their temporary data after they return, at least until they are 
run again (a memory hole). The closure example above with the adders 
stops being a problem when you realise that FUNC is a function that 
does something when passed a  couple blocks - it's not syntax. You 
didn't copy the block, so it gets reused, go figure. You are building 
functions - is it such a stretch to build code blocks?

make-adder: func [n] [func [x] compose [x + (n)]]
3301 / 1157812345...3233[34] 3536...112113114115116