[REBOL] text file changes Re:

2000-07-10 Thread icimjs

At 03:59 PM 7/10/00 +1000, you wrote:
hi all
just need a little help with something..
i am trying to change all returns in a text file to tabs 

file: read %some-filename.txt

replace/all file "^/" "^-"

and then change 
every occurence of ZZZ to a returnis this possible?

replace/all file "ZZZ" "^/"

i am on windoze 98se.the file is about 12mb with about 500,000 records.
i have checked the user guide but couldn't get anything out of it regarding 
this sort of thing

thanks in advance
keith




;- Elan [ : - ) ]




[REBOL] Automation query... Re:

2000-07-06 Thread icimjs

Hi TBrownell,

you wrote:
Hi.

What is the best way to run a script on a timer basis?

I have a script that that fires off another that
checks a pop account every minute and then runs any
scripts it finds. 

This is a bit thick, but it works...

N: repeat 100 [wait 60 do %popreader.r]

You can use forever, i.e.

forever [ wait 60 do %popreader.r ]


This is lacking as...

A. If it hits an error it stalls.

use try, i.e.

forever [
  wait 60
  if error? set/any 'error try [ do %popreader.r ] [
date: replace form now "/" "-"
logfile: to file! join "error-" [date ".log"]
save logfile mold disarm error
  ]
]

(this will log each error into its own file called error-date-time.log)
and - more importantly - it should continue executing.

  
B. It picks up values from all the scripts it
generates via email

That I don't understand. Where are these values coming from? Remember,
REBOL does garbage collection, so I would assume - depending on how
popreader.r is written - that old values are garbage collected whenever you
rerun popreader.r, because popreader.r will reuse the same words it used
previously. When the words are reused the old values become orphaned and
are garbage collected. So you shouldn't be accumulating any garbage. But
then again, I haven't seen popreader's source, so what do I know?

In any event, it should be possible to write popreader.r in such a way that
you don't accumulate stuff over several runs.

Hope this helps,


;- Elan [ : - ) ]




[REBOL] Automation query... Re:

2000-07-06 Thread icimjs

Hi,

I just noticed that Windows has a problem with colons in file names. This
should work better if you're running under MS Windows (under linux, you can
disregard the modification):

REBOL []

forever [
  wait 60
  if error? set/any 'error try [ do %popreader.r ] [
date: replace form now "/" "-"
date: replace/all date ":" "."
logfile: to file! join "error-" [date ".log"]
save logfile mold disarm error
  ]
]



;- Elan [ : - ) ]




[REBOL] one more time Re:

2000-07-06 Thread icimjs

Hi Tom,

to make things a little more interesting, under Redhat Linux 2.2.15 I am
having absolutely no problems.

Which Linux distribution are you using?

At 12:59 PM 7/6/00 +0100, you wrote:
one more time

howdy again,

I'm stumped. Why do I get this with REBOL 2.3.0.4.2:

error in loading shared libraries: libtermcap.so.2: cannot open shared
object file: No such file or directory

and not with 2.2.0.4.2?

I ran "update", and I'm using the libc6 version...
does anyone have a clue?

Thanks in advance,

-tom




;- Elan [ : - ) ]




[REBOL] Does rebol --do print 123 for e.g. work for ya? Re:

2000-07-06 Thread icimjs

Hi Petr,

works fine for me.

I can duplicate your error if I leave away the surrounding "", i.e. if
instead of

rebol --do "print 123"

I enter

rebol --do print 123



;- Elan [ : - ) ]




[REBOL] An experiment with RTF Re:

2000-07-06 Thread icimjs

Hi Brett,

would you consider using AbiWord? It's a beautiful, open source, portable
word processor (still in prelease, but it rocks). The advantage is that
uses an XML based page description language that can easily be parsed using
REBOL's XML parser and then converted into the appropriate HTML.

you can download a copy at

http://www.abisource.com

Advantages: 
1. AbiWord has a relatively small footprint (compared to MS Word). It loads
much faster.

2. You can download the source and you could conceivably add a button that 
a) saves the current file,
b) starts up REBOL and has REBOL parse the saved file, and
c) posts the file to the Web site.

3. AbiWord is similar enough to MS Word that I would think that anyone who
can use MS Word will be able to figure out AbiWord quite easily.

4. Big plus: You do not place your solution in the hands of a 3rd party.
I.e. you control what your software does. With MS Word, if Microsoft
decides to change something about MS Word, and you happen to rely on that
feature, and your sister's company wants to use the new improved version of
MS Word, they will have to keep two versions of MS Word around, which may
cause confusion, take up alot of hard drive space, and conceivably
occassionally crash the computer.

I think we should adopt AbiWord as standard front end for text and XML
oriented interactive solutions that include REBOL as a scripting component.



At 07:25 PM 7/6/00 +1000, you wrote:
Hi,

Again I'm re-impressed with rebol. I spent yesterday and today parsing Rich
Text Format files with rebol and it works a treat.
Although I only got as far as loading RTF into Rebol blocks and words - but
I'm still impressed.

The situation I have is that I'm going to do up a web-site for my sister's
company. I want to be able to implement a consistent style for the site and
yet have my sister or her staff do the updates. Since they are not familiar
with Web pages (and I don't think they should have to be), I was looking for
some sort of automated process. I've done a lot of research on the web and I
haven't seen a simple effective solution to this problem - the grail of
content + presentation.

I'd appreciate any comments on other peoples experiences with this sort of
thing.

I hope others may yet find a use for the code I've generated so far, so I
placed it at rebol.org. And if you can use it let me know - I need the
satisfaction :)

The script can be found at http://www.rebol.org/general/rtf-tools.r

Brett Handley




;- Elan [ : - ) ]




[REBOL] Find speed Re:(3)

2000-07-06 Thread icimjs

Hi Ladislav,

your test function is responsible for the results you get, not the hash!

The critical code in the time-blk function is
start: now
loop :count :block
finish: now

When you test the hash function, your timing function (time-blk) loops over
the block:

[
random/seed 1
c: 0
blk: make hash! []
repeat i n [
d: random m
if not find blk d [
c: c + 1
insert blk d
]
]
] 0.05

This block includes the CREATION of the hash and INSERTING items into the
hash. Certainly creating a hash and inserting items into the hash is not
the same thing as searching in a hash and the time required to CREATE the
data structure and INSERT items into the data structure should not be part
of the value reported for the time required to SEARCH in the data structure.

Inserting an element into a hash is by nature of hashing algorithms far
more time consuming than inserting an element into a block. Hashes are
optimized for locating an element at the penalty of consuming more time for
insertion. To correctly identify the time it takes to locate an element in
a hash, you must separate the insertion of the element into the hash from
the time you calculate to retrieve the element in the hash.

If you separate insertion from the search in a hash, you must do the same
for the blocks as well. Only then will you be able to compare values that
reflect how long it takes to SEARCH in the different series types you are
testing!

At 10:46 AM 7/6/00 +0200, you wrote:
Hi,

regarding memoizing. There is a class of functions, that must use
some kind of memoizing to work at all, I think. The number of the
possibilities for parameters does not matter, you can store only
important results (depending on what you consider important - eg.
expensive or recent results...)

Because I used a non-real-life example for testing, here is
something more adequate for memoizing purposes:

Block/find time: 14.5 count: 7771
Block/bfind time: 5.875 count: 7771
Hash/find time: 28.5 count: 7771

The source code:

REBOL[
Title: "Seconds"
Author: "Ladislav Mecir"
Email: [EMAIL PROTECTED]
Date: 19/5/1999
File: %seconds.r
]

seconds: function [
{Compute difference between dates in seconds}
a [date!] "first date"
b [date!] "second date"
] [diff] [
diff: b - a
diff: 24 * diff + b/time/hour - a/time/hour +
b/zone/hour - a/zone/hour
diff: 60 * diff + b/time/minute - a/time/minute
60 * diff + b/time/second - a/time/second
]


REBOL[
Title: "Time-block"
Author: "Ladislav Mecir"
E-mail: [EMAIL PROTECTED]
Date: 19/5/1999
File: %timblk.r
Purpose: {
Measure time of a block execution with given relative
accuracy.
This function can even time the execution of the empty
block.
Suggested values for accuracy are: 0.05 to 0.30.
Accuracy better than 0.05 may not be reachable,
accuracy worse than 0.30 may not be useful.
}
]

include %seconds.r

time-block: function [
"Time a block."
block [block!]
accuracy [decimal!]
/verbose
] [
guess count lower upper start finish result
] [
if verbose [print ["Timing a block:" block]]
guess: 0
count: 1
lower: 1 - :accuracy
upper: 1 + :accuracy
while [
start: now
loop :count :block
finish: now
result: (seconds start finish) / count
if verbose [
prin "Iterations: "
prin count
prin ". Time/iteration: "
prin result
prin " seconds.^/"
]
any [
result = 0
guess  (result * lower)
guess  (result * upper)
]
][
guess: result
count: count * 2
]
result
]

{
Example:

time-block [] 0,05
}

Rebol []

bfind: func [
blk [block!]
value
/local d u m
] [
d: 1
u: length? blk
while [(m: to integer! (d + u) / 2)  d] [
either (pick blk m) = value [d: m] [u: m]
]
either (pick blk u) = value [u] [d]
]

include %timblk.r

n: 8192 ; the test size
m: 10 * n ; random number range
prin "Block/find time: "
prin time-block [
random/seed 1
c: 0
blk: copy []
repeat i n [
d: random m
if not find blk d [
c: c + 1
append blk d
]
]
] 0.05
prin " count: "
print c
prin "Block/bfind time: "
prin time-block [
random/seed 1
c: 0
blk: copy []
repeat i n [
d: random m
either empty? blk [
c: c + 1
insert blk d
] [
bf: bfind blk d
if not (pick blk bf) = d [
c: c + 1
insert skip blk either (pick blk bf)  d [
bf - 1
] [
 bf
] d
]
]
]
] 0.05
prin " count: "
print c
prin "Hash/find time: "
prin time-block [
random/seed 1
c: 0
   

[REBOL] View: RebolForces Reb updated Re:

2000-06-30 Thread icimjs

Hi Allen,

really very nice work. 



At 02:55 AM 7/1/00 +1000, you wrote:
Hi Rebols,

I've just finished an update of the Rebolforces Reb. I've added a number of
the interface features people asked for. You can now choose to run, download
and browse the colorised source for each script. ("+" maximises the
minimised  windows too) .

If you haven't visited for a while, click the download icons before running
scripts to force an updated version to be cached on your system.

The view-FAQ I wrote is also linked from the reb as well as 13 other view
demos.


Have a good weekend! (and pity us Aussies as we wake up to a new tax system)

Cheers,

Allen K

Use the REBOL forces link from the Rebol Tech Reb or use the link below

REBOL []
do http://www.janita.com.au/rebolforces/reb/index.r







;- Elan [ : - ) ]




[REBOL] REBOL/Core 2.3 Released! Re:(2)

2000-06-28 Thread icimjs

Hi Ralph,

re: ftp
did you try setting passive to true as Holger suggested?

At 08:41 AM 6/28/00 -0400, you wrote:

 Announcing the release of REBOL/Core 2.3!

 This new version of REBOL/Core includes many
 improvements only available in beta versions
 of our REBOL/View and REBOL/Command products,
 until now.


This is great, thanks, and congrats to all the REBOL team... but g...

I was going to use 'feedback' to report that FTP is still broken but it
seems that 'feedback' itself now does not work. I get:

 feedback
** Script Error: feedback has no value.
** Where: feedback

and the FTP error that has appeared in all REBOLs since 2.2 is still there:

 read ftp://ftp.abooks.com/
connecting to: ftp.abooks.com
** User Error: Server error: tcp 425 Can't build data connection: Connection
refused..
** Where: read ftp://ftp.abooks.com/

This latter is a bit critical for us here to get working again.

But... overall... 2.3 seems nicely improved.

--Ralph Roberts





;- Elan [ : - ) ]




[REBOL] parsing questions - newbie Re:(2)

2000-06-14 Thread icimjs

Hi Keith,

you wrote:
hi elan
well i've looked at the parse section and can't quite figure it out...
how do you nominate that you want the parse function to take place on a 
text file say "aeros.txt" rather than a string?

parse read %aeros.txt rules some-parse-rule

and how do you specify it's location?

%aeros.txt ;- file aeros.txt is located in current directory
%/c/windows/temp/aeros.txt 
 ;- aeros.txt is located on drive C: in directory 
 ;- \Windows\Temp\

and how would you strip off just what's after the colon and discard what is 
before the colon?

It depends on which version of REBOL you are using. I'll go with REBOL/Core
here. 

I am assuming that newline is your delimeter for a record. The
CMLISTPTRACKS: entry is wrapped over several lines in my email client. But
for this item I also assume that the original data consists of one long line.

The following script creates a parse rule, reads the aero.txt file and
applies the rule to the file. 

It generates the following output in the REBOL console: (This output is
tripple wrapped: by the REBOL console, by my email client, by your email
client. The actual string contains no newlines.)

 do %parse-question.r
Script: "Untitled" (none)
 INFINITE POSSIBILITIES  AMEL LARRIEUX   4948792 9399700067507   C9921
 21  SMA 19/06/20
00   GET UP,I N I,SWEET MISERY,SEARCHIN' FOR MY SOUL,EVEN IF,INFINITE
POSSIBILITES,SHINE,DOWN,WEA
THER,MAKE ME WHOLE,GET UP (THREAD HAD FUN MAIN MI,GET UP (MV MIG MIX
(RADIO))15.91   Compact
Disc


Here's the script:

REBOL [
  file: %parse-question.r
]

result: {}

words: [
  "CPTITLE:"
  "CPARTIST:"
  "CMCATNUMBER:"
  "CMAPN:"
  "CMARIAPRICECODE:"
  "CMARIAMEDIACODE:"
  "CMARIADISTRIBUTORCODE:"
  "DMRELEASE:"
  "CMLISTPTRACKS:"
  "CURMPRICE:"
  "CMTYPE:"
]

parse-sub-rule: []
foreach word words [
  insert tail parse-sub-rule :word
  insert tail parse-sub-rule [copy info to newline (append result join info
tab)|
  ]
]
insert tail parse-sub-rule [
  skip
]  

parse-rule: compose/deep [some [(parse-sub-rule)]]

parse-file: read %aero.txt

parse parse-file parse-rule

print result

when you parse files, can it be done on a folder of files?

foreach parse file load %/c/folder/of/files/ [
  clear result
  parse parse-file parse-rule
  print result
]

i have a stack of html files that i need to extract all text in a 
particular section and then change the table cells to tabs etc but i have a 
few to do and would like to run the script over the whole lot at once if 
possible.

This sounds like a different task?

i can see no reference to how you parse files locally..there are only 
examples of web addresses or specifying a string.

See the examples above.


thanks for your help
keith

 hi all
 i am new to scripting (rebol and python) and was wondering if it was
 capable of doing to the following and if so..how?
 the following is an example of what i need to strip and turn into a tab
 delimited file..
 the entries are from a music database that is updated weekly..it is in
 lotus notes so i export from there and it dumps this file out with the new
 titles for the coming week (here the 19th June)
 i only need to get the rows with the double astericks at the start (i put
 those in for this post, they are not there in the normal file) and then
 strip the words at the start and then put a tab in between them so i can
 bring it into excel for the sales team to look at  i would need a
first
 row to describe each column also maybe something like
 Title tab Artist tab Cat no tab APN etc etc
 the tracklisting is a little more complicated as it has multiple tracks
 within the row..they are seperated by commas
 i think that it won't be that hard but i had no success in perl so i
 thought i might try rebol or python...
 
 thanks in advance
 keith
 
 FORM: Popular Recording
 CMTYPESWITCH: Popular
 RELOCORIGINAL: 55864A2603AC94ACCA2568F200224388
 CMCOUNTRY_ORIGIN:
 CMGENRE_CODE:
 **CPTITLE: INFINITE POSSIBILITIES
 **CPARTIST: AMEL LARRIEUX
 CPOARTISTS:
 **CMCATNUMBER: 4948792
 **CMAPN: 9399700067507
 **CMARIAPRICECODE: C9921
 **CMARIAMEDIACODE: 21
 **CMARIADISTRIBUTORCODE: SMA
 CMARIAPACKAGECODE:
 **DMRELEASE: 19/06/2000
 cMDateFormat: 19/06/2000 12:00:00 AM
 DMDELETE:
 cMDeleteStatus: No
 **CMLISTPTRACKS: GET UP,I N I,SWEET MISERY,SEARCHIN' FOR MY SOUL,EVEN
 IF,INFINITE POSSIBILITES,SHINE,DOWN,WEATHER,MAKE ME WHOLE,GET UP (THREAD
 HAD FUN MAIN MI,GET UP (MV MIG MIX (RADIO))
 CMLISTPARTISTS: ,,,
 RELOCMEDIA: F73C80183A01A8D7CA2568F2002A5517
 **CURMPRICE: 15.91
 **CMTYPE: Compact Disc
 CMRECORDCOMPANY: SONY MUSIC
 CMPACKAGE:
 CMARIADISTRIBUTORHOUSECODE:
 cDistributorHouse:
 CMLOCALE: Y
 $UpdatedBy: CN=PPT/OU=AEROS/O=JUKEBOX
 $Revisions: 02/06/2000 05:42:22 PM,02/06/2000 05:42:22 PM
 
 
 

;- Elan [ : - ) ]




;- Elan [ : - ) ]




[REBOL] Errata: parsing questions - newbie Re:

2000-06-14 Thread icimjs

Hi Keith,

small error. Should be:

foreach file load %/c/folder/of/files/ [
  clear result
  parse-file: read file
  parse parse-file parse-rule
  print result
]



;- Elan [ : - ) ]




[REBOL] can rebol strip this type of text file? Re:

2000-06-13 Thread icimjs

Hi Keith,

its trivial to do that in REBOL. You have a number of different choices. 
The most elegant way to do it would be to use parse.

