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

World: r3wp

[I'm new] Ask any question, and a helpful person will try to answer.

RobertS
29-Aug-2007
[778]
Thanks.  btw
I saw this on MAP on the Rebol3 group
>> map [where:] [1 2 3 4 5 6] [take/part where 2]

== [[1 2] [3 4] [5 6]]          ; Graham said not too intuitive - 
I prefer the solution you suggested to me a few days back

; Will we have FOLD in Rebol3?  If so, it should be intuitive, as 
should any MAP  imho   TAKE inside a MAP is counter-intuituve to 
me cuz MAP should not ;be slice-n-dice ... PARTITION/pairs   PARTITION/triples 
    partition/4   etc
Gabriele
30-Aug-2007
[779x4]
i don't think one would use TAKE often with MAP or FOREACH.
usually you just do something like map [a b] [1 2 3 4] [a + b]
a simple fold is:
fold: func [

 "Applies F to the accumulator value and, successively, each value 
 in the block."
	block [any-block!] "Block of values"
	accum "Accumulator value" 
	f [any-function!] "Function to apply"
][
    foreach val block [accum: f :accum :val]
]
RobertS
30-Aug-2007
[783x2]
; Just FYI ...

Ladislav Mecir has an excellent page on  bind   at http://www.fm.tul.cz/~ladislav/rebol/contexts.html
But it does not warn you not to try
    >> someWord: make word! ":test:"
    >> print bind? 'someWord   ; BAD IDEA
I am fine with
   >> none? bind? 'someWord
or
   >> equal? bind? 'someWord bind? 'someContext

Printing the global context seems like a bad idea, at least when 
my PC is carrying a heavy load ;-)
>> length? mold bind? 'rebol
== 504310487
Gabriele
31-Aug-2007
[785x2]
that's just like   print system/words :-)   since system/words contains 
system too, you are printing all of rebol.
the size of that depends on what you've done in the session. if you 
started the view desktop for example, you're going to get quite a 
big result ;)
RobertS
31-Aug-2007
[787]
on another topic (how like me :-)
>> source does
; leads naturally to
>> source throw-on-error
; which is a good read ... for me, anyway
Gabriele
31-Aug-2007
[788]
which should lead to investigate what the [catch] function attribute 
does :-)
RobertS
31-Aug-2007
[789x12]
; tutorials  on series and find/part

; I may be alone in thinking that without experimenting, a newbie 
will miss this ...  here is my experiment

; the docs say part will accept a 'range' but give no clear indication 
what a 'range' is in 2.x
text: {
    Tested this before.
    Then test these.
}

start: find text "this"
end: find start newline
item: find/part start "this" end
print item

index? find text "this"
index? start
length? start
index? end
length? end
head start
head end
index? item
head item

; by now you get that Ah-Hah experience or Eureka! or 'hot-damn!' 
as the case may be ...
; drat.  That should be
start: find text "ted"
end: find start newline
item: find/part start "this" end
print item
; the docs say
/part - Limits the search to a given length or position. 

range - The range argument. (must be: number series port) 


; but it is not clear how to pass in that range argument as a 'position' 
let alone a series or port

; the only sign of something going wrong other than an error is that 
the 'end' is simply spit back out at the console, i.e., no error 
but bogus 'result''
; last words of the horse thief on the gallows: 'It has all bin a 
lesson to me'
>> equal? start end  ; false
>> equal? head start head end   ; true
The simple thing to state would be that the 'range' option in question 
is precisly that same series, albeit with the current position shifted 
out further.
>> item: find/part start "this" 24
>> item: find/part start "this" (find start newline)
; range as port ( I have not yet seen this )
>> item: find/part start "this" my-port

; when range is port we must be reading 'start' from a data-source 
( ? )
ditto for copy/part

As Newbie I have to realize that the 'series' mentioned in the HELP 
is that self-same series.
>> t:  copy :end

>> item: find/part start "this" t   ; ERROR  but not at all obvious;

>> item: find/part start "this" "^/    Then test these.^/"  ; ERROR 
  even though true that   >> equal? "^/    Then test these.^/" :end
I would have my tutorial read:
	some series S at some position
	that same series S at some further position

And: think of 'find' as 'try to reposition current index in the series'

Without seeing the source for FIND, I have no idea yet how to explain 
that 'range' must be that very same series.  Chalk it up to lack 
of imagination...
; this now makes sense
>> file: %image.jpg

>> print copy/part file find file "."  ; == "image"   I will focus 
on this example in my tutorial but only AFTER
>> fileName: "image.jpg"
>> print copy/part fileName find fileName "."  ; == "image"
; as a newbie I found this useful ...
>> tt: "this is my test of X which will fix the XY thing"
>> token: find/part tt "X" find tt "is"   ; == none

>> token: find/part tt "X" find tt "thing"   ; == "X which will fix 
the XY thing"
; I did a dif between the functions in VIEW and those in CORE for 
a default install.  What I get is this ( I hope it is useful to have 
al 106  in one place )

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

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

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

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

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

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

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

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

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

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

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

 uninstall  unlight-text  unview  vbug  view  viewed?  win-offset? 
  within?
Gabriele
1-Sep-2007
[801]
range can be port only if you are searching a port too - but, not 
100% sure how well that works. i bet it only works on buffered ports 
though.
RobertS
3-Sep-2007
[802x3]
; this is handy if you are new as am I

