World: r3wp
[Core] Discuss core issues
older newer | first last |
Henrik 21-Sep-2006 [5357x2] | wow, that's a lot of stuff alright... |
well, it seems to work, thanks :-) | |
Ladislav 21-Sep-2006 [5359] | do reduce [to set-path! [a b c] 7] |
Rebolek 21-Sep-2006 [5360] | hehe I knew there's some simple way :) |
Henrik 21-Sep-2006 [5361] | ladislav, I did that one, but somehow I have trouble binding the result to the original object |
Ladislav 21-Sep-2006 [5362] | yes, the word 'a must have proper context for this to work |
Henrik 21-Sep-2006 [5363x2] | do reduce bind [to set-path! [a b c] 7] 'a does not seem to work |
rebolek: it doesn't handle paths with indexes in them. I don't always store objects inside objects, but also blocks of objects. are there ways around that? | |
Ladislav 21-Sep-2006 [5365x3] | do reduce bind [to set-path! [a b c] 7] 'a does not seem to work - right, that is not supposed to do anything meaningful, it simply keeps the context the word 'a had |
>> a: context [b: context [c: 0]] >> do reduce [to set-path! [a b c] 7] == 7 >> a/b/c == 7 | |
If 'a does not have meaningful context, then bind [...] 'a cannot repair the situation | |
Henrik 21-Sep-2006 [5368x2] | but 'a does have a meaningful context. I'll have to try a different approach. |
load mold reduce [to set-path! ... ] seemed to work | |
Anton 21-Sep-2006 [5370] | You shouldn't have to do that (load mold). Can we see a bit more of your code ? |
Henrik 21-Sep-2006 [5371x2] | rel-obj: make object! [] add-relation: func [path-block [block!] /local p v w] [ p: to-block 'rel-obj parse path-block [ any [ [set w word! ( unless all [ find either object? do to-path p [first do to-path p][[]] w insert tail p w ] [ do load mold reduce [to set-path! p make do to-path p reduce [to-set-word w none]] ] ] ] ] I'm not sure it's enough... |
it's only a small part of the function | |
Anton 21-Sep-2006 [5373x2] | usage example of add-relation ? |
eg.. add-relation [...] <-- what's in the block. And what's the result supposed to be ? | |
Henrik 21-Sep-2006 [5375] | I'm rewriting my relations engine, if you remember that one. I need to traverse rel-obj via paths, so I store the path as words in a block. This is in order to maintain the current position in a deep object. The input can be any arbitrary path of words and values. If the values or words don't exist, they will be created on the fly. That's what I use 'p for. |
Anton 21-Sep-2006 [5376] | Ah I see. |
Henrik 21-Sep-2006 [5377] | the code with the do load mold... is supposed to insert a new object at the path position if the current value at that point is 'none. I removed some of that "if none?" logic for clarity. |
Anton 21-Sep-2006 [5378] | So rel-obj can start out completely empty, but fill with values afterwards ? |
Henrik 21-Sep-2006 [5379x2] | yes. an example could be if rel-obj was empty: add-relation [users male "Joe"] add-relation [users female "Jenny"] later on, when you look it up, it's supposed to look like: get-relation [users] == [male female] get-relation [users male] == ["Joe"] You can go deep: add-relation [users male "Joe" age-group "Senior"] And you can do reverse relations: add-relation [age-group "Senior" users "Joe"] |
the rules and structure is completely arbitrary, which is one of the stronger points of the relations engine. however the current version forces you to use a path block structure of [word value word value word value...] which forces you to choose a value that will not be used for branches where only one path should exist. that's why I'm doing a rewrite. | |
Anton 21-Sep-2006 [5381] | I suspect you are assuming you can extend objects, which cannot be done in rebol currently. |
Henrik 21-Sep-2006 [5382x2] | the relations engine already does that :-) |
but I need some more freedom in the path block | |
Anton 21-Sep-2006 [5384x2] | No, I mean extending objects and keeping the same object. |
>> a: make object! [] >> b: make a [new: none] >> same? a b == false | |
Henrik 21-Sep-2006 [5386] | yes, but that problem was solved long ago. |
Anton 21-Sep-2006 [5387] | ok. |
Henrik 21-Sep-2006 [5388] | I simply re-make the object with itself plus the new branch inside rel-obj. works fine, but there's some stuff to manage. |
Anton 21-Sep-2006 [5389] | I think you might have found a bug. I see something which I find hard to explain: |
Henrik 21-Sep-2006 [5390x2] | oh? |
well, I have to go to bed now, so good luck with the bug hunting :-) | |
Anton 21-Sep-2006 [5392x2] | >> obj: none == none >> path: [obj] == [obj] >> code: reduce [to-set-path path 'make to-path path [new: 123]] == [obj: make obj [new: 123]] >> print code/1/1 = 'obj true >> ?? code code: [obj: make obj [new: 123]] == [obj: make obj [new: 123]] >> do code == none ; <-- what a strange result ! >> ?? obj obj: none |
Same here. Sleepies :) | |
Gabriele 21-Sep-2006 [5394x2] | a path with only one element is probably not supported. |
(btw, you're doing make none [new: 123] so obviously you get none, Anton :) | |
Henrik 22-Sep-2006 [5396] | isn't a path with one element pretty useless then? I just wish that set would work on paths. it makes sense to me. |
Ingo 22-Sep-2006 [5397] | +1 for set on paths! |
Gabriele 22-Sep-2006 [5398] | a path with one element is useless indeed. you cannot create it normally; it's like words with a space, or issues with a space, and so on. they exist, but they are not "valid" in a strict sense. |
Anton 23-Sep-2006 [5399x2] | %/C/ Pretty useless directory path - it's only got one element. |
Gabriele, oops about the none. | |
Henrik 23-Sep-2006 [5401] | I see the problem. A path can represent different things, so if your path is not representing anything yet, then REBOL won't know how to deal with it as opposed to setting a word with 'set. |
Anton 23-Sep-2006 [5402x5] | No, wait a minute, this code is what I meant (just changes the first line): |
obj: make object! [] path: [obj] code: reduce [to-set-path path 'make to-path path [new: 123]] print code/1/1 = 'obj ?? code do code ?? obj | |
OBJ seems not to have been changed by doing the code. Gabriele has seen that a set-path! with only one element doesn't work, but you can use a set-word! instead, because they're conceptually the same, and they look the same: >> to-set-path path == obj: >> to-set-word path/1 == obj: | |
So this seems to work: code: reduce [either 1 = length? path [to-set-word pick path 1][to-set-path path] 'make to-path path [new: 123]] | |
Hmm.. I think I agree with Gabriele - the path with one element molds just like a word, so it would not load back correctly. Mold/all could be made to handle 1-element paths specially, writing the datatype eg: #[path! [obj]] Is it worth it, though ? | |
older newer | first last |