Take a look at the documentation under parse. Let me know if you have
questions.

Elan

At 04:18 PM 6/13/00 +1000, you wrote:
hi all
i am new to scripting (rebol and python) and was wondering if it was 
capable of doing to the following and if so..how?
the following is an example of what i need to strip and turn into a tab 
delimited file..
the entries are from a music database that is updated weekly..it is in 
lotus notes so i export from there and it dumps this file out with the new 
titles for the coming week (here the 19th June)
i only need to get the rows with the double astericks at the start (i put 
those in for this post, they are not there in the normal file) and then 
strip the words at the start and then put a tab in between them so i can 
bring it into excel for the sales team to look at  i would need a first 
row to describe each column also maybe something like
Title tab Artist tab Cat no tab APN etc etc
the tracklisting is a little more complicated as it has multiple tracks 
within the row..they are seperated by commas
i think that it won't be that hard but i had no success in perl so i 
thought i might try rebol or python...

thanks in advance
keith

FORM: Popular Recording
CMTYPESWITCH: Popular
RELOCORIGINAL: 55864A2603AC94ACCA2568F200224388
CMCOUNTRY_ORIGIN:
CMGENRE_CODE:
**CPTITLE: INFINITE POSSIBILITIES
**CPARTIST: AMEL LARRIEUX
CPOARTISTS:
**CMCATNUMBER: 4948792
**CMAPN: 9399700067507
**CMARIAPRICECODE: C9921
**CMARIAMEDIACODE: 21
**CMARIADISTRIBUTORCODE: SMA
CMARIAPACKAGECODE:
**DMRELEASE: 19/06/2000
cMDateFormat: 19/06/2000 12:00:00 AM
DMDELETE:
cMDeleteStatus: No
**CMLISTPTRACKS: GET UP,I N I,SWEET MISERY,SEARCHIN' FOR MY SOUL,EVEN 
IF,INFINITE POSSIBILITES,SHINE,DOWN,WEATHER,MAKE ME WHOLE,GET UP (THREAD 
HAD FUN MAIN MI,GET UP (MV MIG MIX (RADIO))
CMLISTPARTISTS: ,,,
RELOCMEDIA: F73C80183A01A8D7CA2568F2002A5517
**CURMPRICE: 15.91
**CMTYPE: Compact Disc
CMRECORDCOMPANY: SONY MUSIC
CMPACKAGE:
CMARIADISTRIBUTORHOUSECODE:
cDistributorHouse:
CMLOCALE: Y
$UpdatedBy: CN=PPT/OU=AEROS/O=JUKEBOX
$Revisions: 02/06/2000 05:42:22 PM,02/06/2000 05:42:22 PM 




;- Elan [ : - ) ]




[REBOL] Contexts Re:

2000-06-04 Thread icimjs

Hi PHil,

I replaced text-fx by block-fx and bind block-fx to fx's local context
before I do it:

fx: function [x] [] [
print x
bind block-fx 'x
print do block-fx
]

block-fx: [x * x]

 x: 100
== 100

 fx 2
2
4
 fx 3
3
9


To the same thing with text-fx use: 


fx: function [x] [] [
print x
block-fx: make block! text-fx
bind block-fx 'REBOL
bind block-fx 'x
print do block-fx
]


 text-fx: "x * x"
== "x * x"
 fx 3
3
9
 fx 1
1
1
 fx 2
2
4

;- Elan

At 06:33 PM 6/4/00 +0100, you wrote:
Hi all,

can anyone help me with this simple question about contexts

Consider the following rebol program

REBOL [
Title: "Test function definition"
Date: 04-Jun-2000
File: %fx.r
Purpose: "Test function definition"
]

; define fx
fx: function [x] []
[
print x
print do text-fx
]

; Main line
text-fx: "x * x"

x: 100

fx 2
fx 3


even though I have passed the variable x into the function fx, when I "do"
the string text-fx it used the value of x from the main line.

How do I get the do function to take the value of x passed into the
function.
(I'm sure someone has told me how to this previously but I cant remember the
answer :-((  )

Cheers PHil




;- Elan  [: - )]




[REBOL] simple beginners Q: need to assign variable value to variable Re:

2000-05-31 Thread icimjs

Hi Bryce,

I'm not sure I understand your question. The way I interpret what you are
saying, the following mechanisms may prove useful.

Evaluating the following for loop 

(Note here I am using to set-word!)
 for i 1 10 1 [ print mold to set-word! join 'var [i] ]

results in

var1:
var2:
var3:
var4:
var5:
var6:
var7:
var8:
var9:
var10:

To assign a value use set

(Note here I am using to word!, not to set-word! You could also use
set-word! but its not necessary)
 for i 1 10 1 [ 
 set to word! join 'var [i] i 
 print [ 
   to word! join 'var [i] 
   get to word! join 'var [i]
 ]
   ]


Evaluating this for loop generates the following output:

var1 1
var2 2
var3 3
var4 4
var5 5
var6 6
var7 7
var8 8
var9 9
var10 10

The varN words we created are available outside of the for loop:

 var1
== 1
 var2
== 2
 var3
== 3

Or to automate the process:

 for i 1 10 1 [ print [mold to word! join 'var [i] " " get to word! join
'var [i] ] ]
var1   1
var2   2
var3   3
var4   4
var5   5
var6   6
var7   7
var8   8
var9   9
var10   10

We can unset the varNs as well:

 for i 1 10 1 [ unset to word! join 'var [i] ]

Now, var1 no longer exists

 var1
** Script Error: var1 has no value.
** Where: var1

Another mechanism that may come in handy:

Here I set the word test to the set-word! value var1.

 i: 1 test: to set-word! join 'var [i]
== var1:
 :test
== var1:

When I attempt to get the value of var1, I generate an error because var1
was not assigned a value:
 get :test
** Script Error: var1 has no value.
** Where: get :test

Now I set the value of var1 to 10. It works like this. REBOL dereferences
the word test and retrieves its value, which is the set-word! var1:. A
set-word! is like a magnet, it attaches itself to whatever value it finds
next. That value is 10:
 test 10
== 10

The word test continues to evaluate to var1, as it did before:
 :test
== var1:

We can now safely retrieve the value of var1:
 get :test
== 10

Or to illustrate it differently:

 unset 'var1
 var1
** Script Error: var1 has no value.
** Where: var1
 i: 1 test: to set-word! join 'var [i]
== var1:
 test 10
== 10
 var1
== 10

A final remark. I would normally just collect my stuff in a block, instead
of using set-words:


 for i 1 10 1 [
  append [] i
   ]
== [1 2 3 4 5 6 7 8 9 10]

or if you want to later retrieve the block:

 result-block: for i 1 10 1 [
append [] i
   ]
== [1 2 3 4 5 6 7 8 9 10]
 result-block
== [1 2 3 4 5 6 7 8 9 10]



At 12:43 PM 5/31/00 -0700, you wrote:
First let me tell you I took a C++ course(1301) years ago and haven't done
too much programing since.  I'm just installed a small LAN and am trying
to learn rebol for maitnance and fun
Now my problem...I need to make the value of var1:test1 into the name of a
new variable that can hold a value like test1:4.  Then the programs loops
and var1:test2 and I want test2:some#.  I can make the value of var1
increment I just can't figure out how to make test#:some# from var1:test#.
Thanks for any help, I looked all over the sites documentation but didn't
see what I needed...if its on there just point me in the direction to look
if its easier.  Thanks, Bryce


--

Why is College Club the largest and fastest growing college student site?
Find out for yourself at http://www.collegeclub.com





;- Elan  [: - )]




[REBOL] editor for /core here Re:

2000-05-30 Thread icimjs

Hi Volker,

I wrote this with your new editor. So, you beat me to it ;-). Well, not
really. I had something more light-weight and less capable in mind. I still
see a "market" for that.

BTW, I first had a weird bug, when I tried to run .readme. I was able to
track it down to the fact that I have my own word 'files defined in my
user.r. It's a function.

Because you ask value? 'files and only set files if it does not have a
value to a block, and because in my case 'files was set - to something
quite different - the word files was not set to a block. When you later
tried to access files/1 
if either files/1 ...
you inadvertently caused a very weird error.

I understand that you had problems putting everything in a context. That's
not surprising. Currently the use context mechanism is buggy and breaks
when the garbage collector kicks in.

Objects, however, are stable. Why not provide ed as an external function
and move everything else into an -ed object? 

The objects you use can become objects embedded in the -ed object.

Do you think that might work?

Anyway, I'm having fun using it (so far), have to learn a little more about
its commands. 
So far I've mastered .bs, .be, and .db :-)

You're right, word wrap is needed!



;- Elan  [: - )]




[REBOL] hidden variables in objects? Re:(14)

2000-05-30 Thread icimjs

Hi Jeff,

you wrote:
I wonder what Carl's thinking is
about why words default to NONE in functions, and UNSET at the global
and object contexts.  What's the deeper meaning?  

A few more fun samples, followed by a short comment:

1. Samples
 f: func [arg [any-type!] ] [ print value? 'arg ]
 f
false
 f 1
true

 f: func [ /refine arg [any-type!] ] [ print value? 'arg ]
 f
true
 f/refine
false

 o: make object! [ a: none unset 'a ]
 probe o

make object! [
a: unset
]

 type? o/a
== unset!


 in o 'b
== none
 value? in o 'b
== true

Of course. none is defined. 
Wouldn't it be better is in o 'b returned unset! instead of none?

 in o 'a
== a
 value? in o 'a
== false

because 'a in o is defined as unset!.

2. Comment
Is it really a puzzle? As soon as arguments are used as part of a function
declaration, they have entered into a state of existence and must be
initialized to some none-value. 



At 11:23 AM 5/29/00 -0600, you wrote:

  [EMAIL PROTECTED] wrote:
 The trick here is what does  SELF evaluate to  when you set 'x to
 it?  SELF at that time is an object, containing the words C and D,
 but those words haven't yet been assigned anything at the time you
 assign the word X to SELF.  

  I would assume they're unset in that stage (even if perhaps setting
 them to NONE  could make more sense  for an object,  like  it is for
 function contexts).

  Which makes me consider what are the real distinctions between NONE
and UNSET?  I tend to think that NONE, in REBOL, is closer to a
logical state, where as UNSET is more of an existential state.  For a
function, local variables defaulting to NONE eases a common question
function writers will ask in their code:

   if local-variable [do-something-with local-variable]

  I tend to think that words in the global context or in an object
context are more in an existential state. Once they are mentioned in a
given context the word exists but with no value.  They either are
filled in by the person mentioning that word in that context or not.
A word at the global context or in an object context isn't like a word
in a function context which may be changing all the time, being passed
in or not.  Those non function context variables seem more
existential. At least, that's how it all strikes me.  But. of course,
that's just my own formulation, and not necessarily the most in
keeping with REBOL's philosophy.  I wonder what Carl's thinking is
about why words default to NONE in functions, and UNSET at the global
and object contexts.  What's the deeper meaning?  There always is a
deeper purpose with most things in REBOL.  (-:

  Cheers--

   -jeff





;- Elan  [: - )]




[REBOL] hidden variables in objects? Re:(16)

2000-05-30 Thread icimjs

Hi Ladislav,

it wasn't really meant as a puzzle, just amusing. Yes, you're right:

type? in o 'b
== none!

My question regarding this behavior:

 Wouldn't it be better if in o 'b returned unset! instead of
none?

What do you think?

From a pragramatical point of view, the none return value is surely useful.
You can easily determine if the word is defined in the object.

At the same time, because 'b is not defined in o, I think it would be
cleaner, if it behaved like 'a that was set to unset!.

In the global context it does that:

1. z was never defined:
 unset 'z
 value? 'z
== false

2. y is defined and then unset.
 y: none
== none
 value? 'y
== true
 unset 'y
 value? 'y
== false


3. Summary:
a) I unset a non-defined 'z, and tested 'z using value? The result was false.
b) I set 'y to a value, and value? 'y returned true.
c) I unset 'y
d) Because of c) both 'z and 'y responded in the same way to value?.


4. In contrast, in an object, if I follow the same sequence of steps:

a) I unset 'z
b) I set 'y to a value
c) I unset 'y

 o: make object! [unset 'z y: none unset 'y ]

then the two words y and z in the object's context respond differently to
value?.

 value? in o 'y
== false
 value? in o 'z
== true

We know why 'z responds with true. As you pointed out, it's because 'z was
never defined in the context of the object 'o, therefore in o 'z returns
none, and none is a defined word.

'y was first defined in object o's context and then unset. It is known in
object o's context as an unset value. 

So when I go through the same step sequence globally (a .. c), 'y and 'z
are evaluated in the same way. If I go through the same step sequence in
the object 'o, 'y and 'z are treated different from each other.

a) I think it would be preferable if 'y and 'z were treated identical in
the object's context as well, like they are in the global context.
b) I think the preferable behavior would be for REBOL to return unset! for
in o 'z

as well as for 

in o 'y

instead of returning none for 

in o 'z

and 'y for 

in o 'y.

Opinions?


It would make objects more consistent within themselves and more consistent
with the way non-defined and unset values are treated globally.



value? none
== true

Regards
Ladislav


 Hi Jeff,

 you wrote:
 I wonder what Carl's thinking is
 about why words default to NONE in functions, and UNSET at the
global
 and object contexts.  What's the deeper meaning?

 A few more fun samples, followed by a short comment:

 1. Samples
  f: func [arg [any-type!] ] [ print value? 'arg ]
  f
 false
  f 1
 true

  f: func [ /refine arg [any-type!] ] [ print value? 'arg ]
  f
 true
  f/refine
 false

  o: make object! [ a: none unset 'a ]
  probe o

 make object! [
 a: unset
 ]

  type? o/a
 == unset!
 

  in o 'b
 == none
  value? in o 'b
 == true

 Of course. none is defined.
 Wouldn't it be better is in o 'b returned unset! instead of
none?

  in o 'a
 == a
  value? in o 'a
 == false

 because 'a in o is defined as unset!.

 2. Comment
 Is it really a puzzle? As soon as arguments are used as part of
a function
 declaration, they have entered into a state of existence and
must be
 initialized to some none-value.



 At 11:23 AM 5/29/00 -0600, you wrote:
 
   [EMAIL PROTECTED] wrote:
  The trick here is what does  SELF evaluate to  when you set
'x to
  it?  SELF at that time is an object, containing the words C
and D,
  but those words haven't yet been assigned anything at the
time you
  assign the word X to SELF.
 
   I would assume they're unset in that stage (even if perhaps
setting
  them to NONE  could make more sense  for an object,  like  it
is for
  function contexts).
 
   Which makes me consider what are the real distinctions
between NONE
 and UNSET?  I tend to think that NONE, in REBOL, is closer to a
 logical state, where as UNSET is more of an existential state.
For a
 function, local variables defaulting to NONE eases a common
question
 function writers will ask in their code:
 
if local-variable [do-something-with local-variable]
 
   I tend to think that words in the global context or in an
object
 context are more in an existential state. Once they are
mentioned in a
 given context the word exists but with no value.  They either
are
 filled in by the person mentioning that word in that context or
not.
 A word at the global context or in an object context isn't like
a word
 in a function context which may be changing all the time, being
passed
 in or not.  Those non function context variables seem more
 existential. At least, that's how it all strikes me.  But. of
course,
 that's just my own formulation, and not necessarily the most in
 keeping with REBOL's philosophy.  I wonder what Carl's thinking
is
 about why words default to NONE in functions, and UNSET at the
global
 and object contexts.  What's the deeper meaning?  There always
is a
 deeper purpose with most things in REBOL.  (-:
 
   Cheers--
 
  -jeff
 
 
 
 

 ;- Elan  [: - )]






;- Elan  [: - )]




[REBOL] REBOL/View/Command guidance Re:

2000-05-30 Thread icimjs

Hi Ryan,

sounds good. 

The critical issue for me here would be to check that REBOL/Command can
work well with the serial drivers you are using.

Since in Linux / U*x systems, serial drivers are implemented as special
files (if my memory serves me well, it's been ~ 15 years since I did serial
programming on u*x  machine), even REBOL/Core should be able to handle it
using non-buffered file ports. That shouldn't be a problem, but I'd test it
anyway.

In MS OSs you would have to access the serial port through a dll. And this
may be a little tougher to get right. REBOL's event-driven environment does
not scale well to IRQ driven, or polling driven Serial I/O. Haven't played
with Serial ports since Win 3.x, so again, my advice may be antiquated.

If you run into problems, you may want to try using one of the thoroughly
tested serial i/o libraries for MS Win, compile a dll application that does
the low-level serial i/o stuff, and use REBOL/Command to interface with the
dll.

At 12:04 PM 5/30/00 -0700, you wrote:
I need some guidance as to whether REBOL/View/Command has the
capabilities for an upcoming project.

A friend of mine is going to migrate a Visual BASIC security system
product to another language and maybe even from the Win9x platform.
This is a good time for him to learn REBOL, that is if REBOL/View and
REBOL/Command will be able to handle the problem at hand.

The system will need to communicate to two other devices via the serial
port. I assume REBOL/Command will do that with the help of some serial
driver programs.

It needs to run solely with a touch screen interface, which operates
like a mouse. REBOL/View should do this job I suppose.

There needs to be the ability to have multiple terminals/clients, which
run of a single server.  I expect that REBOL/Command could help us
there, since I could do that with REBOL/Core.

I assume REBOL/View can work as a client to REBOL/Command.  REBOL/View
being a visual version of REBOL/Core and REBOL/Command being a binary
executing version of REBOL/Core (amongst other things).

Am I on the right track here?  Will REBOL do this?

--Ryan




;- Elan  [: - )]




[REBOL] editor for /core here Re:(2)

2000-05-30 Thread icimjs

[REBOL] editor for /core here Re:(2)

Hi Volker!

you wrote: 
[snipped quite a few things I cannot respond to right now. Later ...]
 
