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

World: r3wp

[Core] Discuss core issues

Volker
23-Jun-2005
[1369]
>> find/only [["Pekr" "Krenzelok"] "asking"] ["Pekr" "Krenzelok"]
== [["Pekr" "Krenzelok"] "asking"]
Ladislav
23-Jun-2005
[1370]
I wrote some functions of this kind, but anyway, what is "the shortest" 
reverse of:

    y: to integer! x: #{80000000}
Anton
23-Jun-2005
[1371x2]
Maybe this ?
>> reverse third make struct! [i [int]] reduce [y]
== #{80000000}
; quick testing looks good

>> foreach v [-1 0 1 1000 7777 2000000][print same? v to-integer 
reverse third make struct! [i [int]] reduce [v]]
true
true
true
true
true
true
Gabriele
23-Jun-2005
[1373x3]
hmm, a "short" way could be:
>> to binary! reduce [y / 16777216 y / 65536 y / 256 y]
== #{80000000}
btw, is this on rambo? i really think that to binary! should work 
with integers.
JaimeVargas
23-Jun-2005
[1376]
I second that.
Anton
23-Jun-2005
[1377x2]
I don't remember seeing that in rambo.
Doesn't appear to be there. I searched "binary!" and "binary"
Ladislav
23-Jun-2005
[1379]
submitted
Piotr
23-Jun-2005
[1380]
does anybody know why code below give me diffrent results? looks 
like get/set funcs operate on diffrent contexts:

ctx: context  [
  no-a: no-b: no-c: none
  set 'test does [
    foreach x [no-a no-b no-c] [set x "test-1"]
    foreach x [a b c] [set (to-word join "no-" x) "test-2"]

    foreach x [a b c] [print [join "no-" x get (to-word join "no-" x)]]
    foreach x [no-a no-b no-c] [print [x get x]]
  ]
]

test
probe no-a
probe ctx/no-a
Ladislav
23-Jun-2005
[1381]
to-word creates global words
Piotr
23-Jun-2005
[1382x2]
oops
then how construct local words?
Ladislav
23-Jun-2005
[1384x2]
bind to-word "no-b" 'no-a
(if 'no-a is local)
Piotr
23-Jun-2005
[1386]
so, fifth line (of example above) looks like:

foreach x [a b c] [
  d: to-word join "no-" x
  bind d 'no-a
  set d "test-2"
]

but his still does not work (for me)
Ladislav
23-Jun-2005
[1387]
ctx: context  [
  no-a: no-b: no-c: none
  set 'test does [
    foreach x [no-a no-b no-c] [set x "test-1"]
    foreach x [a b c] [
		d: bind to-word join "no-" x 'no-a
		set d "test-2"
	]

    foreach x [a b c] [print [join "no-" x get (to-word join "no-" x)]]
    foreach x [no-a no-b no-c] [print [x get x]]
  ]
]

test
probe no-a
probe ctx/no-a
Volker
23-Jun-2005
[1388x2]
i guess bind returns a new word here, but does not change the old? 
so it must be
d: bind d 'no-a
>> c: context[a: 123]
>> a: 234
== 234
>> b: 'a
== a
>> get b
== 234
>> bind b c
== a
>> get b
== 234
>> b: bind b c
== a
>> get b
== 123
Piotr
23-Jun-2005
[1390x2]
thanks;
maybe rebol need something like to-local-word and to-global-word?
Volker
23-Jun-2005
[1392x2]
thats to-word and 'bind. your problem was that bind does not change 
its argument, but returns a new different bound word. which may confuse 
because with a block, it changes that block.
(to-local-word would not work, as rebol does not know what "local" 
means)
Piotr
23-Jun-2005
[1394]
i think that bind and varialbles "bounded to local or global context" 
are black magick for new rebolers; hard to understand and even harder 
to explain...
Ladislav
23-Jun-2005
[1395]
what is easy to explain (in the doc at many places) is the warning, 
that you shouldn't use strings when you intend to use words, because 
strings don't "contain" any context information
BrianH
23-Jun-2005
[1396]
Piotr, REBOL doesn't really have local contexts like a language with 
nested scopes does. REBOL fakes nested scopes with iterations of 
applied binding. The "local" context of a word is really just the 
context associated with that specific word object. The "global" context 
is nothing special in that respect, and "outer" contexts are just 
a side effect of the binding rather than a real physical structure 
like it is in Smalltalk. There is no lookup chain - it's just  [word 
thing]->[context (keyed value collection) thing]->[value thing].
Romano
23-Jun-2005
[1397]
Ladislav: "what is "the shortest" reverse of:     y: to integer! 
x: #{80000000}"