>> foreach t (sort/compare datatypes func [a b] [ (form a) < (form 
b)]) [print mold t]
I have nothing on  END!  other than   parse ... to end ]
SYMBOL! is internal houskeeping for names of words (?) and a routine! 
is for working with a call to a DLL  ( of my 54 datatypes in a 2.6.3 
VIEW exec )
Allen
3-Sep-2007
[805x4]
Robert  you can get a similar list by doing
? !
or using   "? datatype!"
not as much fun as exploring/learning with your own funcs, but help 
"?" can do some great things, including matching on datatype "? tuple!" 
is a quick way to lookup colours.
RobertS
4-Sep-2007
[809]
Thanks.  And is that colours or colors?  ;-)
Allen
4-Sep-2007
[810]
; interesting question ... Rebol lets me spell it "colour" if I really 
want to :-)
alias 'color "colour"
view layout [label with [colour: red] "hello"]
btiffin
4-Sep-2007
[811]
Robert;  Make sure you check out  http://www.rebol.it/romano/and 
in particular http://www.rebol.it/romano/#sect1.1.anamonitor 3.0 
and 2.0.  Not something for your average I'm new resident but I have 
a feeling you'll appreciate Romano's utilities.
RobertS
8-Sep-2007
[812x6]
Here is one of my first encounters with unset!  when working on a 
tutorial to introduce console Rebol to someone who knows Common Lisp
>> m: [1 2 3]
== [1 2 3]
>> m
== [1 2 3]
>> probe m
[1 2 3]
== [1 2 3]
>> print mold m
[1 2 3]
>> mold m
== "[1 2 3]"
>> type? print mold m
[1 2 3]
== unset!
>> type? mold m
== string!
>> type? probe m
[1 2 3]
== block!
>>
the answer is interesting for  me as a newbie and lies in
>> source probe
; the error from trying
>>  n: print mold m
; natually leads to
help print
; and since this fails
p: write %tmp.txt :anything"
; with
help write

; we get to clarify binding words to values, functions, procedures 
 evaluation and returned values

; I hope to get tutorials prepared for OCaml and Scheme as well as 
Haskell and Curl, Perl, Python, Ruby and Smalltalk based on my experience 
as a newbie while I am still a newbie ...
; i.e.,
>> type? write %tmp.txt "newbie"
== unset!
>> unset? write %tmp.txt "new"
== true
both English Rebol books call print and prin 'functions'

The Rebol docs dictionary lumps all the words together as 'functions'

The challenge I have in introducing Rebol in a tutorial is to explain 
why the second expression fails:
>> c: open %temp.txt
>> d: close %temp.txt
; when explaining that the last line seen in
>> source send

; is not an indication that the function named send returns a value. 
 In many languages procedures can be called functions. Is Rebol one 
of them?

; not all mathematicians can add and many cannot teach mathematics 
but can teach naval history. and such.
>> c: open %temp.txt
>> e: insert c "test"
>> close %temp.txt

>> type? e         ; this is easy to explain to Smalltalker as in 
ST you cannot assume that a method returns self
Gabriele
8-Sep-2007
[818x2]
they are all functions, as the all return a value. some return the 
value "unset!" which is treated somewhat specially by the interpreter. 
you cannot set a word to this value unless you use set/any, and you 
cannot get a word that refers to this value unless you use get/any.
unset! is mainly used to catch typos (eg. if you write pint instead 
of print you get an error), and it's used as a return value by functions 
that don't have anything useful to return.
RobertS
9-Sep-2007
[820]
I wil be sure to cover  get/any  and  set/any 
thanks
RobertS
12-Sep-2007
[821x7]
; using a context there is no problem traversing a path into nested 
blocks. But there is using nexted blocks alone.  Here is my first 
answer to this...
>> t1: [a "one" b "two" c "three"]
== [a "one" b "two" c "three"]
>> t2: [f t1]
== [f t1]
>> t1/b
== "two"
>> t2/f
== t1
>> t2/f/b
** Script Error: Cannot use path on word! value
** Where: halt-view
** Near: t2/f/b
>> pword: func [path 'word /local blk] [
[    return to-path reduce[path :word]]
>> do pword t2/f c
== "three"

; pword is my first pass at a function to traverse nested blocks 
which are not in an object; the alternative appears to be
blk:  get t2/f
aPathDeeper: make path! [ blk c ]
; anyone know anoth path to take?
; the local was a hold-over from an earlier pass at doing this


pword: func [ { navigate one deeper into nested blocks using a path} 
path 'word { must be a valid path refinement} ] [
  return to-path reduce[path :word]]
; simple nested blocks were not the issue
>> t1: [a "one" b "two" c "three" x [f "for"]]
== [a "one" b "two" c "three" x [f "for"]]
>> t1/x
== [f "for"]
>> t1/x/f
== "for"
; I only have the issue if I build t2 to hold some functor and a 
word bound to a block rather than the block, i.e., not
>> t1: [a "one" b "two" c "three" x [f "for"]]
== [a "one" b "two" c "three" x [f "for"]]
>> t2: reduce['functor t1]
== [functor [a "one" b "two" c "three" x [f "for"]]]
>> t2/functor/c
== "three"
t2/functor/x/f  ; also OK of course
; this issue persists 
>> t2: [functor t1]
== [functor t1]
>> p3: to-path reduce[ t2/functor 'x]
== t1/x
>> do p3
== [f "for"]
>> p3: to-path reduce[ t2/functor 'x/f]
== t1/x/f
>> do p3
** Script Error: Invalid path value: x/f
** Where: halt-view
** Near: t1/x/f
; there seems to be no way to "append'" to a path ??
>> p4: to-lit-path [t1 x/f]
== 't1/x/f
>> do p4
** Script Error: Invalid path value: x/f
** Where: halt-view
** Near: t1/x/f
>> t1/x/f
== "for"