Thanks for testing, whish-list, other feedback :)
i have more fun working on it now :)

Since you appear to respond quite reasonably to my observations, here's more ;-)

(BTW, I've been using the editor on and off all day. Ran into a few out of range
errors, but recovery apparently works quite well.)

1. I wasn't able to figure out how to load a pre-existing file. Apparently internally
the function open-t/cache filename works quite well, when you subsequently call
ed. So I wrote my own little function. 

ef: func [filename [file!]] [ open-t/cache filename ed ]

(Ok. So I basically copied your .readme function.)

and added it to files.r.

Unless I overlooked your "open existing file" macro/function, why not include it?

2. How do I tell edi to forget a file that's in the cache?

3. Apparently cached files are not remembered from REBOL session to REBOL session. 
Can I change this behavior? I.e. can I restart edi in a new REBOL session and edi
will remember the files I had opened previously?

4. tt and ^l work well enough. Very useful!

5.  Can opening of duplicate copies of the same file be prevented?

There are a few things I plan to add, as soon as I have a moment.

TIA,

;- Elan [ : - ) ] / Oh, this email was also written in edi.r. What else? ;-)
 








[REBOL] [REBOL] [REBOL] Default Port Values? Amended Re:

2000-05-24 Thread icimjs

Hi Tim,


A) Initiliazing Words?
why do you want to initialize the word port to some value before opening
it? Let us assume you did NOT initialize it. Then there are three possible
states for the word port. It does not exist yet, because the port has not
been opened. You can check for this condition using value?

  value? 'port
== false

once the word port has been assigned to some value? 'port returns true.
This value could be an open port! or something else. 

Second condition is port has been opened. Third condition is port has been
closed. Note that when a port has been closed, it still qualifies as a
value of type port!. Trying to read from or write to a closed port will
generate an error. (Maybe that is the source of some of your errors? Can
have you been trying to read from or write to a closed port, because the
port was not none?)

3 - 2

You may want to reduce complexity by dealing with two port states: exists
or open. Then, whenever you close a port, use unset to get rid of the word.
Instead of using the close function, you use the following shut function
that does it for you:

shut: func ['port] [
  if port? get port [
close get port
unset port
  ]
]

 value? 'port
== false
 port: open %file
 value? 'port
== true
 shut port
 value? 'port
== false


Of course it's more port-like (portly?) to ask the port if its open,
instead of asking it if it exists. Also, if it exists, it better reference
a port! value. Let's do that:

open?: func ['port] [
  return all [
   value? port
   port? get port
 ]
]

 open? port
== false
 port: open %file
 open? port
== true
 shut port
 open? port
== false

Using the three functions open?, open, and shut consistently, instead of
using close will narrow words referencing ports to two states. If open?
port returns true, then the word port is pointing at an open port that was
opened using open. If open? port is false, then there is no word port and -
if port previously referenced an open port - then that port has been closed. 

For instance you would say:

if open? port [safe-close port] 

and by having used open? you would be guaranteed that that the port you are
passing to safe-close is an open port, not some other type of value, not a
closed port, and it exists.

3 - 5?

When you initialize port to some non-port value, you are introducing a
fourth and a fifth state for the word port, in addition to the three
default states. 

Besides being 
1. existent/non-existent
2. open
3. closed

the word port can now also be
4. none
5. a type that is not port!. (namely none!)

1. A function may fail because it expects a port! type value, BUT it is
passed the word port when it references the value none, i.e. a none! type
value. 

2. A function may fail because the having checked for none, it determines
that the value of port is NOT none, and it now attempts to access the port.
BUT the port - even though it is not none - is closed, not open, and
accessing it generates an error message.

My personal preference is to reduce complexity. Two states suits me better
than five.

If I thought that declaring values before using them is important, I would
certainly prefer none over an empty block. A value set to none can easily
be identified using if or either, because none evaluates to a logical false
value. An empty block evaluates to a logical true value. It complicates
matters.

With respect to your example code, be sure to use a uniform function
interface. It does not help you, if you test for the types of arguments
occassionally and not consistently. 

In the following example you note that once you do and once you don't get
an error message. Apparently you overlooked that in one function you are
checking for the type of the argument being passed and in the other version
of the function you do not:

  argument is type checked here:
 |
 |
With type checking:safe-close: func [p[port!]][if p [close p]]

Without type checking: safe-close: func [p][if p  [] [close p]]
 |
 |
   No type checking here

You comment saying:

lets say  
dufus: none
safe-close dufus
generates
Script Error: safe-close expected p argument of type: port


The error message is reporting that your safe-close function is checking
for the type of the passed argument. You require that the argument be of
type port! 
safe-close: func [p [port!]] ...
but you are passing a value of type none!
Therefore you get the error message. You would be getting the same error
message, if you used [] instead of none with this version of the safe-close
function, because you would be passing a value of type block!, while this
version of safe-close expects a value of type port!. block!  port!


HOWEVER:
if I write 
safe-close: func [p][if p  [] [close p]]
dufus: []

[REBOL] refinements Re:

2000-05-24 Thread icimjs

Hi Michael,

here's another idea:

1. Use refine-func instead of func to create a function.
2. Use call-with-refine to call a function with refinements.

Example:

Given the function f:
f: func [/a /b /c][if a [print 'a] if b [print 'b] if c [print 'c]]

You can create a calling function g:
g: refine-func [/a /b /c] [ call-with-refine f refinements ]

Such that:
 g
== false
 g/a
a
== false
 g/b
b
== false
 g/c
c
== false


Here are the two functions refine-func and call-with-refine:


refine-func: func [spec body /local refinements] [
  refinements: make block! length? spec
  foreach word spec [
if all [
 refinement? word 
 word  /local
   ]
[
  append refinements to word! word
]
  ]
  insert body compose/deep [
refinements: make block! 0 
foreach word [(refinements)] [
  if get :word [ append refinements word ] 
]

  ]
  either found? find spec /local [
append spec 'refinements
  ][
append spec [/local refinements]
  ]
  return func spec body
]

call-with-refine: func [:f ref-block [block!] /local g] [
  g: make path! compose [f (ref-block)]
  g
]

Oh, by the way, the function defined as

g: refine-func [/a /b /c] [ call-with-refine f refinements ]

ends up looking like this:

 source g
g: func [/a /b /c /local refinements][
refinements: make block! 0
foreach word [a b c] [
if get :word [append refinements word]] call-with-refine f
refinements]


At 12:50 PM 5/24/00 -0700, you wrote:
A while back a message was posted to the list (can't find it now) about
wanting to loop on the refinements specified to a function, without an 'if
for each one. I've finally come up with a reason to do something similar: I
want to pass all of the given refinements to another function. That is:

- I call func A, giving some refinements
- func A calls func B with all of the refinements given to func A

I have been doing the 'if thing on each possible refinent of A and
performing a different (hard-coded) call of B with each different
refinement, but this would get messy if I were to specify more than one
refinement at a time. I have found an "automatic" way of building the
funcname/refinement string, but I haven't found any "slick" way of doing it.
BTW the code below could be improved by recognizing only refinement! from
the first func block. However, I haven't decided whether I even want to use
it.

f1: function [/a /b /c][local1 local2 local3][
   ; Calls function F2 with the refinements given to this function
   ; MUST define [local1 local2 local3] (exactly) as locals to this
function
   local3: :f1
   do bind refine 'local1
   do join "f2" local1
]

f2: func [/a /b /c][if a [print "a"] if b [print "b"] if c [print "c"]]

; Then, somewhere in the code specify the block:
refine: [
   local1: make string! length? first :local3
   ; Assume that no other parameters were specified
   repeat local2 length? first :local3 [
   if true = get bind to-word pick first :local3 local2 'local1
   [append local1 join "/" pick first :local3 local2]
   ]
]

; Example use:
 f1/b
b
== none
 f1/b/c
b
c
- Michael Jelinek




;- Elan  [: - )]




[REBOL] [REBOL] Default Port Values? Re:

2000-05-23 Thread icimjs

Hi Tim,

1. safe-close:

similarly a function like
safe-close: func [p[port!]][if p [close p]]

generates an error message.

Since you only permit port! as the argument's datatype, and none is of type
none! and not port!, you shouldn't be too surprised! ;-)

Try 

safe-close: func [p[port! none!]][if p [close p]]

 safe-close: func [p[port! none!]][if p [close p]]
 safe-close dufus-pointer
== false

2. equal? dufus-pointer none ...
max's idea, to use port?, should certainly work (and is the cleaner way to
do it anyway).

It bothers me, however, that your code fails. The code you present should
work as expected, as can easily be tested in the REBOL shell:

 dufus-pointer: none
== none
 equal? dufus-pointer none
== true

I can think of three reasons why this could happen:
1. the error is not being generated by the code you presented;
2. dufus-pointer is being set (unexepctedly!) to some non-port value
somewhere in your program. This possibility should worry you! ;-)
3. One of the two none values is not a none value. It is a word value. For
instance:
 a: none
== none
 b: first [none]
== none
 none? a
== true
 none? b
== false
 type? a
== none!
 type? b
== word!


At 08:44 PM 5/22/00 -0800, you wrote:
I'm sending this again Are we having problems with
the mailing list again?
==
I'm setting up an object that contains some ports,
which may or may not be open. 
i.e.: may or may not open "test.txt"
  may or may not open "dufus.txt"
obviously I don't want to attempt to close
what I didn't open.
If I initialize a word to none
as dufus-pointer: none
and don't open it.
the following code:
either equal? dufus-pointer none [][close dufus-pointer]
  generates an error: expected argument of type: port

similarly a function like
safe-close: func [p[port!]][if p [close p]]

generates an error message.

How can I get around this?


Thanks Folks!
Tim




;- Elan  [: - )]




[REBOL] [REBOL] Default Port Values? Re:(3)

2000-05-23 Thread icimjs

Hi Tim,

Here
safe-close: func [p[port!]][if p [close p]]

you are insisting that the argument to safe-close must be a value of
datatype port!, [ p [port!] ]. Therefore you get an error message, whenever
you pass a value that is not of type port!.

In contrast, here

safe-close: func [p][if p  [] [close p]]

you are not declaring a type restriction on the values passed to
safe-close, [ p ]. Accordingly, safe-close does not complain that the value
is not of type port!. 

Confusing? Not really.

At 08:22 AM 5/23/00 -0800, you wrote:
Hi Ladislav:
   Yes, your code works for me. But I wrote a function
as follows:
safe-close: func [p[port!]][if p [close p]]
lets say  
dufus: none
safe-close dufus
generates
Script Error: safe-close expected p argument of type: port
HOWEVER:
if I write 
safe-close: func [p][if p  [] [close p]]
dufus: []
safe-close dufus
I get no error message.
:) Duh!! I know I have lots to learn yet.
Thanks
Tim
Sorry, I don't understand. For me your code works:

 dufus-pointer: none
== none
 either equal? dufus-pointer none [][close dufus-pointer]


Ladislav






;- Elan  [: - )]




[REBOL] loading objects Re:

2000-05-23 Thread icimjs

Hi RChristiansen,

1. The load function returns a block containing whatever is in the file.
When you load an object, you get a block that looks something like this:

[ make object! [some-word: some-value some-other-word: some-other-value ...] ]

This block consists of two words: make and object!, and an unrelated block
of set-words and values.

The contents of the block must be converted into an object and extracted
from the block.

You have two choices:

1. Using do

If you do the block, the contents of the block are evaluated, REBOL
identifies its contents as an expression that creates an object, and
creates and returns the created object.

object: do load %object.txt

2. Using reduce
If you have a file that contains several objects, you have the option of
using reduce. The reduce function also evaluates the expressions contained
in the block. In contrast to do it returns a block containing the evaluated
expressions. The three elements, word make, word object!, block
[ make object! [some-word: some-value some-other-word: some-other-value ...] ]

are evaluated and what is returned by reduce is a block containing an object:

[ make object! [some-word: some-value some-other-word: some-other-value ...] ]

Here:
 loaded-block: [ make object! [some-word: "some-value" some-other-word:
"some-other-value"] ]
== [make object! [some-word: "some-value" some-other-word:
"some-other-value"]]
 length? loaded-block
== 3
 first loaded-block
== make
 second loaded-block
== object!
 third loaded-block
== [some-word: "some-value" some-other-word: "some-other-value"]
 reduce loaded-block
== [
make object! [
some-word: "some-value"
some-other-word: "some-other-value"
]]
 length? reduce loaded-block
== 1
 first  reduce loaded-block
 print mold first  reduce loaded-block

make object! [
some-word: "some-value"
some-other-word: "some-other-value"
]

3. I hope you don't mind a few other comments:

To retrieve a directory listing, you can use the simple expression 
load %file-system-path

In your case:

absolute-path: %/absolute/path/articles/

foreach file load absolute-path [
  if not dir? file [
article: do load join absolute-path file
print article/headline
print articel/subheadline
  ]
]

The line 
if not dir? file
is only necessary if absolute-path could contain subdirectories.

Hope this helps


;- Elan  [: - )]




[REBOL] installing Rebol as CGI application under PWS/Win32 Re:

2000-05-21 Thread icimjs

Hi Christian,

PWS is a little weird. I don't recall that anyone was able to successfully
install REBOL as a CGI client under PWS (may have missed it), whereas I do
recall periodically seeing messages that complain about PWS. 

My recommendation: use Apache. You can download your free copy of Apache
from http://www.apache.org.

If you have problems getting Apache to run, let me know. I have an old
email that describes Apache configuration under MS Windows. 

At 04:36 PM 5/21/00 +0200, you wrote:
Hello,

I am having a problem installing Rebol under PWS. In the registry, I added a
key ".r" under
HKLM/System/CurrentControlSet/Services/W3SVC/Parameters/Scriptmap with the
value "c:\rebol\rebol.exe -cs %s %s"
Now when I place a .r file into my cgi-bin directory and try to call it, I
always get the message that the script returned incomplete headers. I also
tried to output "Content-type: text/html" manually, but this didn't change
the result. Any pointers?

Regards
Christian






;- Elan  [: - )]




[REBOL] [REBOL]Finding characters in strings/Comparing Re:

2000-05-17 Thread icimjs

Hi Tim,

you wrote:
[...]
I would love to see some input and discussion as to what 
is the most efficient of the three functions. 
[...]

If you compare char-pos1 to char-pos2 then the only difference is that
char-pos2 adds a call to found? to char-pos1. It's probably safe to
speculate that char-pos1 should be more efficient.

if you accept that, then the field is narrowed down to char-pos1 vs.
char-pos0. You can speculate about these two, but without knowing the
implementation details of all, any and either, the degree of confidence in
the result of this speculation is a little lower.

As a matter of principle, either accomplishes what the combined any and all
accomplish. At face value I tend to think that char-pos1 should be more
efficient, since it consists of one (native) function call, where the
combination all/any requires two function calls. I doubt that any and all's
implementations can be that much more efficient than either's
implementation, that parsing and calling any and all would still be more
efficient than a single parse/call to either.

If you compare this speculation to some (inaccurate) measurements, I appear
to be on the right track:

 start: now/time loop 100 [char-pos0 s c] print now/time - start
0:00:46
 start: now/time loop 100 [char-pos1 s c] print now/time - start
0:00:42
 start: now/time loop 100 [char-pos2 s c] print now/time - start
0:00:54



I wouldn't consider readability to be an issue, because
this would not be a function that would need any maintenance.

Here goes:
char-pos0: func [str [string!] ch [char!] /ndx]
[
  any[all [ndx: find/case str ch index? ndx] 0]
]
char-pos1: func [str[string!] ch[char!] /local result]
[
   either result: find/case str ch [index? result] [0]
]
char-pos2: func [str[string!] ch[char!] /local result]
[
   either found? result: find/case str ch [index? result][0]
]




;- Elan  [: - )]




[REBOL] CGI Error Re:

2000-05-17 Thread icimjs

Hi Louis,

you wrote:
I'm having trouble getting set up.  What is causing the following error 
message?  I it caused by me or my ISP?

Many thanks in advance.
Louis

CGI Error
The specified CGI application misbehaved by not returning a complete set of 
HTTP headers. The headers it did return are:

If this is the complete error message, then the Content-type: text/html is
not being reported. Provided that your script does print the string
Content-type: text/html before it outputs anything else, at least that
string should appear in the reported headers. If the first thing being
printed by your script is the Content-type ... thing, and the error you
report is the complete text of the error reported by your ISP, then at
least something is wrong with their error reporting mechanism. 
1. Perhaps their error reporting mechanism has a bug and is suppressing the
Content-type header? 
2. Or their bug is that they are missing the Content-type header you are
printing, and therefore they report that they did not receive any headers? 
3. Perhaps they should not be displaying an error at all? 
4. Perhaps something is wrong with your configuration on their machine and
therefore the Content-type header you are printing is not reported to them?

Do you happen to know their configuration? What OS are they using? Webserver?



;- Elan  [: - )]




[REBOL] CGI Error Re:(3)

2000-05-17 Thread icimjs

Hi Louis,

a little off-topic, but it is more efficient to collect your output in a
string and print the complete string in one go, using a single call to
print. Like so:

output: make string! 1000

insert output {Content-Type: text/html^/^/
htmlbodyh2Results:/h2}

cgi: make system/standard/email decode-cgi system/options/cgi/query-string

either all [
 email? try [cgi/to: load cgi/to]
 email? try [cgi/from: load cgi/from]
][
 append output "B Sending Email to cgi/to /B"
 send/header cgi/to cgi/content cgi
][
 append output  "BInvalid email to or from address/B"
]

print [output "/bodyhtml"]




At 07:32 PM 5/17/00 -0500, you wrote:
Here's the script:

#!rebol -cs

REBOL [
 Title: "Sends Email via CGI Form"
 Date:  20-July-1999
 File:  %cgiemailer.r
 Purpose: {
 Uses a Web form to send an email message.
 }
]

print "Content-Type: text/html^/^/"  ;-- Required Page Header

print "htmlbodyh2Results:/h2"