debase/base to-hex y 16

is the fastest i know, i do not know about the shortest
BrianH
23-Jun-2005
[1398]
Binding is just associating a [word thing] with a [context (keyed 
value collection) thing], and that just fails if there is no existing 
key in the context of the symbol associated with the word. The only 
context that actually expands to include new words is system/words, 
the closest thing REBOL has to a "global" context, more of a default 
really, but not quite.
Gabriele
23-Jun-2005
[1399]
Piotr: you may be interested into this thread: http://www.rebol.org/cgi-bin/cgiwrap/rebol/ml-display-thread.r?m=rmlKVVC
Pekr
25-Jun-2005
[1400x6]
>> a: [1 1 2 2 3 3]
== [1 1 2 2 3 3]
>> b: [x y]
== [x y]
>> foreach :b a [print x]
1
2
3
>> foreach :b a [print b/1]
x
x
x
>> foreach :b a [print get b/1]
** Script Error: x has no value
** Where: halt-view
** Near: print get b/1
Is it possible to get b/1 evaluated? I am not sure it is because 
of non-aggresive word evaluation, but maybe question for you 'bind 
gurus? :-)
foreach :b a [print  bind b 'x] ?
and for gurus - what happens here? :-)

foreach :b a [print bind b first :b]
3 3
3 3
3 3
I want to use 'X, without using 'x :-), but somehow foreach :b a 
[print get b/1]] does not return result I expected (1 2 3), it returns 
(3 3 3)
sorry, my bug - I needed to restart concosole, "get b/1" in context 
of 'foreach is unknown ...
Volker
25-Jun-2005
[1406]
foreach makes new context, not touching the old vars. kind of locals.
Pekr
25-Jun-2005
[1407]
I know, I just somehow wished to abstractly use b/1, to get x in 
a
Volker
25-Jun-2005
[1408]
>> b: [x y]
== [x y]
>> foreach :b [1 2 3 4 5 6][bind b 'x print get b/1]
Pekr
25-Jun-2005
[1409]
yes, I know, but you used 'x ... that is the tricky question - we 
wanted to create it dynamically, so we wanted to use bind b b/1 (we 
thought that instead of b/1 interpreter somehow will understand cleverly, 
that we mean x in context of foreach function :-)
Volker
25-Jun-2005
[1410x2]
>> foreach :b [1 2 3 4 5 6] compose/only [b: (b) print get b/1]
its ugly. problem is, the context exists only inside the foreach-body. 
here i put the same words (b) in the body and those they get rebound. 
but foreach copies the body before first run, so i have to assign 
b again.
Pekr
25-Jun-2005
[1412]
ha, that was easy ;-) ...we tried to struggle in context  level and 
forgot about ability of dynamically building code for interpreter 
itself :-)
Volker
25-Jun-2005
[1413]
but i guess once you start having ideas about it you will find something 
nicer ;) - yes, like building the whole code dynamic maybe.
Pekr
25-Jun-2005
[1414x3]
but you redefined original 'b block in context of foreach body ....
>> foreach :b [1 2 3 4 5 6] compose/only [b: [x y z] print get b/1]
1
3
5
>> b
== [x y z]
so 'b in context of 'foreach body is global ... so it redefines original 
'b, but it is ok for our example, thanks ...
Volker
25-Jun-2005
[1417x2]
You could use another var-name, i just reused 'b
foreach :b [1 2 3 4 5 6] compose/only [words: (b) print get words/1]
 and done ;)