cgi: make system/standard/email decode-cgi system/options/cgi/query-string

either all [
 email? try [cgi/to: load cgi/to]
 email? try [cgi/from: load cgi/from]
][
 print [B "Sending Email to" cgi/to /B]
 send/header cgi/to cgi/content cgi
][
 print "BInvalid email to or from address/B"
]

print "/bodyhtml"

And here is the HTML:


HTML

HEAD
 META HTTP-EQUIV="Content-Type" CONTENT="text/html;CHARSET=iso-8859-1"
 TITLEuntitled/TITLE
/HEAD

BODY BGCOLOR="white"

FORM ACTION="http://worldmerchantltd.com/www/cgi-bin/cgiemailer.r" 
METHOD="GET"
H2FONT FACE="Arial, Helvetica"Send an Email Message:/FONT/H2
P
TABLE BORDER="1" CELLSPACING="1" WIDTH="75%" BGCOLOR="silver"
 TR
 TD WIDTH="9%" BGCOLOR="#3C6F99"
 P ALIGN="RIGHT"BFONT COLOR="white"To:/FONT/B
 /TD
 TDINPUT TYPE="TEXT" NAME="to" SIZE="40"/TD
 /TR
 TR
 TD WIDTH="9%" BGCOLOR="#3C6F99"
 P ALIGN="RIGHT"BFONT COLOR="white"From:/FONT/B
 /TD
 TDINPUT TYPE="TEXT" NAME="from" SIZE="40"/TD
 /TR
 TR
 TD WIDTH="9%" BGCOLOR="#3C6F99"
 P ALIGN="RIGHT"BFONT COLOR="white"Subject:/FONT/B
 /TD
 TDINPUT TYPE="TEXT" NAME="subject" SIZE="40"/TD
 /TR
 TR
 TD WIDTH="9%" BGCOLOR="#3C6F99"
 P ALIGN="RIGHT"BFONT COLOR="white"Message:/FONT/B
 /TD
 TDTEXTAREA NAME="content" ROWS="10" COLS="40"/TEXTAREA/TD
 /TR
/TABLE
/P

PINPUT TYPE="SUBMIT" NAME="Submit" VALUE="Send Message"
/FORM

/BODY

/HTML

At 04:07 PM 5/17/00 -0700, you wrote:
Louis wrote:
  CGI Error
  The specified CGI application misbehaved by not returning a complete 
 set of
  HTTP headers. The headers it did return are:

Is your script printing a Content-type header as the first thing it
does, followed by a blank line?

print "Content-type: text/html^/^/"

Kev


Kevin McKinnon, Network Engineer [EMAIL PROTECTED]
Sunshine Communications http://www.sunshinecable.com

PGP Public Key: http://www.dockmaster.net/pgp.html   PGP 6.0 www.pgp.com




;- Elan  [: - )]




[REBOL] two-digit return of now switches Re:(3)

2000-05-09 Thread icimjs

Hi RChristiansen,

you wrote:
This doesn't work...

month: to-string now/month
if (length? month  2) [insert month "0"]

** Script Error: Expected one of: string! - not: integer!.
** Where: if (length? month  2) [insert month "0"]

Try:

 if (length? month)  2 [insert month "0"]
== "5"

How come?

Since you ask:

1.  is polymorph:

String comparison:

 "1"  "2"
== true

When the left argument to  is of type string,  expects the right argument
to be of type string as well. 

2. Precedence: 
The  is evaluated first, then the length? operator. Example:
 "123"  "1234"
== true
 length? "123"  "1234"
** Script Error: length? expected series argument of type: series port tuple.
** Where: length? "123"  "1234"

What's the complaint? First "123"  "1234" is evaluated and returns true.
Then length? is applied to true. We are applying length? here to a boolean
value. 

Accordingly, this does not work:

 length? "123"  10
** Script Error: Expected one of: string! - not: integer!.
** Where: length? "123"  10

Precedence,  is applied before length? Polymorphism,  detects that its
left argument is a string, and therefore expects the right argument to be a
string as well.

But this does work, because we force length? to be applied first and 
detects an integer left and expects an integer as its right argument:

 (length? "123")  10
== true



;- Elan  [: - )]




[REBOL] Question on Wait Re:

2000-05-09 Thread icimjs

Help wait agrees with your observation. It reports

 help wait
ARGUMENTS:
 value -- (Type: number time port block)

No mention of date. 

At 10:46 AM 5/9/00 -0800, you wrote:
Hello,

The following is taken from the Rebol Dictionary, describing WAIT.


If the value is a TIME, delay for that period.
If the value is a DATE/TIME, wait until that DATE/TIME.
If the value is an INTEGER or DECIMAL, wait that number of seconds.


Testing with TIME and INTEGER works fine.


 forever [print now/time wait 60 print now/time break ]
10:18:33
10:19:33
 forever [print now/time wait 00:01:30 print now/time break ]
10:20:12
10:21:43

However when i try to specify a DATE/TIME, i get the following


 forever [print now/time wait 9-May-2000/10:30:00 print now/time break ]
10:24:08
** Script Error: wait expected value argument of type: number time port
block.

The error seems to suggest that WAIT only expects a TIME and not a DATE?
Am i missing something?

Thanks.

Mike.






;- Elan  [: - )]




[REBOL] tuple math Re:

2000-05-08 Thread icimjs

Hi Bob,

since make tuple! [1] generates 1.0.0, I think that a good way of handling
it would be to change the highest order.

 make tuple! "1"
== 1.0.0
 make tuple! [1]
== 1.0.0

Elan

At 03:38 AM 5/8/00 +, you wrote:
 REBOL 2.2.0.4.2
...

 a: 192.9.200.211
== 192.9.200.211
 a + 1
== 193.10.201.212


what justification is there to changing
-all- the integer fields? I expected at most to
change either the highest order or the lowest order
integer field by this operation - not all of them.


 a: 192.9.255.1
== 192.9.255.1
 a + 1
== 193.10.255.2
 a + 0.0.1.0
== 192.9.255.1

humm, neither of these does what I expected.
What I was looking for was some form of carry propagation. 


Now there are 2 contexts that I consider using tuples for:
IP addrs and version numbers. I would welcome the list to show
some alternate uses for them. [big math like bigint seems out -- too bad]

As internet addresses, I can reasonably stay away
from adding + 1 and instead use 0.0.0.1 to get the next higher IP
addr to try.   The lack of carry is probably not going to be discovered
by other programmers using them for IP because 255 becomes a 
broadcast address in most systems so logic is likely
in place [I hope others remember to look...] before this value
is taken on.

no wrap or carry?
My gut tells me it is wrong to have to check
my results after every addition.

so here is what I am looking for:
- an example of a use for the current behavior which warrants
adding math checks to all other uses.




;# mailto: [EMAIL PROTECTED]




;- Elan  [: - )]




[REBOL] how can i... Re:

2000-04-17 Thread icimjs

Hi -= usaps jeronimo =-,

there are two ways your CGI script can receive form input. Through the
input function or through system/options/cgi/query-string.

Which is used depends on whether the form submits its data using GET or
POST. Only when GET is used  the form's data becomes available in
system/options/cgi/query-string. If PUT is used you must use input.

Which request method was used can be determined by retrieving the value of
system/options/cgi/request-method.

There is a function available on www.rebol.org user contributed scripts
that automates that automates the process.


At 05:37 PM 4/17/00 +0200, you wrote:

hi! everybody... i'm really new in this stuff.

i'm trying to make rebol work with html forms, an the thing is:

** Script Error: decode-cgi expected args argument of type: any-string. **
Where: cgi: make object!
decode-cgi system/options/cgi/query-string

i cannot go futher, from this error...

if i ask the value for:
system/options/cgi/query-string

is equal to none (but i don't know what value i need)


can somebody help me!

thank in advance.

--

-= usaps jeronimo =-







;- Elan  [: - )]




[REBOL] webbanner.r help Re:(3)

2000-04-16 Thread icimjs

Hi Ryan,

you wrote:
OK, so in the following function...

make-banner: func [/ad adnumber /local url img alt] [
set [url img alt] skip banner-db either ad [ 
adnumber - 1 * 6
][
random (length? banner-db) / 6
]   
rejoin [{a href="} url {"IMG SRC="} img {" ALT="} alt {" 
target"_blank"/a}]
]

...how does adnumber get its value and what is the purpose of the 
adnumber word?


Function specification:

when you specify a refinement in a function - /ad - then you can associate
an argument with that refinement - adnumber. The make-banner function can
be called either without a refinement and without an argument, or with the
refinement /ad, in which case you must supply an argument for adnumber. The
argument adnumber is initialized to the value with which you call
make-banner, when you call make-banner with the /ad refinement:

make-banner ;- no refinement, no argument

make-banner/ad 6 ;- with refinement, with argument

The role of adnumber.

The function subtracts 1 from the adnumber and mutliplies the result with 3
(not 6 as in your example!).

The value 3 is the length of each record in the block. The adnumber which
is passed to make-banner is index of the first field of the record. Since
the function uses skip to locate the three fields it wants to use - url,
img alt - you must subtract 1 from the index. If the function is called
with the index 1, the first record in the block (consisting of three
fields) has to be displayed. The skip function will skip (adnumber = ) 1  *
3 (= record length) = 3 fields. That would position you at the second record. 
So you subtract 1 
(adnumber =) 1 - 1 * 3 (=record length)
1-1 * 3 = 0 * 3 = 0. You skip 0 fields and set [url img alt] will set the
three local variables to the first three fields in the block. The url word
will be set to the url of the site, the img will be set to the path of the
image that is to be displayed, and will set to the string which is
displayed while the image is being loaded, or continues to be displayed if
loading the image fails.

When you call make-banner/ad 2, you want to displaye the second record. 
2 - 1 * 3 = 1 * 3 = 3

The skip function will skip 3 fields and s

et will load the three local variables to the three fields beginning at the
fourth field, which is the url of the second Web site, followed the image
file's path, followed by the string that is displayed by the Web browser as
the alt string.

BTW, all arguments that precede any optional refinements are mandatory
arguments, arguments that follow refinements are associated with their
respective refinement, until another refinement is detected, or until the
/local word is detected which introduces words that are local to the function.

f: func [mandatory-arg-1 mandatory-arg-2 
/refinement refinement-arg
/local local-word] [ do-something-real-smart-here ]

This function may be called with two arguments

f arg-1 arg-2

or with two arguments, the refinement, and a third argument associated with
the refinement:

f/refinement mandator-arg-1 mandatatory-arg-2 refinement-arg

Hope this helps,


;- Elan  [: - )]




[REBOL] webbanner.r help Re:

2000-04-15 Thread icimjs

Hi Ryan,

you wrote:
Original (with three urls in the block)

adnumber - 1 * 3
random (length? banner-db) / 3
make-banner/ad 3]

My changes (with six urls in the block)

adnumber - 1 * 6
random (length? banner-db) / 6
make-banner/ad 6]


The 3 in adnumber - 1 * 3, that 3 does not stand for number of entries in
the database. It stands for the length of a database entry, i.e. each entry
in the database consists of three items:

   http://www.schonder.com  %/graphics/bannerads/schonder.gif
   "Papier-Schonder KG office supply and bookstore"


1. the url:  http://www.schonder.com  
2. the banner file: %/graphics/bannerads/schonder.gif
3. the accomapnying text: "Papier-Schonder KG office supply and bookstore"

You added 3 more companies, fine, you therefotr changed 3 to 6 in your call
to make-banner/ad 6, that's fine, but you now have 18 entries in the
database, six records of length 3 each, and not 36 entries. But when you
call make-banner with the ad refinement, get
adnumber - 1 * 6

is 6 - 1 * 6 = 30. No wonder you get none.




;- Elan  [: - )]




[REBOL] Dumb Question Re:

2000-04-14 Thread icimjs

At 06:33 PM 4/14/00 -0400, you wrote:
I installed Rebol on a Slackware system in its own directory under
/usr/local/src. I made a link to it from /usr/local/bin.
At the command line, I typed 'export REBEL_HOME=/usr/local/src/rebol'


Perhaps replacing

export REBEL_HOME=/usr/local/src/rebol

by 

export REBOL_HOME=/usr/local/src/rebol

will help (note the capital O instead of the second capital E)?





;- Elan  [: - )]




[REBOL] [REBOL]string to series function Re:(3)

2000-04-11 Thread icimjs

Hi tim,

just-one: pick parse/all "one#two%three four" "#% " 1

or

just-one: first parse/all "one#two%three four" "#% " 


or, if want to continue collecting the complete block in my-series:

just-one: pick my-series: parse/all "one#two%three four" "#% " 1

and 
just-one: first my-series: parse/all "one#two%three four" "#% "

Note that pick is safer, it will return none if parse returns none or if
parse returns an empty block, whereas first will fail with an error
exception in both cases.



At 09:07 PM 4/10/00 -0800, you wrote:
Sterling showed me how the following code
gives me a block
 parse "one#two%three four" "#%"
== ["one" "two" "three" "four"]

that's great! Now if I write:
my-series: parse "one#two%three four" "#%"
just-one: my-series/1
just-one is returned as "one"

now how do I get "one" into just-one with 1 line
of code instead of two?

thanks again
tim





;- Elan  [: - )]




[REBOL] [REBOL]string to series function Re:(4)

2000-04-11 Thread icimjs

At 09:55 PM 4/10/00 -0700, you wrote:

Fair enough.
I have little time to give a complete course on parse so I went for
the shortest version.  

Yikes! Of course. I was worried that tim may eventually want to exclude
spaces from his parse rule, and then he'd be frustrated, because he
wouldn't know how to control space parsing. 

(Actually, I'd already written my response, and before I sent it off I
checked my email to avoid duplicate answers, and lo and behold, there was
your message. But I'd chosen a slightly different approach, and I thought
it was still worth mentioning it ...)

So he gets more than he asked for ;-).

I expected to see a few other responses to this 
thread as well and sure enough the old-time REBOL-masters of the
outside world give a more full answer than us insiders have time for.

Time? I have time? ...

Me?


Take it easy guys,
Sterling


You to Sterling.

;- Elan  [: - )]




[REBOL] [REBOL] Redefining functions with objects Re:

2000-04-11 Thread icimjs

Hi Tim,

Will 
tims-object/print 
redefine rebol's own print? 


Within tims-object print replaces the global print, which you can continue
to access using system/words/print

 tims-object: make object! [
  print: func [][ 
system/words/print "this is the global print." 
  ] 
]

 tims-object/print
this is the global print.

Outside of the object's context print is not affected by your re-definition
of print in the object.

;- Elan  [: - )]




[REBOL] fun with 'switch Re:

2000-04-11 Thread icimjs

Hi Michael,

1. The Problem
2. The Solution

1. The Problem:
 retval: curr-func
 switch retval [none [print "val-none"] "abort" [print "val-abort"]]
== none

Notice that the == none is the value returned from 'switch, not the
execution of the none block. To further illustrate:


The reason it didn't work is that

the none in a block, [none], is a value of type word! the none "as we know
and love it" is a value of type none!:

 type? first [none]
== word!
 type? none
== none!

The none in brackets is not an evaluated none. Evaluation makes the word
none a value-of-type-none! none. 

 type? do [none]
== none!
 type? do first [none]
== none!

The same is true for other values/words such as false, true, on, off.

2. The Solution:
You can do or reduce (you get the value, or a block containing the value:)

 type? first reduce [none]
== none!
 type? do [none]
== none!

To apply it to your problem. Simply reduce the block you pass to switch:

 retval: none
== none
 switch retval reduce [none [print "val-none"] "abort" [print "val-abort"]]
val-none

Hope this helps,






;- Elan  [: - )]




[REBOL] Vanilla sample-space Re:

2000-04-11 Thread icimjs

I did download your earlier version (it needed a little more configuration
than I expected).

Why not package it in the REBOL rip compressed archive format?

At 09:53 PM 4/11/00 +0200, you wrote:
Hi folks,

since Vanilla is a lil' bit awkward to deploy at the moment (eventually,
it should be download-doubleclick-deploy kind of thing, but for now it
certainly isn't), I've set up a 'playground' at

http://iw2.infowerk.co.at/cgi-bin/vanilla.r?selector=displaysnip=playground

I'm sure that there are still bright people on this world (and maybe
even on this list) who haven't been exposed to the wiki principle yet.
Everyone edits everything. It's human. There may be vandals, but usually
we know how to behave.

Over the next few days I'll enhance the extension script capability of
Vanilla, so that it will become possible to write full-fledged web
applications with it. DynaSnip-caching is waiting, too. And WML
rendering. And a 'history' aka revision control facility. Lots of
things, some even exciting. Get in touch.

Enjoy!

Chris Langreiter

_
c h r i s langreiter - - - unterlangkampfen 3 2 7
f o r m  is function -- autriche 6322 langkampfen
0 0 4 3 / (0) 5 3 3 2 / 8 7 6 0 7 c a l l - n o w
w   w   w   .  l a n g r e i t e r  .   c   o   m

There are three kinds of lies:
lies, damn lies, and statistics.
--Benjamin Disraeli





;- Elan  [: - )]




[REBOL] official guide, again Re:

2000-04-10 Thread icimjs

Coming soon. Not available yet.

At 07:51 PM 4/9/00 -0500, you wrote:
I see bn.com lists REBOL: The Official Guide as "available" and "ships 1-2 
weeks" 

Weird. Must be a bug.

while amazon.com says "this title is not yet available." 

They know what they are talking about.

Meanwhile, 
the chapters previously posted in the McGraw-Hill Bet@ Books section are 
non-existant.

Hmmm, I wonder why.


Is the book available yet, or not?


No, but soon.


Thanks.




;- Elan  [: - )]




[REBOL] [REBOL]string to series function Re:(2)

2000-04-10 Thread icimjs

Hi Sterling,

one little detail: your approach works well enough with this particular
example because space is one of the desired delimiters.

Conceivably Tim may want a more universal solution that enables him to
determine whether or not he wants to include spaces in his parse rule. In
that case IMHO it would be more appropriate to use parse's all refinement
and - for the sake of this particular example - include space explicitly as
a delimiter in the rule:

With space:
 parse/all "one#two%three four" "%# "
== ["one" "two" "three" "four"]

Without space
 parse/all "one#two%three four" "%#"
== ["one" "two" "three four"]

Note that the second version returns "three four" as one string because
space is not included in the rule.

At 09:06 PM 4/10/00 -0700, you wrote:

You really ought to just try these things. ;)
You'll be surprised at what you find.

 parse "one#two%three four" "#%"
== ["one" "two" "three" "four"]
 

Sterling

 I would like to have a function to do
 the following
 1)take two strings as arguments
   a)arg one is source
   b) arg two is delimiters
 2)return a series
 
 it would work like this:
 
 my-series: string-to-series "one#two%three four" "#% "
 my-series is returned as ["one" "two" "three" "four"]
 
 BTW: I have a c function that does this. With
 subsequent function calls, it is about 40 lines of
 code. I'm pretty lost when it comes to parse, but
 I bet the rebol function would be shorter.
 thanks
 tim




;- Elan  [: - )]




[REBOL] Using Rebol with HTML templates, reading dynamic data -- is it possible? Re:

2000-04-10 Thread icimjs

Hi Martin,

At 11:56 PM 4/10/00 +0200, you wrote:
1. A Rebol script can be used to fetch data from a textfile and put the
data
into a HTML template, thus creating an unique web page? In this way one may
render lots of documents of the same kind, but with unique data, such as a
list of products where each product is linked to a script-generated
information page?

That is correct. This can be done offline, i.e. creating static webpages.


2. A Rebol script can be used in the way above, but on the server side,
reading data from a text file for input to the HTML template. In this way,
Rebol may serve the same function as Visual Basic or Javascript within an
Active Server Page?

Absolutely.


3. Which one of the two above methods is preferred -- rendering unique web
pages with a script or having the script read data "on the fly" thus
providing dynamic web pages?

It depends on what you are trying to do, what resources are available on
your machine and how many hits you expect to process.


As a rule, static Web pages are of course less resource hungry and more
stable. I would only use dynamic Web pages if the data changes often enough
to justify the additional overhead on the server side. Or if the ratio of
expected number of hits vs. the resources available on the machine is
ridiculously low.


I would be really glad to get some ideas on this, and maybe even some code
that I can play around with to learn from. Thanks!


Look at Andrew's HTML Dialect in the archive at www.rebol.org.

Hope this helps,



;- Elan  [: - )]




[REBOL] [REBOL] Reading REBOL header Re:

2000-04-09 Thread icimjs

Hi,

try:

 print mold system/script/header

The objects fields will all be set to none, unless you do a script first.

At 04:37 PM 4/8/00 -0800, you wrote:
According to rebol documentation, the 
rebol header is an object.

If so, how does the rest of the script file
access the header?

Given the following code:

REBOL
[
Title: "Scan Web Sites"
Date:   12-Nov-1997
Author: ["Ema User" "Wasa Writer"]
]
print REBOL/Title
; the line above generates the error message:
** Script Error: Invalid path value: Title.
** Where: print REBOL/Title

what would be the correct syntax.
Thanks
Tim




;- Elan  [: - )]




[REBOL] parse / space Re:(3)

2000-04-06 Thread icimjs

Hi Volker

you wrote:

At 12:41 PM 4/6/00 +0200, you wrote:
 parse "LIB1 "  ["LIB1"]
== false
 parse "LIB1 "  ["LIB1" to end]
== true
 parse "LI B1 "  ["LIB1" to end]
== false   

result says, could parse full string, or there is a rest, IMO.

that is correct and undisputed. According to the documentation parse
ignores spaces unless used with the /all refinement.

In the example

(1)
 parse " LIB1"  ["LIB1"]
== true

I demonstrate that parse w/o /all refinement indeed *ignores* spaces, at
least leading spaces.

The example

(2) 
 parse "LIB1 "  ["LIB1" (print "found it")]
found it
== true

demonstrates that parse w/o /all also ignores *trailing* spaces. 

If we leave away the expression (print "found it") and simply do

(3)
 parse "LIB1 "  ["LIB1"]
== false

the trailing space is *not* ignored. Why all of a sudden is the trailing
space not ignored? Should it be ignored?

My position is: In example (3) the trailing space should be ignored,
because the pattern matching part of the rule in (3) is no different from
the pattern matching part of the rule in (2). Since we are doing the same
pattern matching against the same input stream we should be getting the
same results. 

Should (2) return the same results as (3), or should (3) behave like (2)?
Since we are using parse without the /all refinement, and parse ignores
spaces without the /all refinement, the trailing space should be ignored in
(3) as it is being ignored in (2) and the string should be considered
completely parsed.

My guess is that (3) does not act like (2) because the termination code for
parse is incomplete in situation (3). How do (2) and (3) differ? In (2) the
rule block is *not* exhausted with the "LIB1" pattern. In (3) it is.

When parse encounters the trailing space, it still has something remaining
in the rule block, namely (print "found it"). This means that empty?
rule-block at this point will return false. Since there's still something
remaining in the rule block, parse continues to evaluate the rule-block. In
doing so, it returns to a part of the parse code that is ignore-spaces-aware.

In (3) the rule block is exhausted with the "LIB1" pattern. empty?
rule-block returns true and parse returns false because it has not reached
the end of the input stream, but it has already exhausted its rules. That
is an incorrect termination, since we are using parse without the /all
refinement, and parse should determine whether or not all remaining
characters in the input stream are spaces, before it decides whether to
return true or false. If only spaces remain, - and in our example that is
the case - parse should report true, just as it did in (2).


;- Elan  [: - )]




[REBOL] Return types Re:(3)

2000-04-05 Thread icimjs

Hi Gisle,

you wrote:

Elan's idea of being able to optionally specify return types of a
function would be nice 

Thank you. I think this email contains a rather complete return type
enforcer function (further below).

provided that all natives that can
return more than one type used it.

This is not how I meant it. An optional return type specifier would be used
by the programmer who implements his own functions and wishes to prescribe
legal return types for his function. 

Here's an example for what I mean:

This works:

 x f email@
connecting to: ...

This generates an error identifying the function f as the culprit:

 x f ftp://
** Script Error: Expected one of: return type: [email!] - not: url!.
** Where: f ftp://

Let me explain (and demonstrate below):

The return type specifier is not intended to announce which types will be
returned. Rather, it is meant to exclude certain, unlisted, types from
being returned and - instead of returning them - it will alert you to the
fact your function is returning an unexpected type that you have outlawed
in your return type specification block. 

What's that good for? In a world in which functions have polymorphic return
values, you may be returning values from one function that are subsequently
handled by a chain of other functions *without* complaints - those
functions have polymorphic parameters - until some point in time in which a
function does not support that datatype. 

It is probably time consuming to detect where in your code that value
originates, since in our scenario the immediate suspect, the function that
evaluated the failed expression, is not to blame. 

Let me illustrate with a simple example. Given the functions f, and x:

f: func [value] [ return join value ["site.com"] ]

x: func [value] [ send value "Hi" ]

The following example works:
 x f email@
connecting to: ...

The following example
 x f ftp://

in REBOL/Core generates this error:

** Script Error: send expected address argument of type: email block.
** Where: send value "Hi

Since the error message quotes the send function as the source for the
complaint we would begin to search for the problem in function x.

Consider that in a real-word situation there may be any number of functions
that mediate between f and x, 

x .. w .. v .. u .. s .. t .. .. g .. f

and functions w .. g may have no problem dealing with url! types instead of
email! types. Here we would have to review function w thru g until we
arrive in f and determine that f is the source of improper datatype because
join is return type polymorphic.

Compare the previous error message to the following one:

 x f ftp://
** Script Error: Expected one of: return type: [email!] - not: url!.
** Where: f ftp://

This error message tells you where the error originated - in f not in x -,
tells you it is a return type error, and what improper return type the
function attempted to return instead of using one of the legal choices
defined in the block.

Here is how the improved error message came about:

 f: rt-func [[catch] value /local return-type [email!]] [ 
 return join value ["site.com"] 
   ]

 x: func [value] [ send value "Hi" ]

 x f ftp://
** Script Error: Expected one of: return type: [email!] - not: url!.
** Where: f ftp://

This is the version of rt-func I used:

rt-func: func [spec [block!] body [block!]] [
  insert body compose/deep [
return: func [result /local return-type] [
  return-type: reduce [(spec/return-type)]
  either found? find return-type type? result [
system/words/return result
  ][
throw make error! reduce ['script 'expect-set 
  join "return type: " [mold return-type]
  mold type? result
]
  ]
]
  ]
  remove/part find spec 'return-type 2
  append spec [return]
  return func spec body
]

Hope this helps.

;- Elan  [: - )]




[REBOL] parse / space Re:

2000-04-05 Thread icimjs

Hi bciceron,

The short version is: I believe it's a bug.

The long version:

space at the begining of string:
 parse " LIB1"  ["LIB1"]
== true

space smack in the middle of token:

 parse "LI B1"  ["LIB1"]
== false

Now, that somehow makes sense. If I am parsing for the token LIB1 I do not
want the two tokens "LI" and "B1" separated by anything - including a space
- to qualify. Otherwise I should make white spaces separating "LI" and "B1"
part of my rule.

 parse "LIB1 "  ["LIB1"]
== false

Apparently "LIB1 " with a trailing space is treated like "LI B1" with a
space separating two parts of the token. That space is not being ignored. 

I think that's a parse bug and should be reported as such. The trailing
space should be ignored. That's because:

SPACE NOT IGNORED:
 parse "LIB1 "  ["LIB1"]
== false

SPACE IS IGNORED:
 parse "LIB1 "  ["LIB1"(print "found it")]
found it
== true

Note that I did not change the rule that determines which tokens are
recognized! I only added an instruction to print "found it" when the token
has been recognized. Since the token to be recognized has not changed, and
the string being parsed has not changed, the two previous cases should
evaluate to the same thing.


Here's another example:
 parse "LIB1 "  [some ["LIB1"]]
== true

Here I permit multiple occurences of "LIB1" in the input stream. Again the
trailing space is ignored.

My guess is that the parser does something like this:
1. Is the current character in the input stream identical to the current
character in the token? 
2. Answer to 1: No. 
   Am I ignoring spaces and current character in input stream is character?
   If Yes: increment input stream index. 
   Reset token index to beginning.
   Return to 1.
   If No: Return false

3. Answer to 1: Yes. 
   Then Increment input stream index, increment token index
4. Is the token index exhausted? Yes. Check input stream index:
5. Is there anymore stuff left in the input stream? Yes.
6. Are there anymore rules left? No.
7. Report false.

Instead, 7 should be
7. Am I ingoring spaces? Yes. Then
8. Do I encounter only spaces until string index is exhausted?
9. If 8. evaluates to YES: return true
   If 8. evaluates to NO: return false


Until this is repaired you may want to go with the some version of
lib-type, i.e.
 lib-type: [some ["LIB1" | "LIB2"] ]
== [some ["LIB1" | "LIB2"]]
 parse "LIB1 "  lib-type
== true


Hope this helps.

At 12:41 PM 4/5/00 -0500, you wrote:

parse is very powerfull but still kills me with spacer:

 parse "asergd" lib-name  
== true
 parse "LIB1"  lib-type
== true

so the 2 elements matches the 2 single rules.
but pout together they don't :

 parse "asergd LIB1" [lib-name lib-type]
== false
 probe parse "asergd LIB1" [lib-name lib-type]
false
== false
 parse/all "asergd LIB1" [lib-name lib-type]
== false

but the white space means trouble:

 parse/all "asergd LIB1" [lib-name " " lib-type]
== true

why one matches with extra white space and not the other ?
 parse "LIB1 "  lib-type
== false
 parse "asergd " lib-name  
== true
 parse " asergd " lib-name  
== true

lib-name: [name]
name: [ some symbol ]
lib-type: [ "LIB1" | "LIB2" ]
symbol: charset [#"0" - #"9" #"A" - #"Z" #"a" -
#"z" #"." #"-" #"_" #"$" #"+" ]






;- Elan  [: - )]




[REBOL] Return types Re:

2000-04-04 Thread icimjs

Hi Gisle,

why should return types be defined for functions?

At 05:14 PM 4/4/00 +0100, you wrote:

One thing that bothers me is that I can't specify a return type for
functions in REBOL. Many people consider this to be a bad idea so I'm
wondering what the idea behind this is.

There are obviously advantages and disadvantages with this, but do the
advantages really outweigh the disadvantages?

Gisle




;- Elan  [: - )]




[REBOL] Return types Re:(3)

2000-04-04 Thread icimjs

Hi Ingo,

If I'm not mistaken, both your answers touch on documentation issues, not
on function implementation.

I don't see any harm in having a type specifier as part of the function
declaration, which enforces a return type ... as long as it's *optional* ;-).

Something like:

func [ a [any-type!] b [integer!] /local ... /return [any-type!]] [
]

Perhaps with auto-conversion?

At 09:49 PM 4/4/00 +0200, you wrote:
Those were the words of [EMAIL PROTECTED]:
 Hi Gisle,
 
 why should return types be defined for functions?

Just some random thoughts on this:

1) it would be easier to guess what a function does, or how
   to use it:

compare this 

 help compress  
Compresses a string series and returns it.
Arguments:
data -- Data to compress (any-string)

to this

 help compress  
Compresses a string series and returns it.
Arguments:
data -- Data to compress (any-string)
Returns:
binary! -- Maybe with some more explanation here

which carries more information for you? How do you
use it correctly?


2) If you change the function some time later it is 
more likely that you don't introduce changes which
would break existing code.


regards,

Ingo

--  _ ._
ingo@)|_ /|  _| _  We ARE all ONE   www._|_o _   _ ._ _  
www./_|_) |o(_|(/_  We ARE all FREE ingo@| |(_|o(_)| (_| 
http://www.2b1.de/Rebol/ ._|  ._|




;- Elan  [: - )]




[REBOL] Return types Re:(5)

2000-04-04 Thread icimjs

Hi Brian,

I sure enjoy your thoughts on the subject. 
I can certainly do without typed functions, but as long as they're optional
...

Why not separate function constructors which support return type
enforcement from functions that don't? Let's say we wish to enforce types
or automatically convert types. 

This example auto-converts.

Example usage:
 f: rt-func [a /local return-type [string!] ] [return a]

Note that the return-type is entered in the /local part of the function's
specification block (cheap trick, simplifies my implementation of rt-func
somewhat).

 f 1
== "1"
 f [EMAIL PROTECTED]
== "[EMAIL PROTECTED]"
 f http://www.rebol.com
== "http://www.rebol.com"
 f 123.128.000
== "123.128.0"
 f [a b d]
== "abd"

 f: rt-func [a /local return-type [block!] ] [return a]
 f 1
== [1]
 f [EMAIL PROTECTED]
== [[EMAIL PROTECTED]]
 f http://www.rebol.com
== [http://www.rebol.com]
 f [a b d]
== [a b d]

Later we go into production and want to optimize for speed (no
auto-conversion).
We set rt-func to func:

 rt-func: :func

and now our functions behave normal:

 f: rt-func [a /local return-type [string!] ] [return a]
 f 1
== 1
 f [EMAIL PROTECTED]
== [EMAIL PROTECTED]
 f http://www.rebol.com
== http://www.rebol.com
 f 123.128.000
== 123.128.0

The function rt-func could look something like this 
DISCLAIMERS
Warning this is not production quality code. Just a rough draft, to get an
idea. Does not support results of type object!:
 f make object! [a: none]
== "?object?"
"Things that can't be converted are not handled intelligently!" (TM)
Probably there are other exceptions.
A more careful approach would be to first check whether the function
prototype contains the return-type word ...



rt-func: func [spec [block!] body [block!] ] [
  insert body compose/deep [
return: func [result /local return-type] [
  return-type: (spec/return-type)
  system/words/return to return-type result
]
  ]
  remove/part find spec 'return-type 2
  append spec [return]
  return func spec body
]



At 04:56 PM 4/4/00 -0500, you wrote:
Hi Elan,

You wrote:
 I don't see any harm in having a type specifier as part of 
 the function declaration, which enforces a return type ...
 as long as it's *optional* ;-).

How would this be enforced in an interpreted language that
creates its functions at runtime?

Testing for return type at function creation time would need
a type-inference engine to determine the type. Type inference
is too slow to do at runtime.

Type inference could not possibly be complete, since any function can be
called via REBOL console. How do you infer the type of user input?


Testing for return type at function execution time would add
an type-checking exception after the end of the function block.

The only possible solution.

The function code wouldn't be able to handle such an exception,
so it would have to ensure that the error couldn't occur using
internal error-checking code, which would mean that the built-in
return type-checking code would just be overhead.

Sure would. 


 Something like:
 
 func [ a [any-type!] b [integer!] /local ... /return [any-type!]] [
 ]

 Perhaps with auto-conversion?

I noticed that you put the return type you listed was in a block.
Blocks are used for the other types so that multiple types could
be specified. If multiple types are specified, which type do you
auto-convert to? 

First one by default.

What about conversions that aren't so automatic?


Too bad.

Functions in REBOL are often polymorphic, returning types that
depend on the types or values of their arguments. 

Which is the reason I don't quite see why return type checking is so
important.

Any conversion
or type checking in such an environment is better done manually.
It's usually faster too, because you can remove tests where they
aren't needed.

See above.


A type inference engine would be a great development-time tool
to check your code before release, though. It would be a good
thing to have for documentation too.

Perhaps, when I have a little more time.



Wanna write one? ;-)
Brian




;- Elan  [: - )]




[REBOL] Dialecting Re:

2000-04-03 Thread icimjs

Hi,

you wrote:
How is dialecting different from defining a new word in
Forth?  

Dialecting goes beyond just extending REBOL's vocabular. It permits you to
also define your own syntactic structures (i.e. language grammar).

How does this make REBOL better than any language
which allows you to define new words?

Some differences between REBOL and languages that allow you to define new
words:
1. There are now holy cows, i.e. keywords. REBOL allows you to define new
words as well as any word from REBOL's existing vocabulary to be anything
you want.

2. Using REBOL's dialecting support, you can also define new syntactic
structures.

3. Using contexts you can precisely control under what circumstances your
new word definitions/syntactic structures become affective, without
impacting REBOL's default vocabulary and behavior.

4. Based on contexts you can freely mix REBOL's default behavior and any
number of dialects.

Example: See the CID dialect that is shipping REBOL/View beta

Hope this helps,


;- Elan  [: - )]




[REBOL] [REBOL]Problem with function argument Re:(3)

2000-04-02 Thread icimjs

Hi t,

A file! type is a filename with a leading % character. Example: %myfile.r
%/c/mydir/. A file! may be any type of file, including a directory.

A port! datatype is a low-level i/o abstraction that REBOL uses to
serialize different types of i/o channels, such as files (here we are not
talking about the filename, but access to the file's contents), and socket
i/o. 

The access to ports is typically controlled by protocols that define how
information is read and written to a port, and also commonly implement some
convenient navigation functions for the port's datastream, such as first,
next, insert, pick, etc. These functions work in a sensible way on a port!
datatype. They enable you to treat ports as though they were series values
(i.e. blocks, paths, hashes ...) to a degree, hence the term serialize is
used to describe this type of access to i/o channels. 

There are some limitations, since not all ports lend themselves to being
treated as a series effectively with respect to all series! functions.

I haven't been following this thread, so I don't know why you are using
ports. Generally speaking, it is often more convenient to use higher level
functions when dealing with files, then accessing them as ports. read,
write, read/lines, write/append write/lines, write/append/lines, save,
load, come to mind. All of these functions take a filename (type file!),
and do not require that you manage the file on the port level, for instance
with respect to positioning, etc.


Hope this helps.



;- Elan  [: - )]




[REBOL] Newbie question #2 - Pattern making and using? Re:(11)

2000-04-02 Thread icimjs

Hi Gabriele,

thanks for posting this to the mailing list. 

In general I would appreciate it if questions that are probably of general
interest be posted to the mailing list, since we can all learn from the
questions as well as the answers.

At 12:00 PM 4/2/00 +0200, you wrote:
Hello jb!

On 01-Apr-00, you wrote:

[Forwarding to the list]

 j Gabrielle,

Just one "l"... :-)

 j For the past two months when I have the time to review the
 j rebol posts, I've appreciated reading your succint, thoughful
 j and clear examples. Thankyou. Your method outlined below is a
 j fine example of this. You are both an excellent teacher and
 j certainly you must be a world class programmer ! :-

Thank you. You're surely exaggerating --- I'm just a student! :)

 j Perhaps you will be so kind as to provide urls for the best
 j examples of pattern matching techniques for REBOL? For

I think you can find a lot of examples on rebol.org. I've written
a site-saver too (downloads an HTML document plus all of the links
etc.); it still needs some work, so I didn't publish it yet, as
you can get a couple of other script doing the same job on
rebol.org, but if you're interested...

 j example, let's assume a useful utility will crawl through a
 j web site and gather only the links on the site saving them to
 j a file, how does a good rebol programmer think about and then
 j execute the following:

 j find all instances of the following pattern
 j http://yy.yyy/ ( ie any and all urls in a web page.)
 j and return and then store only the http://y.yyy portion to
 j a file appending a newline to each ?

If you assume that the initial "http://" is always present, as
well as the "/" after the domain name, the task is really easy:

   file-port: open/lines %destination-file.txt
   parse text-containing-links [
  any [
 to "http://" copy url ["http://" to "/"]
 (insert tail file-port url)
  ]
   ]
   close file-port

If you just want to assume that the URLs begin with "http://":

   url-rule: ["http://" some domain-chars]
   domain-chars: complement charset [#"^(00)" - #" " #"/"]
   parse text-containing-links [
  any [
 to "http://" copy url url-rule
 (insert tail file-port url)
  ]
   ]

 j Now with perl the matching expression is relatively short and
 j the assignment of the value is rather straight forward as well
 j as the printing to a append the file.

 j Feel free to forward this letter to the list with your
 j response. I'd love to see how others will answer it.

 j TIA,
 j JB

 j PS
 j *I'm replying off list because my temporary isp doesn't
 j forward my mail when I use my subscribed email account.

Regards,
Gabriele.
-- 
o) .-^-. (--o
| Gabriele Santilli / /_/_\_\ \ Amiga Group Italia --- L'Aquila |
| GIESSE on IRC \ \-\_/-/ /  http://www.amyresource.it/AGI/ |
o) `-v-' (--o





;- Elan  [: - )]




[REBOL] [REBOL] Error Message Re:(2)

2000-03-23 Thread icimjs

Hi another_bob,

I believe I've seen this error message when I've used hidden contexts. Were
experimenting or using a use block, something like this?

use [a b] [a: 1 b: 2 [a b]]

I believe it's an error that is not supposed to happen and indicates that
REBOL's garbage collection has been corrupted.

At 05:41 PM 3/23/00 +1200, you wrote:
another_bob wrote:
 What is the meaning of this error message?
 How can I avoid it?

 Invalid data type during recycle
 ** Press enter to quit.

It could be a bug. Send a copy of the script to the list. Or run the
feedback script.

Andrew Martin
ICQ: 26227169
http://members.xoom.com/AndrewMartin/
--




;- Elan  [: - )]




[REBOL] [REBOL] Error Message Re:(4)

2000-03-23 Thread icimjs

Hi Volker,

you wrote:
use and /local have another bug: you can't look in after an error!

I'm not sure how you were trying to "look in":

 f: func [/local a] [a: 1 1 / 0]

will cause a divide by zero error:

 f
** Math Error: Attempt to divide by zero.
** Where: 1 / 0

Now let's look at the value of a:

 first second :f
== a:

 get first second :f
== 1

"Looked in" and saw that a evaluates to 1. You must mean something quite
different?

a question: [a: do [print "1"]] does not work, how can i handle this too?
i wanted to return the result of [do b] this way, with some lines after it
[.. e: do b  if a-option [..]  "return" e ] ?

print returns nothing, and nothing is a value of type unset!:
 type? print "hello"
hello
== unset!

 type? do [print "hello"]
hello
== unset!

 print mold do [print "hello"]
hello
** Script Error: mold is missing its value argument.
** Where: print mold do [print "hello"]

When type? returns the datatype unset! it is reporting that there was no
value:

 type?
== unset!

There is no value to assign to 'a in your example. Otherwise it works as
you expect (?):
 f: func [] [a: do [1 + 1] return a]
 f
== 2

"code"
local: func[a "vars" b "script" /local c d ][
c: copy[]   foreach i a[ append c to set-word! i]   append c none

You could simplify your foreach loop:

foreach i a [
  append c compose [(to set-word! i) none]
]


d: make object! c   bind b in d 'selfdo b   d]

"test" do [
a: "-a" b: "-b"
probe the-locals: local[a b][ a: 10 b: 20]
probe a probe b probe the-locals
]


Volker




;- Elan  [: - )]




[REBOL] [REBOL] Error Message Re:(6)

2000-03-23 Thread icimjs

Hi Volker,

you wrote:
My problem is: i dont know the arg of 'do. its a parameter. 
type? destroys the result. i can not store it before, because 
this can cause an error. i can not [try [a: do b] because the error
can be caused by code in 'b . maybe something like
[try [ a: try [b]], but this gets complicated. 

Not very elegant, but this works:

 unset 'a
 result: []
== []
 insert result do [print "hi"]
hi
== []
 if not unset? first result [a: first result] clear head result
== []
 value? 'a
== false
 insert result do [1 + 1]
== []
 if not unset? first result [a: first result] clear head result
== []
 value? 'a
== true
 a
== 2

Hope this helps,


;- Elan  [: - )]




[REBOL] Newbie question #2 - Pattern making and using? Re:

2000-03-23 Thread icimjs

Hi T Brownell

you wrote:
x: none
cat: "feline" 
cat: "kitty"
fact: "I have a kitty"
if found? find fact cat [x: "found it"]
if found? x [print x]
unset 'x

A few remarks:

x: none
this line is not necessary. But it's not a bad idea.

cat: "feline" 
cat: "kitty"

Now cat evaluates to "kitty" only! cat no longer evaluates to "feline"! If
you try this code against fact: "I have a feline" find will fail! 

Given:
cat: "feline" 
cat: "kitty"
fact: "I have a kitty"

you could say:
if found? find fact cat [print x: "found it"]

How can i make the 2 values of cat: into a pattern
that can be used in this script?  Also, the rest of
this script stinks... THERE MUST BE A BETTER WAY!!!

fact: "I have a kitty"

rule:[ 
   [thru "kitty" (x: "found kitty")] |
   [thru "feline" (x: "found feline") ] 
   to end 
 ]


 if parse fact rule [print x]
found kitty

fact: "I have a feline"

 if parse fact rule [print x]
found feline

To identify both in any order:

fact-1: "The feline I have is a kitty."
fact-2: "I have a kitty which is a feline"

one possible approach is:


rule:[ 
   marker: [thru "kitty" (x-kitty: "found kitty")] 
   :marker [thru "feline" (x-feline: "found feline") ] 
   to end 
 ]


unset 'x-feline
unset 'x-kitty

if parse fact-1 rule [
  if value? 'x-feline [print x-feline]
  if value? 'x-kitty  [print x-kitty]
]

unset 'x-feline
unset 'x-kitty

if parse fact-2 rule [
  if value? 'x-feline [print x-feline]
  if value? 'x-kitty  [print x-kitty]
]

 unset 'x-feline
 unset 'x-kitty

 if parse fact-1 rule [
[  if value? 'x-feline [print x-feline]
[  if value? 'x-kitty  [print x-kitty]
[]
found feline
found kitty

 unset 'x-feline
 unset 'x-kitty

 if parse fact-2 rule [
[  if value? 'x-feline [print x-feline]
[  if value? 'x-kitty  [print x-kitty]
[]
found feline
found kitty

Hope this helps.


;- Elan  [: - )]




[REBOL] String formatting Re:

2000-03-14 Thread icimjs

There should be a rather complete solution called format.r located in the
user contribution archive at http://www.rebol.org

At 10:17 AM 3/14/00 +0100, you wrote:
  The following is rather trivial... anyway: 
what is the most convenient way of formatting strings in Rebol, let say for
producing suitable output, agrave; la printf/sprintf in C? Thanks, Mauro
Bregolin 
   Attachment Converted: "c:\eudora\attach\bregolin.vcf" 

;- Elan  [: - )]



[REBOL] finding stuff, and looping Re:

2000-03-11 Thread icimjs

Hi -t,

you wrote:

finding stuff, and looping

foreach filename load %ddbms/ [
  if not dir? filename [
file: read join %ddbms/ [filename]
;- do-stuff-with-contents-of-file filename, 
;- or just print the name of the file read: 
print ["read filename" filename]
  ]
]


;- Elan  [: - )]



[REBOL] Some niggley things Re:(5)

2000-03-09 Thread icimjs

Hi Donald,

you wrote:
What I really wanted to know was how to use a set-word!. The reason is that,
if the program has an error and stops, the console is still set for a changed
directory path. This is very annoying, since, to re-run the program, I
have to
change-dir again and again:

  list-path: %/drive/folder/folder/
  list: READ path

with "list" containing the dir-list block. I didn't get this working yet.

I must be missing something! This wouldn't work for you, right?

 set 'path %/d/temp/
== %/d/temp/
 list: read path
== [%save_NewFrames/ %funky/ %tcl-v7/ %snapshots/ %lynx_w32_2_8_2rel_1.zip
%yikes131.zip...

BTW, here you see how my temp file has changed since the last test ;-)

If you're using words that referece the directory names:

 drive: 'd
== d
 folder-1: 'temp
== temp
 folder-2: 'funky
== funky

 set 'path to file! reduce ["/" drive folder-1 folder-2]
== %/d/temp/funky
 append :path #"/"
== %/d/temp/funky/
 read path
== [%schema.DAT %LATEST.LOG %DECISION_TAB.LOG]

Hope this REALLY helps,


;- Elan  [: - )]



[REBOL] Lowing SECURITY LEVEL within a script Re:

2000-03-09 Thread icimjs

Hi Carlos,

If you are running the script under a copy of REBOL that you control, you
can use 

rebol -s

(or rebol.exe -s)

to disable security at startup.

If REBOL is running on someone else's remote computer, and you have not
control over that REBOL instance, you are NOT SUPPOSED to be able to
disable security programmatically, without that person OKing it. 

At 04:56 PM 3/9/00 -0300, you wrote:
Hi REBOLS,

Is there any way of lowing security level of REBOL within a script without
having to click that warning every time? In other words how can I avoid that
warning dialog everytime?

Carlos





;- Elan  [: - )]



[REBOL] Some niggley things Re:(3)

2000-03-09 Thread icimjs

At 06:15 PM 3/9/00 +, you wrote:

Hello, Elan:

On 09-Mar-00, [EMAIL PROTECTED] wrote:

 One possibility would be:

  files: [%a %b %c %d %e %f %g %h %i %j]
  foreach [f-1 f-2 f-3 f-4 f-5] files [ 
   print mold to string! 
  reduce [f-1 "+" f-2 "+" f-3 "+" f-4 "+" f-5] ]

 which results in:

 "a+b+c+d+e"
 "f+g+h+i+j"

 Hope this helps,

What I ended up using was:

   FOREACH [f-1 f-2 f-3 f-4 f-5] files [ 
 portfolio: MOLD TO STRING!
 REDUCE [f-1 "+" f-2 "+" f-3 "+" f-4 "+" f-5]

When I do it this way, I get a string. That's what I told it to do.

This causes an error, 

Which error? A REBOL error?

and the page is returned 

which page returned where?

minus the first and last (f-1 
f-5) entries. 

If it causes an error, how is anything returned? Oh, it's not a REBOL error?

When the quote marks are removed after copying the completed URL
into the brower, it works fine, so the quote marks are the problem.

   tmp: READ JOIN QAN-URL [ "?tick=" portfolio decimals ]

note that I used the "print mold " expression only for demonstration
purposes: so that you can see exactly what is being returned, namely a
string "..." containing the file values %x and plus signs.

If you want to use the stuff somehow (I don't know what the URL you are
returning has to look like, you will need to join the stuff with the url,
and the final result should be one value, including all information, of
type url!. As in

read join http://www.some-site.com/ [""]. See, I don't know whether you
plan to read the files and report the contents of those files to the URL
you are addressing, or whether you want to send a list of file names to the
url, in which case you possibly do not want to include the leading percent
sign, if the server side program does not know that % is REBOL's way of
saying literal file! type.


Hmm, this is the *same line* used elswhere in the program, which worked last
night. Am I missing something?

I guess it is. 


In what form can I get the above "string" without quotes, so that I can build
the URL properly?

 join http://www.some-site.com/ ["a+b+c+d+e"]
== http://www.some-site.com/a+b+c+d+e


 type? join http://www.some-site.com/ ["a+b+c+d+e"]
== url!

Hope this helps,



;- Elan  [: - )]



[REBOL] How do I save and restore an array of objects Re:(2)

2000-03-09 Thread icimjs

Hi Bob,

if I'm not mistaken, it is here where you are loading the file containing
objects:

 if exists? %articles/stor  [ stories: load %articles/stor ]

try the following instead:

if exists? %articles/stor  [ stories: reduce load %articles/stor ]


At 06:57 PM 3/9/00 +, you wrote:
The example below reads a web page of alternating headlines and
associated stories.  If the same headline appears on a later scan
the story is ignored.  It saves elements parsed from the webpage
as an array (block) of structs (object!s).
It cannot seem to restore them cleanly when rerun later.
why? How do I get around it for now?

I have simplified the example below.

REBOL [title: "sample story fetcher" ]

stories: make block! 25
story-tmpl: make object! [
 head: none
 body: none
 topics: none
 dest: none
 fileto: none
 ]

page-parser-rules: [
 any [
 thru "headline:"
 copy headl  to "story:"
 thru "story:"
 copy story-body  [ to "headline:" | to /BODY/HTML | to end ]
 (store-story)
 ] ]

headl: make string! 30
topic: make string! 30
story-body: make string! 300

store-story: func [ /local  sry ] [
; drop dupes...
foreach st stories [
if st/head = headl [ return false ]
   ]

; fill in struct
sry: make story-tmpl []
sry/head: copy headl
append stories sry
]

go: func [ /local c ] [
if exists? %articles/stor  [ stories: load %articles/stor ]
c: read  http://localhost/storygenerator.cgi

parse c page-parser-rules  ; calls store-story when "headl" filled
save %articles/stor stories
]

go
q


;# mailto: [EMAIL PROTECTED]




;- Elan  [: - )]



[REBOL] Command Line Args Re:

2000-03-09 Thread icimjs


I tested it on my machine (running Win95) and it worked as advertised, i.e.
the arguments were available under system/script/args as a string.

What did you expect would happen? Perhaps the problem is with trim.r?

At 09:04 PM 3/9/00 -0500, you wrote:
Can some one please send me a example of how to deal with
command lind arguments please?

I want to do some thing like this from the command line:

rebol -swq trim.r file.in file.out

Manual says I should see "file.in and file.out" at
system/script/args but I don't.

What am I doing wrong?




;- Elan  [: - )]



[REBOL] Command Line Args Re:(2)

2000-03-09 Thread icimjs

Hi Bo,

system/script/args is only for arguments passed with DO/ARGS.
system/options/args is for arguments passed from the command
line.

Interesting enough, under Win95 system/script/args did contain the command
line args!
Actually, they both worked!



;- Elan  [: - )]



[REBOL] Command Line Args Re:(2)

2000-03-09 Thread icimjs

Hi Bo,

system/script/args is only for arguments passed with DO/ARGS.
system/options/args is for arguments passed from the command
line.

Interesting enough, under Win95 system/script/args did contain the command
line args!
Actually, they both worked! They both contained the same arguments.



;- Elan  [: - )]



[REBOL] Associative Arrays in Rebol? Re:

2000-03-09 Thread icimjs

I think select and paths should come close to what you're asking:

for instance:

 select [ a "this is a" b "this is b" ] 'a
== "this is a"
 select [ a "this is a" b "this is b" ] 'b
== "this is b"
 block: [ a "this is a" b "this is b" ]
== [a "this is a" b "this is b"]
 block/a
== "this is a"
 block/b
== "this is b"

At 09:06 PM 3/9/00 -0500, you wrote:
Is there any way to simulate Associative Arrays in Rebol?

The type where the index could be a list of random words
like in the language Awk?




;- Elan  [: - )]



[REBOL] How do I save and restore an array of objects Re:(4)

2000-03-09 Thread icimjs

Hi Bob,

A) do works when you only want to load a single object. It's like saying:

do [make object! [word: 'something]]

which - of course - returns a single object, namely the last object (and
here only object) found in the block (returned by load), and not a block
containing all objects that were in the file.

B)
you wrote:
is there a situation where reduce should not be used?

There are two I can think of right now.

1. When the object contains a literal word, as in:

 o: make object! [word: 'something]

here 'something is lit-word!

probe o reveals that the lit-word! becomes a word! when we create the object:

 probe o

make object! [
word: something
]

We store it and then load it. We now have the following block:

 o: load %bob-store.dat
== [
make object! [
word: something
]]

Note that this block contains three elements: the word make, the word
object!, and the block containing the set-word! word and the word something.

So when we reduce this block, we have the same situation as:

 o: make object! [word: something]

which generates an error as it would with reduce, because the word
something is not defined in this context:

 o: make object! [word: something]
** Script Error: something has no value.
** Where: word: something

This whole scenario is due to the fact that the original lit-word!
something (i.e. 'something) was reduced to a word when the original object
- the one that we saved - was created. Accordingly, when we saved the
object the word something, originally a lit-word! is saved as a word! and
is no longer usable to create the object.

I don't see how this situation could be avoided, since you can't as a
matter of principle change all words that are assigned to a set-word! into
lit-words when you load the stuff, because it is possible that some of
these words are indeed intended as words. 

This is only a problem if it is possible that your object will include
values that started out as lit-words, before the object was created.

Two work-arounds: 

a) Never use literal words in objects you want to save, instead always
assign literal word in blocks:

 o: make object! [word: [something] ]
 save %bob-store.dat o
 o: reduce load %bob-store.dat
== [
make object! [
word: [something]
]]
 type? first o
== object!

b) Or 

If you are certain that - when you load objects from a file - you will not
be using words that should be dereferenced during the act of object
creation, i.e. something can never be intended as anything but 'something,
then you could edit each respective block used in the object creation
before you reduce the stuff, like in this case:

 o: make object! [word: 'something]
 save %bob-store.dat o
 loaded-o: load %bob-store.dat
== [
make object! [
word: something
]]
 change back tail third loaded-o ['something]
== [
]
 print mold loaded-o
[
make object! [
word: 'something
]]
 o: reduce loaded-o
== [
make object! [
word: something
]]
 type? first o
== object!
 probe first o

make object! [
word: something
]


2. When you have objects that contain references to objects:

 p: make object! [q: o]
 save %bob-store.dat p
 r: first reduce load %bob-store.dat
 probe r

make object! [
q: [
make object! [
word: something
]]
]

 probe p

make object! [
q: [
make object! [
word: something
]]
]

Looks as though everything is ok. NOT!

Here's the problem:
p, which is the object the word q as a reference to o, does not have its
own copy of o. If you modify o, you automatically modify p's embedded object:

Let's grab the object contained in the block o (remember we loaded it from
the file):

 o: first o
 probe o

make object! [
word: something
]

Ok, now let's change what word is pointing at:

 o/word: 'something-else
== something-else

and p was changed as well:

 probe p

make object! [
q: [
make object! [
word: something-else
]]
]

in contrast there is no equivalent of p in the loaded scenario r, such that
this equivalent points at the  object referenced by q in r.

In other words, as soon as you save the objects o and p, the relationship
between o and p, namely that p/q is only reference to the object o, and not
a second object, this relationship is lost.

Can't think of anything else right now.

Hope this helps.


;- Elan  [: - )]



[REBOL] return statement Re:

2000-03-08 Thread icimjs

Hi Phil,


1. As a matter of principle REBOL lets you modify the value of each and
every word. There are no keywords. This is good.

2. To protect all words that are part of the REBOL vocabulary use the
built-in function
protect-system.

3. To protect selected words (here return) use the function protect, as in 

 protect 'return
 return: none
** Script Error: Word return is protected, cannot modify.
** Where: return: none

You can have it your way without limiting REBOL's flexibility.

At 10:22 PM 3/7/00 +, you wrote:
Consider the following code :

REBOL []
; Check function
check1: function [] []
[
x: "A"
if x  none [return "Error"]
print "This should not print"
return none
]
print check1


does not print the text (correctly).

However adding the line
return: "Error"

gives
REBOL []
; Check function
check1: function [] []
[
return: none
x: "A"
if x  none [return "Error"]
print "This should not print"
return none
]
print check1

does print the text
(I accidentally added this line to a sub-function, instead of return none,
and it took me ages to track this down)

Shouldn't progress stop us setting variables like return: ???

Cheers Phil




;- Elan  [: - )]



[REBOL] Some niggley things Re:

2000-03-08 Thread icimjs

Hi Donald,

perhaps I'm misunderstanding something. But ...
#1
files: READ %. gets the current directory, but how do we do it with a
set-word? Example:

   directory: %/partition/drawer/drawer
   files: READ %directory(how to deal with "."?)

doesn't work because (among a few things) it tries to read the current
directory. I don't want to use CHANGE-DIR because then REBOL persists to look
at that drawer, which is *very* annoying when trying to re-run the program.

It appears to me that you are trying to read the directory located at
%/partition/drawer/drawer ?

Under windows I can read the directory saying:

files: read /drive/folder/folder/

such as in

 directory: %/d/temp/
== %/d/temp/
 files: read directory
== [%save_NewFrames/ %funky/ %tcl-v7/ %snapshots/ %lynx_w32_2_8_2 ...



#2
"files" (above) will, eventually, be a block of about 300 file names. I need
to know how to take five file names at a time and make a string that is:
"name+name+name+name+name", to add to a URL.

One possibility would be:

 files: [%a %b %c %d %e %f %g %h %i %j]
 foreach [f-1 f-2 f-3 f-4 f-5] files [ 
  print mold to string! 
 reduce [f-1 "+" f-2 "+" f-3 "+" f-4 "+" f-5] ]

which results in:

"a+b+c+d+e"
"f+g+h+i+j"


Hope this helps,


;- Elan  [: - )]



[REBOL] Some niggley things Re:(3)

2000-03-08 Thread icimjs

Hi Donald,

 Under windows I can read the directory saying:
 files: read /drive/folder/folder/

I tried using it directly, but...

** Script Error: READ expected source argument of type: file url object
block.
** Where: files: READ /Data2 /Stocks /Data

You need a % character (In the prototype I skipped it because - in the back
of mind - I thought it was understood, sorry):

read %/drive/folder/folder/

Example:
 read /d/temp/
** Script Error: read expected source argument of type: file url object block.
** Where: read /d /temp /

Compare to:

 read %/d/temp/
== [%save_NewFrames/ %funky/ %tcl-v7/ %snapshots/ %lynx_w32_2_8_2rel_1.zip...

Hope this helps,


;- Elan  [: - )]



[REBOL] new proxy server and related problems ... Re:

2000-03-03 Thread icimjs

Hi Petr,

have you tried to set the http proxy settings? I.e. 

 system/schemes/http/proxy/host: proxy.sec.trz.cz
 system/schemes/http/proxy/port-id: 3128
 system/schemes/http/proxy/type:  'socks.
 system/schemes/http/proxy/user: none
 system/schemes/http/proxy/pass: none


At 10:54 AM 3/3/00 +0100, you wrote:
Hi,

our company has new proxy server installed and I can't get trhu it with
REBOL 

My Netscape settings are:

http: proxy.sec.trz.cz port: 3128

No socks hosts setting is applied.

how should I set my http scheme to let it work?

The only one way of how to get thru is:

port: open/lines tcp://proxy.sec.trz.cz:3128
con: insert port "GET http://www.rebol.com/ HTTP/1.0^M^J^M^J"

wait con
while [data: pick con 1][print data]

close con

This small test works, but read http://www.rebol.com hangs, and I can't
find it combination of setting to make it work.

Any help, please?

Thanks,

-pekr-




;- Elan  [: - )]



[REBOL] [REBOL]How to remove email headers Re:

2000-03-02 Thread icimjs

Hi tim:

message-with-headers: none
message-without-headers: none

forall inbox [
 message-with-headers: import-email first inbox
 message-without-headers: message-with-headers/content
]

or:

forall inbox [
 message-without-headers: get in import-email first inbox 'content
]


Note that message-without-headers will point at a different message body at
each iteration and will not preserve the last message. If you want to save
the message you will have to insert the messages one by one into a block.

messages: []

forall inbox [
 append messages get in import-email first inbox 'content
]

Also note that when a message is a reply to a previous message, the message
body may quote a message it is responding to and include that previous
message's headers in its own body. In this case you will end up with the
complete body of the message you received, including possibly quoted
headers of previous messages it responds to, provided they are included in
its body.



;- Elan  [: - )]



[REBOL] out of range or past end Re:

2000-03-02 Thread icimjs

Hi RChristiansen,

1. first words will fail when words is empty:

 first []
** Script Error: Out of range or past end.
** Where: first []

To avoid the error use pick words 1 instead:

 pick [] 1
== none


2.
in: read %messages.txt
lines: make block! 1
parse in [any [thru newline copy text to newline (append lines text)]]

why don't you use read/lines instead?

lines: read/lines %messages.txt

read/lines returns a block containing each line as a string! You don't need
the additional parsing and you get the same result.

3. 


   fields: form first lines

Since lines is a block containing strings, first lines will evaluate to a
string and you don't need the additional string conversion provided by form.

4.
   firstword: form first words

Since words was constructed by appending strings to the block words, first
words will evaluate to a string and you do not need the additional form.


5. 
   words: []
   clear words

You could instead write:

words: make block! 0

or

words: copy []

6.
append out {HTMLHEAD/HEADBODY bgcolor="#FF"}

This is the first element you are adding to the block out. Since append is
a convenience which in turn calls insert tail, and therefore more compute
intensive (hardly a worthwhile consideration in your code, just old habit
on my part), and out is empty at this point anyway, you could just as well
just use insert.

You apparently skip the first line that ends with an end of line character
(the "thru newline" part of your rule before you "copy text to newline".
I'm therefore using next read/lines %messages.txt to skip the first line in
messages.txt.

A simpler version of your code would look like this:

out: make string! 10
insert out {HTMLHEAD/HEADBODY bgcolor="#FF"}
words: make block! 0

foreach fields next read/lines %messages.txt [
  clear words
  foreach word parse fields ":" [append words word]
  firstword: pick words 1
]


At 05:43 PM 3/2/00 -0600, you wrote:
When I run the following script, I get the following error:

** Script Error: Out of range or past end.
** Where: firstword: form first words

The script runs fine for several loops then quits on this error.  What may
be 
happening?


REBOL []

in: read %messages.txt
lines: make block! 1
parse in [any [thru newline copy text to newline (append lines text)]]

out: make string! 10
append out {HTMLHEAD/HEADBODY bgcolor="#FF"}

forall lines [
   fields: form first lines

   words: []
   clear words
   foreach word parse fields ":" [append words word]

   firstword: form first words
]




;- Elan  [: - )]



[REBOL] Parsing examples? Re:

2000-02-29 Thread icimjs

Hi Brad,
you wrote:
[snip]
I want to write an XML'ish parser.  Which is to say that I need to match 
beginning and ends of tags, but I don't know the tag names.  i.e. 
itembook/itemnameXML in a nutshell/name  The tags are made up for a 
specific data set, but i don't know what they are in advance.  I know they 
begin like this, ??? and end like this /???

Check out 
 source xml-language

You may find it helpful, especially the function xml-language/parse-xml,
which is used by the global word parse-xml.

 source parse-xml


;- Elan  [: - )]



[REBOL] decrypting downloaded rebol files Re:

2000-02-29 Thread icimjs

Hi Martin,

write/binary filename.extension 
  decompress read/binary downloaded-filename.extension

At 01:12 PM 2/29/00 -0400, you wrote:
Hello.

I just downloadedhttp://www.rebol.com/examples/examplesall.r   from
the web site.
Apparently this is compressed as I see junk when I look at it in a text
editor.
There is no instruction on how to extract it at that point on the web
page. I have been unable to find out how to extract it although I looked
at, and printed the users guide plus other doc's.

A hint and reference please

Regards...Martin
-- 
---

If speed kills, then Windows users may live forever.





;- Elan  [: - )]



[REBOL] Catching Web Site Access Errors Re:

2000-02-29 Thread icimjs

Hi Melvin,

 if error? error: try [
 read http://www.does-not-exist.com
   ] [
   error: disarm :error probe error
 ]
connecting to: www.does-not-exist.com

make object! [
code: 507
type: access
id: no-connect
arg1: "www.does-not-exist.com"
arg2: none
arg3: none
near: [read http://www.does-not-exist.com]
where: none
]

At 01:56 PM 2/29/00 -0500, you wrote:
 I am connecting to a remote site using:   page: read
http://www.noSuchSite.com   How do I catch the scenario where the site
doesn't exist, with no error checking I get the following:   Access Error:
Cannot connect to www.noSuchSite.com   Melvin Mudgett-Price 
Director of Development 
http://www.acmex.com/bio/mmp (Bio) 
(216) 391-7400 X207 - Acme Express, Inc. 
Web-enabled software / e-commerce / Web Marketing  
http://www.acmeX.com 
(216) 391-0707 (FAX) 
(216) 276-5487 (Cell)

;- Elan  [: - )]



[REBOL] REBOL on a MAC Re:

2000-02-29 Thread icimjs

Hi Carlos,

secure none does not cause a message box when security has previously been
set to none. For instance if your user.r file includes the secure none
expression, then if you run a script later which also sets secure to none,
the messagebox will not be displayed.

The messagebox will always be displayed (ie on MS Windows) when evaluate
secure none and the previous security level was higher.

You can check what your previous security settings were when you run the
script under MS Windows by evaluating

 print [secure none]

For instance, under MS Windows:

1. Manually force the security level to quit, to ensure that you are
starting out with a higher security level:
 secure quit

2. Now evaluate the expression
 print mold secure none

and REBOL displays the messagebox and subsequently displays:

[net quit file quit]

because that was the previous setting.

For security reasons REBOL always requires operator response when the
security level is being lowered by a script. Use the -s command line
switch, to set security to none when REBOL starts up.

Under MS Windows that would be:

rebol.exe -c


At 04:59 PM 2/29/00 -0300, you wrote:
Hi Rebols,

my script has a SECURE NONE at the one of the first lines in order to avoid
that annoing question about write permission.

In Windows it works out fine but on MAC OS I still have a question where
Rebol wants me to be sure security is going to be down. WHY?

Any help is welcome

Carlos




;- Elan  [: - )]



[REBOL] REBOL on a MAC Re:(2)

2000-02-29 Thread icimjs

Hi Carlos,

correct instructions, wrong example. Instead of:
Under MS Windows that would be:

rebol.exe -c

use rebol.exe -s


;- Elan  [: - )]



[REBOL] Testing REBOL/View Beta List Re:

2000-02-28 Thread icimjs

Hi guys,

Sorry about this noise, I wasn't aware that apparently the problem has been
resolved!


;- Elan  [: - )]



[REBOL] Script = Rebol Tag Re:(7)

2000-02-25 Thread icimjs

Hi Chris,

send a request for beta participation to [EMAIL PROTECTED] You might get lucky
;-)

At 05:46 PM 2/25/00 +1000, you wrote:


[EMAIL PROTECTED] wrote:

 Better yet, wait til REBOL/View becomes available (or join the beta testing
 now), and you can do it all with a nice GUI interface using nothing but
 REBOL/View (no web browser, no web server, no HTML, no JavaScript, and
 probably in no more than ten or twenty lines of code ...)

I recall hearing about the approaching beta testing of /view several
months ago before I dropped off the list (final semester of my degree,
and playing with rebol was too distracting :).  

Is the beta still open (to anyone)?  If so, how may I join?

Thanks,
Chris




;- Elan  [: - )]



[REBOL] Script = Rebol Tag Re:(7)

2000-02-25 Thread icimjs

Hi Keith,

you wrote:
 ...or wait a bit for the public release of REBOL/View.

Well, you can do a graphical interface with REBOL/View, but I was careful to
be explicit and specify that it was if you want an HTML interface that you
have to run a REBOL CGI script :)

Right. Or you could use one of the REBOL Webservers (see library) and
include the necessary REBOL functions in the Web server script without
using CGI at all (provided you will be using this local server for this
purpose exclusively!)


;- Elan  [: - )]



[REBOL] Script = Rebol Tag Re:(5)

2000-02-24 Thread icimjs

Hi,

better use a local Apache server. I described the configuration in a
previous email (from yesterday). You can download Apache for Win95 at

http://www.apache.org

(I think it was .org. Otherwise try .com or .net).

Then you can put your form handling REBOL script in the Apache cgi-bin and
continue to use JavaScript + HTML for input. 

Better yet, wait til REBOL/View becomes available (or join the beta testing
now), and you can do it all with a nice GUI interface using nothing but
REBOL/View (no web browser, no web server, no HTML, no JavaScript, and
probably in no more than ten or twenty lines of code ...)



;- Elan  [: - )]



[REBOL] WAP (protocol) and REBOL Re:(2)

2000-02-24 Thread icimjs

Any pointers to URL's with specifications, tutorials ...



;- Elan  [: - )]



[REBOL] html4 generator script Re:

2000-02-24 Thread icimjs

Hi Scott,

I briefly glanced at your html4.r script. (Briefly means that I may have
few more ideas when I take a close look).

Some observations:

You use print throughout in your functions. That will significantly slow
down your output to the webserver. Instead, have each function return a
string that contains the stuff you would have usually printed out. I.e in
this example:

Begin: func ["The HTML tag."][
print [HTML]
]

use: 

begin: func [] [
  return "HTML"
]


In this example:

_head: make object! [
  http-equiv: none
  author: none
  keywords: none
  description: none
  title: none
  style: none
  out: func [][
print [HEADnewline]
if (not none? http-equiv) [print build-tag [meta http-equiv (http-equiv)]]
if (not none? author)  [print build-tag [meta name "AUTHOR" content 
(author)]]
if (not none? keywords)  [print build-tag [meta name "KEYWORDS" 
content 
(keywords)]]
if (not none? description)  [print build-tag [meta name "DESCRIPTION" 
content (description)]]
if (not none? style)  [
print build-tag [style type "text/css"]
print [style newline /STYLE]]
if (not none? title)  [print 
[{TITLE}title{/TITLE}newline{/HEAD}]]
]

end: func [] [print [/HEAD]]
] ; end of _head object


TRY INSTEAD:

_head: make object! [
  tags: make object! [
http-equiv: none
author: none
keywords: none
description: none
title: none
style: none
  ]
  out: func [/local result meta-block][
result: make string! 1000
foreach tag next first tags [
  if get in tags tag [ append result 
 either 
  meta-block: select [
http-equiv [http-equiv]
author [name "AUTHOR"]
keywords [name "KEYWORDS"]
description [name "DESCRIPTION"]
  ] tag
[
  build-tag compose/deep [meta (meta-block) content (get in tags tag)]
][
  switch tag [
style [
  rejoin [
build-tag [tags/style type "text/css"]
tags/style newline "/STYLE"
  ]
]
title [
  rejoin ["TITLE" tags/title " /TITLE /HEAD"]
]  
  ]
]
append result newline
  ]
]
return head insert result HEAD
  ]
]

To have a complete (albeit trivial) web page let me add the following strings:

content-type: "Content-Type: text/ ^/^/"
end-html: /HTML
body: "BODY/BODY"


In your CGI script you the say:


_head/tags/http-equiv: "Whatever"
_head/tags/author: "Elan" 
_head/tags/keywords: {REBOL programming consult web page design software
programs}
_head/tags/description: {Programmer and consultant web page}
_head/tags/title: {Think First Consulting}
_head/tags/style: none

print [
  content-type
  _head/out
  body
  end-html
]

If I print mold _head/out I get:

{HEADmeta http-equiv content="Whatever"
meta name="AUTHOR" content="Elan"
meta name="KEYWORDS" content="REBOL programming consult web page design
software programs"
meta name="DESCRIPTION" content="Programmer and consultant web page"
TITLEThink First Consulting /TITLE /HEAD
}

Perhaps it would be a better idea to use html-head instead of _head? It's
more user friendly and even a novice will immediately understand what you
are talking about.



;- Elan  [: - )]



[REBOL] if condition vs. while condition Re:

2000-02-24 Thread icimjs

Hi Piroz,


In this context, what is the definition of a
"condition" 

A condition is an expression that evaluates either to a logical false
(including none, off) or something else. Like in C, everything that is not
a logical false is considered true, i.e. 
 if 1 [print {will be evaluated because 1 is not logical false}]
will be evaluated because 1 is not logical false
 if [] [print {will be evaluated because an empty block, [], is not
logical false}]
will be evaluated because an empty block, [], is not logical false

and why does
REBOL treat the two conditions differently?  

The condition expression for if needs to be evaluated exactly once. First,
we evaluate the condition expression and then - depending on what this
expression evaluates to - we either do or do not evaluate if's body. What
happens in that body cannot affect the result of having evaluated the
condition expression. There is therefore no reason to pass the condition
expression on to if for evaluation. The condition expression will be
evaluated in the context in which if is called, and the resulting value
will be passed to if. 

In contrast, while's condition has to be evaluated repeatedly, once on
entering while and repeatedly after while's body has been evaluated.
Therefore, "while" itself must evaluate its condition expression. It cannot
simply receive the result of a single evaluation of the condition epxression. 

To protect while's condition expression from being evaluated in the context
in which while is being called (i.e. the global context of the REBOL shell,
or the context of a function in which while is being called), the condition
expression is embedded in a block. The condition expression block can
contain as many expressions as required. The condition expression itself -
not the result of having evaluated it - is passed to while in a block and
and while will evaluate the condition expression as often as it needs to.

We expect that some expression evaluated in while's body will eventually
affect the condition expression and that expression will return false. The
condition expression must therefore be able to reflect modifications that
occurred as a result of evaluating while's body.


Why not
use a block for an
"if" statement as we do for loops?

There are two factors that determine that we must pass the condition
expression unmodified - i.e. embedded in a block - to while: the condition
expression must be evaluated repeatedly, and during its repeated evaluation
changes that occured within while's body must be able to affect values that
are processed in the condition expression. 

Neither of these factors apply to if. There is no reason to complicate if's
implementation by forcing it to evaluate its condition expression, when
that expression can be safely evaluated before the result of that
evaluation is passed to if.



;- Elan  [: - )]



[REBOL] Script = Rebol Tag Re:(3)

2000-02-24 Thread icimjs

Hi Keith,

you wrote:
For now, if you want to use REBOL to get form input from
an HTML page, you'll have to do it with REBOL running as a CGI script. :)

Well, how else would collect data from a form? Even using JavaScript, you
will have to eventually report the data to the server and you will need
some server side application to collect the data. So, server side you must
have some program that will accept the data and do something sensible with
it. 


;- Elan  [: - )]



[REBOL] System... and the other objects! Re:

2000-02-23 Thread icimjs

Hi Matos,

How can I know wich objects, variables and other things exist under an
object?!

use and look at Bo's system browser (browse-system.r) which should be on
rebol.org. If you can't find it let me know off-list and I'll mail it to you.

In short, as Jan pointed out, you can access a block containing all the
words defined in an object using first object-name:

 object: make object! [word-1: "this is word-1" word-2: "this is word-2"]
 print mold first object
[self word-1 word-2]

Note that the first word in every object is self, which evaluates to the
object itself. When you inspect the object word by word you will want to
skip the first word, since you are interested in the words defined in the
object and not the complete object. You can use a loop like this:

foreach word next first object [
  print [
   mold word
   mold get in object word
  ]
]

to print each word and its value. In our example this will result in:
 foreach word next first object [
[  print [
[   mold word
[   mold get in object word
[  ]
[]
word-1 "this is word-1"
word-2 "this is word-2"




;- Elan  [: - )]



[REBOL] CGI interpreter on win95 apache Re:

2000-02-23 Thread icimjs

Hi kenss,

At 11:40 AM 2/24/00 +0800, you wrote:
 
 How can I make rebol a cgi interpreter on win95 apache ?
 
 I can easily make perl work.  Just copy the perl script to cgi-bin and 
 make sure a #!C:/PERL/BIN/PERL at the top.  I don't even need to touch 
 the apache .conf files.

You may "not even need to touch ...". That may mean that Apache was already
configured to support perl. Or MS Windows is configured to support Perl and
perhaps therefore Apache does not need to be configured. 

I'm using Apache on a Win95 system and it works just fine. Here are my
settings.

The only file that needs to be modified is httpd.conf

1. ServerName must be configured to something sensible. If you are using
Apache locally then simply removing the comment character, #, will be
sufficient. Otherwise you must use the domain name of your si2. te or its
IP Number:

#ServerName new.host.name

2. You must add ExecCGI to the Options line:

Options Indexes FollowSymLinks ExecCGI

3. Are you using the default CGI directory cgi-bin for your scripts? 
C:\Program Files\Apache Group\Apache\cgi-bin

4. Check the first line of your CGI script. If rebol is in the directory
c:\rebol, your first line in the script should read:

#!C:/REBOL/REBOL.EXE --cgi --script

5. Verify that your script begins its output by printing:
print "Content-Type: text/html^/^/"

followed by a proper html page. A simple example:

print "Content-Type: text/html^/^/"
print {
HTML
HEAD
TITLETesting/TITLE
/HEAD
BODY
H1 This is a test. /H1
/BODY
/HTML
}

;- Elan  [: - )]



[REBOL] constructor destructor Re:(4)

2000-02-22 Thread icimjs

Hi Brian,

you wrote:
The only way to get around the need for finalization here
would be for the garbage collector to automatically close the ports
it reclaims using some internal method, something it currently does
not do (I checked).

I've added finalization as an enhancement request to Feedback.

My preference would be for the garbage collector to close the port. Why
should a port be treated different from memory allocation?

;- Elan  [: - )]



[REBOL] constructor destructor Re:(2)

2000-02-21 Thread icimjs

Hi Martin,

re: destructors:

Note that REBOL has automatic garbage collection. 

This means that the memory that was allocated by an object programmatically
during its creation processor or subsequently will be automatically
released when the object is destroyed. 

In contrast, programming languages like C++ that do not have automatic
garbage collection require a destructor function, so that you will be able
to clean up, i.e. release programmatically allocated memory, when your
object is destroyed. 

With automatic garbage collection, i.e. memory getting automatically
reclaimed, I think the motivation behind a destructor function no longer
exists and a destructor function is no longer critical.


;- Elan  [: - )]



[REBOL] New? programming construct Re:(5)

2000-02-19 Thread icimjs

Hi Ole,

you wrote:

Do you mean the Beta programming language, 

Yes. 

or just the beta versions of
GnuC++? (Didn't think anybody outside of the University of Aarhus, here in
Denmark, knew about Beta. 

:-)

And before I get your reply, I still think I'm
right on that one ;-) )

Yikes. I didn't know Beta was *that* unknown. I actually printed out and
studied the accompanying manuals. I especially like the idea of fragments.
It provides some interesting added flexibility. I also found the arrow
notation very intuitive and appealing. The only thing that stopped from
actually using Beta beyond just entering all the examples from the manuals
was the fact that the MS Windows GUI support was rather weak (at the time
it relied on Tcl/Tk, if I remember correctly.) The kind of software I was
looking to implement would have been very GUI intensive and I dreaded the
idea of having to fool around with Tcl/Tk in order to get it to work,
albeit through a Beta interface. 

At some point I remember someone announced that they were a implementing a
constraint sub system for Beta.

;- Elan  [: - )]



[REBOL] migration paths Re:(3)

2000-02-18 Thread icimjs

At 01:45 PM 2/18/00 -0600, you wrote:
I'm brand new to rebol, and using it on a mac, which has some limitations
since it has no command line at present. Two questions...

What is Rebol/view, and is there any sort of GUI dialect out there... I do

A REBOL GUI toolkit with dialects for rapidly creating beatiful GUIs that
is currently in beta (see http://www.rebol.com).

sort of feel like i'm in unix circa 82 using rebol...

ah, those were the days ... 




;- Elan  [: - )]



[REBOL] Increment/Decrement Functions Re:

2000-02-17 Thread icimjs

Hey EAT,

neat.


;- Elan  [: - )]



[REBOL] unique entry Re:

2000-02-17 Thread icimjs

Hi Francois,

I copied and pasted your data into a file that I called unique.dat. 
I wrote a little script and put it in the file unique.r

Here's the script:

REBOL []

data: read/lines %unique.dat

get-column: func [ table [block!] column [integer!] /local result] [
  result: make block! length? table
  foreach entry table [
append result pick parse entry none column
  ]
  return result
]

unique?: func [item [string!] column [integer!] table [block!]] [
  table: get-column table column
  return empty? intersect reduce [item] table  
]

save-record: func [ "dummy function. displays data that should be saved"
record ] [
  print ["saved:" mold record]
]

unique-data?: func [] [
  forall data [
date: first parse first data none
next-data: next data
either unique? date 1 next-data [
  save-record first data
] [
  print "found duplicate"
]
  ]
  data: head data
  print "done"
]
  
unique-data?




;- Elan  [: - )]



[REBOL] New? programming construct Re:(3)

2000-02-17 Thread icimjs

At 09:11 AM 2/17/00 -0800, you wrote:
I do notice that they have a patent covering "integrating rules into OO
languages ... that covers the innovative technology within R++".

I thought rules and constraints were well-known enough that a patent in this
area would have to be very specific.  Anyone have any more specific
knowledge of the patent?

I don't know how this would impact work in Rebol (is rebol considered OO?),
but it might be something to keep in the back of your mind.  Any lawyers or
would-be lawyers out there?  Don't ya just love patents?

Russell.

Would that mean that GnuC++ would not be able to incorporate rules? Beta
has had rule constraints for at least two or three years. 


;- Elan  [: - )]



[REBOL] EOF? Help please Re:(3)

2000-02-15 Thread icimjs

Hi Tiana,

if you run the following version of your code you will easily see what is
happening:

REBOL []

blk: read/lines %test.dat   

print "blk contains:"
foreach string blk [print mold string]
print "end blk contains"

while [not empty? blk]
[
print ["=" newline
mold to-block first blk newline
"="
]

d1:  second (to-block first blk) 
d1: parse d1 "-"
d1: to-date d1/1
print d1
blk: next blk 
print blk   
either not empty? blk [print "not empty"][print "empty"]
]

In short what happens is that when you read/lines your file, empty lines in
the file are contained in blk as emtpy strings:

[""]

When you check 
empty? blk

and blk is [""] then blk is not empty of course (it contains an element
which is an empty string). But the string is empty and therefore there is
no second element in the string. So 

d1:  second (to-block first blk) 

fails. to-block first blk will return an empty block [] and there is no
second element in the empty block.

It's safer to use pick (to-block first blk) 2 instead of second. The
advantage is that pick series index returns none when there is nothing to
pick instead of generating an error. 

  So you can say:

if d1: pick (to-block first blk) 2 [
  d1: parse d1 "-"
  d1: to-date d1/1
  print d1
]
blk: next blk 
print blk   
either not empty? blk [print "not empty"][print "empty"]

and only attempt to process d1 if it is not none.

Hope this helps,


;- Elan  [: - )]



[REBOL] hostname parse rule Re:(3)

2000-02-13 Thread icimjs

Hi /PeO

you wrote:
; name must start with a letter
let-char

; may have any number of letters, digits and
; hyphens in between, but this sequence must
; end with a letter or digit if it exists
0 1 [any let-digit-hyph-char let-digit-char]

The problem is combining them to a working ruleset...

The problem is how you formulate your specification. You say:
; may have any number of letters, digits and
; hyphens in between, but this sequence must
; end with a letter or digit if it exists

This is too general. You need to redefine your rules so that you precisely
state that a hyphen - if it occurs - must be followed by a letter or digit.
I.e., I believe you have a let-digit-char rule, your let-digit-hyph-char
rule then must be:

let-digit-hyph-char: [ "-" let-digit-char]

This rule only evaluates to true if a hyphen is immediately followed by a
character. It permits that a hyphen appear, provided that the hyphen is
followed by a an obligatory character and thereby excludes the possibility
of a trailing hyphen.

Hope this helps


;- Elan  [: - )]



[REBOL] hostname parse rule Re:

2000-02-12 Thread icimjs

Hi [EMAIL PROTECTED]

you wrote:
let-char: charset[#"a" - #"z" #"A" - #"Z"]
let-digit-char: charset[#"a" - #"z" #"A" - #"Z" #"0" - #"9"]
let-digit-hyph-char: charset[#"a" - #"z" #"A" - #"Z" #"0" - #"9" #"-"]
hname-rule: [name-rule some ["." name-rule]]
name-rule: [let-char [none | [[some let-digit-hyph-char] let-digit-char]]
to end]
 parse "asdfg-" name-rule
== true
ERR!last character is not one of the allowed ones

 parse "a%$#" name-rule  
== true
ERR!none of the characters following the "a" are allowed

What is wrong with the rule generating the too-many true's ?

Your name-rule requres a let-char then it permits for none and then goes to
end. In both ERR! cases let-char is fulfilled, then at some point the none
part of the following bracket is fulfilled and then to end is performed. No
wonder you end up with true in both cases. Compare to:

 parse "abcdefg" [none to end]
== true



;- Elan  [: - )]



[REBOL] POST in a form Re:

2000-02-10 Thread icimjs

Hi John,


use the input function. When you want to collect the posted data just say

posted-data: make object! decode-cgi input

At 06:34 PM 2/9/00 -0600, you wrote:
I am trying to pass variables to Rebol from a HTML page -no problem doing 
that so far.

Noah and I worked out the form so that a HTML formatted page (because of 
the aesthetics) prints on a distant printer with a recreated HTML page with 
the variables inserted.

Good so far.

Then we realized that the FOR ..  GET has a predetermined capacity of 
only 2K of data.  That limit is inherent to HTML, not REBOL.

The cure to the data transfer limit is FORM .. POST but we cant make 
the code work inside Rebol with a POST transfer.

The examples are all for GET transfers which is handled differently by 
Robol (as it is with perl).

If you need -i will give you FTP access to a file directory here so we can 
=== files.

This will be uniquely valuable to all of us who need to have forms for 
ourselves or our clients.  I can show you how to auto print at a distant 
printer without user intervention.  Thait is not an issue.

I am sure this is purely a labor pain.  Rebol is very impressive.

/john


At 0543 2/7/00 , you wrote:
Hi John,

It's a little harder to see what you're doing with all that HTML
formatting in your mail, but I think you can do what you want with:




;- Elan  [: - )]



  1   2   3   >