AltME groups: search
Help · search scripts · search articles · search mailing listresults summary
world | hits |
r4wp | 250 |
r3wp | 2441 |
total: | 2691 |
results window for this page: [start: 2301 end: 2400]
world-name: r3wp
Group: Ann-Reply ... Reply to Announce group [web-public] | ||
Cyphre: 27-Oct-2010 | Maxim, it works for me now, cool. Some notes: -The usage/interface seems to me too clunky. Better would be something like: append win make gob! [ offset: ... size: ... data: context [ renderer: 'opengl ] draw: [trinagle ... sphere ... whatever] ;your 3d dialect here ] And that's it IMO there is no need for other 'bloat' around. -Since you are proposing the CGR philosophy: 1.is it possible to use more than one gl-gob ? I tried just a quick attempt but it failed for me. 2. is it possible to compose normal gobs together with the gl? I had no luck with this either. Regarding the performance: I don't think there is anything to comment at the moment because you are just using the raw/built-in OpenGL abilities (same stuff we did with Ladislav and Cal 5 years ago in R2). So talking here about FPS or number of polygons has the same information as saying: "I have older/newer gfx card" The fps is not related to the current code...everything is just direct HW executed calls. | |
Gregg: 28-Oct-2010 | %opengl-test.r3 ran fine. %opengl-simple-test.r3 crashed after a few seconds: @** Script error: cannot access window in path event/window/data ** Where: all -apply- wake-up loop -apply- wait forever catch either either -apply- do ** Near: all [ obj: event/window/data obj: select obj 'handle... Same error for complex tree. Happened on torus too, then I figured it out. The error occurs if I move the mouse over the animated area. Other than that, it looks very cool Max. | |
Group: !AltME ... Discussion about AltME [web-public] | ||
GrahamC: 7-Oct-2010 | Continuous improvement is the only path. Either Carl does this, or this product will be abandoned. | |
Maxim: 7-Oct-2010 | I guess cindy was tired of looking at them and it was either ebay or the garbage... ;-) | |
Gabriele: 14-Oct-2010 | (I am backing them up locally, by the way, if Carl needs anything) Proper backup tools can't do anything against the altme server overwriting the files. Either your filesystem supports snapshots, or the altme server has to support the backup operation directly at least by suspending file activity while the files are being copied (or, the file storage has to be designed so that files are immutable, that way at the very least you can't lose old data because of overwriting) | |
Izkata: 14-Oct-2010 | Yeah, it is kind of hidden... I probably wouldn't have thought to look in the Divider settings for it, either | |
Sunanda: 3-Nov-2010 | Renaming groups should have no effect on either REBOL.org's or REBOL.net's links (both use the persistent group number rather than its name). Taking a group from [web-public] to not web-public.....REBOL.net deletes the posts (that does break links). REBOL.org simply stops publishing newer posts. So all posts orginally [web-public] stay that way. | |
Gregg: 19-Nov-2010 | The clipboard under Windows doesn't always work consistently either. | |
MagnussonC: 11-Nov-2011 | IMHO I think you should consider what message your user naming convention send to new users. For me it says that you treat some persons differently. That is bad if you like more people to come here. No one want's to be treated differently. Either you let everyone use whatever name they like or all use the same rules. | |
Group: !REBOL3 GUI ... [web-public] | ||
Henrik: 15-Jan-2010 | no tabbed panels either | |
Cyphre: 19-Jan-2010 | We are using hinting. But on platforms where FreeType2 lib is used the hinting results can be not nice. This is because it depends how FreeType lib is compiled (either with the Apple hinter, or with the free non-commercialy licenced alternative) | |
Ashley: 25-Jan-2010 | ctx-rebgui3: make object! [ cursors: make object! [ app-start: 32650 hand: 32649 help: 32651 hourglass: 32650 arrow: 32512 cross: 32515 i-shape: 32513 no: 32648 size-all: 32646 size-nesw: 32643 size-ns: 32645 size-nwse: 32642 size-we: 32644 up-arrow: 32516 wait: 32514 ] colors: make object! [ page: white edit: white text: black true: leaf false: red link: blue theme: [165.217.246 0.105.207 0.55.155] outline: [207.207.207 160.160.160 112.112.112] ] metrics: make object! [ cell: 4 gap: cell * 2 line: cell * 5 margin: cell * 4 margin-size: as-pair margin margin radius: 2 ] ; Private functions set 'make-gob make function! [[ spec [block!] ; offset, size and one or more attribute/value pairs /data object /local size text gob axis ][ size: spec/2 if any [negative? size/x negative? size/y] [ text: select spec 'text all [block? text text: first find text string!] size: 8x4 + size-text make gob! compose [size: 9999x9999 text: (text)] all [negative? spec/2/x spec/2/x: size/x] all [negative? spec/2/y spec/2/y: size/y] ] gob: copy [] ; attributes are (text, color, effect, image and draw) foreach [attribute value] spec [ switch attribute [ box [ attribute: 'draw value: compose [ pen (get value/1) line-width 1 fill-pen (get value/2) box 0x0 (spec/2 - 1x1) (metrics/radius) ] ] pill [ attribute: 'draw axis: either spec/2/x >= spec/2/y [2] [1] value: compose/deep [ pen (colors/outline/3) line-width 1 grad-pen linear (spec/2/:axis * .1) (spec/2/:axis * .9) (all [axis = 2 90]) [(colors/outline/1) (white) (colors/outline/1)] box 0x0 (spec/2 - 1x1) (metrics/radius) ] ] ] append gob reduce [attribute value] ] spec: gob gob: make gob! compose [offset: spec/1 size: spec/2 (to set-word! spec/3) spec/4 data: (make object! any [object copy []])] foreach [attribute value] skip spec 2 [ append gob make gob! compose [offset: 0x0 size: spec/2 (to set-word! attribute) value] ] gob ]] ; Public functions set 'display make function! [[ title spec /local gob xy max-x max-y left-to-right? after-count after-limit here arg append-widget widget last-widget word action handler size text color ][ xy: metrics/margin-size max-x: xy/x max-y: xy/y left-to-right?: true after-count: 1 after-limit: 9999 gob: make gob! compose [text: (title) data: (make object! [])] append-widget: make function! [[][ unless widget [exit] unless handler [ handler: compose/deep [on-down: make function! [[event][(action)]]] ] append gob switch widget [ bar [ make-gob compose [(xy) (as-pair max-x - metrics/margin 1) color (colors/outline/3)] ] button [ all [none? size size: 15x5] make-gob/data compose/deep [(xy) (size * metrics/cell) pill none text [center (text)]] handler ] text [ all [none? size size: 15x5] make-gob/data compose/only [(xy) (size * metrics/cell) color (white) text (text)] handler ] ] last-widget: last gob/pane ; 1st reverse item? unless left-to-right? [ last-widget/offset/x: last-widget/offset/x - last-widget/size/x ] xy: last-widget/offset ; max vertical size max-y: max max-y xy/y + last-widget/size/y ; horizontal pos adjustments all [ left-to-right? xy/x: xy/x + last-widget/size/x max-x: max max-x xy/x ] ; after limit reached? either after-count < after-limit [ ; spacing xy/x: xy/x + either left-to-right? [metrics/gap] [negate metrics/gap] ++ after-count ] [ xy: as-pair metrics/margin max-y + metrics/gap after-count: 1 ] all [:word set :word last-widget] word: widget: action: handler: size: text: color: none ]] parse reduce/only spec [after bar button handler return reverse rich text] [ any [ opt [here: set arg paren! (here/1: do arg) :here] [ 'return ( append-widget xy: as-pair metrics/margin max-y + metrics/gap left-to-right?: true after-limit: 9999 ) | 'reverse ( append-widget xy: as-pair max-x max-y + metrics/gap left-to-right?: false after-limit: 9999 ) | 'after set arg integer! ( ; return unless this is first widget if widget [ append-widget xy: as-pair metrics/margin max-y + metrics/gap ] after-count: 1 after-limit: arg ) | 'handler set arg block! (handler: arg) | 'rich set arg block! (text: arg) | [set arg integer! | set arg pair!] (size: arg) | set arg string! (text: arg) | [set arg tuple! | set arg none!] (color: arg) | set arg block! (action: arg) | set arg set-word! (append-widget word: :arg) | set arg word! (append-widget widget: arg) ] ] ] append-widget gob/size: metrics/margin-size + as-pair max-x max-y gob/offset: system/view/metrics/work-size - gob/size / 2 append system/view/screen-gob gob show system/view/screen-gob ]] set 'undisplay make function! [[gob][ remove find system/view/screen-gob gob show system/view/screen-gob ]] ; Start global GUI event handler active-gob: none system/view/event-port: open [scheme: 'event] system/view/event-port/awake: make function! [[event /local evt gob][ evt: map-event event gob: evt/gob while [not object? gob/data] [gob: gob/parent] if all [event/type = 'move gob <> active-gob] [ attempt [active-gob/data/on-away event] active-gob: gob attempt [active-gob/data/on-over event] ] evt: to word! ajoin ['on- event/type] attempt [gob/data/:evt event] ]] ] | |
Graham: 3-Feb-2010 | I was just curious to see how Gab's systemm worked .. and I tried %test.r but >> do %test.r Script: "Test vid" Version: none Date: none Script: "REBOL View System Functions" Version: none Date: none Script: "rewrite-tree function" Version: none Date: none Script: "Simple dialect to create/resize gobs" Version: none Date: none Script: "REBOL VID 3: Definition of FACE prototype object" Version: none Date: n one Script: "REBOL VID 3: Functions" Version: none Date: none Script: "REBOL VID 3: Events Handling" Version: none Date: none Script: "REBOL VID 3: Styles" Version: none Date: none ** Script error: cannot MAKE/TO map! from: none! ** Where: make either make handler parse parse-set-dialect make-styles catch eit her either applier do catch either either applier do ** Near: make map! style-spec/options | |
Graham: 5-Feb-2010 | I don't like 'facets either ... | |
Henrik: 5-Feb-2010 | faced , I think is used in relation to "facing", which means what facets are facing ... something. No I don't like the word either. :-) From source: faced: ; OBJECT! - prototype of face/facets (face instance facets) object [ area-size: 0x0 ] | |
Henrik: 6-Feb-2010 | Either blocks in FACE/FACES or FACE/FACES doesn't exist. Some parts of a face is built dynamically as the layout is made, so if the part is not needed, it's not there. Yay for the ability to extend objects, I guess. :-) | |
Henrik: 15-Feb-2010 | seems you can't use reflection functions on events either. | |
Henrik: 26-Feb-2010 | ok, AltME doesn't work either... | |
Cyphre: 1-Mar-2010 | Gregg, yes it looks like that...either there is some bug in WAIT or WAIT is not letting CPU to get IDLE state anymore from some reason. | |
Cyphre: 2-Mar-2010 | Ah, so you are inserting the events system port not event port. That was the difference. I tried it here...works here in case the event loop doesn't contain any time consuming code(ie. is almost 'empty' as in your example). But when I add some 'load' into the loop then receiving of other event types is going to be rapidly limited/blocked when comparing to the FOREVER loop. Either I'm doing something wrong or inserting events from the awake handler somehow blocks the whole flow. | |
Cyphre: 3-Mar-2010 | Maxim, no problem, I have not much time either now so feel free to clarify any time later. I was just wondering what you are looking for to satisfy your needs. And of course, you cannot request functionality of big complex 3D systems which are usually fat high-level layers over low level graphics libraries. You should think about the DRAW at the level of graphic library api, not application layer. So I more awaited comparison with OpenGL, DIrectX, Cairo, Qt , Java2d and so on. Anyway, I'm curious about your examples.... Also I don't understand what is so wrong on using dialect as an interface when Rebol should be the case where working with blocks, dialects etc. should be a plus. For example If you prefer interface based on function calls over dialect the I'd like to know what benefits you see in that approach etc. | |
Pekr: 4-Mar-2010 | Steeve - your script reports some error here: >> do http://sites.google.com/site/rebolish/test-1/draw-shapes-22.r Script: "Untitled" Version: none Date: none ** Script error: Moved has no value ** Where: catch either either applier do ** Near: catch/quit either var [[do/next data var]] [data] | |
Henrik: 9-Mar-2010 | Looking at reactors now, this seems to be the way to store these emit functions. Reactors are more powerful than I thought and according to docs, under the place Graham links to above, we can write our own. The MAKE-REACTOR function doesn't exist though, it's called MAKE-FACE-ACTIONS. I hope to make use of triggers as well. Triggers are faces that are not stored in the layout after they have been processed. They are performed either when entering a panel during layour or when exiting it (possibly also other places). I hope that triggers can be used to pass specific options to already laid out faces, making triggers appear as options to a face. | |
Pekr: 13-Mar-2010 | Script: "Untitled" Version: none Date: none ** Script error: skip does not allow word! for its offset argument ** Where: catch either either applier do ** Near: catch/quit either var [[do/next data var]] [data] | |
Maxim: 29-Apr-2010 | in R2, the console is a window that is controled by the application. in R3, for now, the console is controled by the OS. Windows does not allow an application to be either a windows app or a console app. | |
Pekr: 10-May-2010 | Henrik - is there any resolution to resizing system? I know that we both objected to max-size element for e.g., and IIRC there were some proposals of how to either fix current model, or replace it with different one. Have you made any decisions in that regard yet? | |
Robert: 3-Jun-2010 | IMO this could be doen by using different actors and reactors based on platform ID. Either it's all included or pre-processed. Maybe it's even possible to load a module with all the actors and reactors for the specific platform. | |
Pekr: 24-Jun-2010 | Cool, because I did not like RebGUI resizing either, dunno why. Maybe because I was not getting what I exptected ... | |
Henrik: 24-Jun-2010 | Posted 5 shots: http://rebol.hmkdesign.dk/files/r3/gui/212.png from 212 to 216. I think they need some explanation from either Ladislav or Cyphre. | |
Cyphre: 25-Jun-2010 | Hello guys, just few notes from my side regarding the layout sematics and min/max-size etc: -the layout will be still as simple as in the current R3GUI -most of the time only 'style maker' will need to handle min/max/init size of the specific style -by default layout elements have to be organized either in PANEL or GROUP structures (though it is possible create your super special style for circular layouts or whatever ;)) -at the PANEL/GROUP layout level there will be only three kinds of elements: 1) style with absolute size (in any axis) 2) style with elastic size (in any axis) 3) optional RETURN keyword used for line breaking to create variable number of rows/cols(default ehaviour is to set fixed number of cols/rows for GROUP/PANEL) -to achieve more complex layout user can redefine min/max sizes according his needs | |
Cyphre: 28-Jun-2010 | AdrianS: as I said in my last message here, "-by default layout elements have to be organized either in PANEL or GROUP structures (though it is possible create your super special style for circular layouts or whatever ;))" By this I meant there will be two default 'layout generator' styles GROUP and PANEL but you can create own styles that will generate their content differently. | |
Ladislav: 26-Jul-2010 | Resizing news: the latest state is, that there are two "container styles", the first one being a group - a layout in which graphic objects are arranged into either rows or columns, not necessarily into *both rows and columns* at the same time, the second one is a panel - a layout in which graphic objects are arranged into both rows and columns at the same time. | |
Ladislav: 26-Jul-2010 | in group the objects are organized into either rows or columns (internally lines all the time), i.e. XY is misleading | |
Ladislav: 26-Jul-2010 | Summary: in a group, objects are arranged into lines, that are handled depending on the LAYOUT-MODE as either rows or columns | |
Pekr: 26-Jul-2010 | so the group style can lay things in either rows, or solumns, or both? | |
Pekr: 26-Jul-2010 | Well, group style layouts things in either rows, or columns, depending upon layout-mode argument. The panel style layouts styles in both directions? | |
Ladislav: 26-Jul-2010 | We can go along with Group and Panel, as Pekr suggests, no problem either | |
Gregg: 26-Jul-2010 | On naming, I think PANEL is too general and doesn't describe the layout behavior. I could live with it though. I agree that TABLE should be saved as that is the common term for the spreadsheet model. GRID was used for that for a long time, and still is sometimes, but GRID could also be good when thought of as a canonical grid layout. GRID-LAY, CANON-LAY, or TABLET aren't too inspiring either. | |
Anton: 5-Aug-2010 | I think I would reword the doc string a bit for grammatical consistency. It looks like it should be either "Set" and "perform", or "Sets" and "performs". | |
Graham: 11-Aug-2010 | I don't' read Chinese either but there doesn't seem to be any spacing between the words | |
Cyphre: 12-Aug-2010 | Graham, sorry, I really don't know the rules how code points in Unicode should be positioned. That needs to be studied and corrrections being made in the text rendering/layouting loop. Just a note, even now the text rendering/layouting code ismore than 50Kb of C++ code so either someone needs to study all the Unicode rules and make new replacement or publish patches to the current version. | |
BrianH: 12-Aug-2010 | Who wasn't doing UIs. There are downsides to either approach. | |
BrianH: 12-Aug-2010 | It won't be transparent either way. Either you need to specify the direction of the coordinate system (declarative overhead) or specify the transform (procedural overhead). And there will be computing overhead either way. | |
BrianH: 12-Aug-2010 | The question model is which is more efficient to use, both at development time and runtime. Letters will be tough either way (likely more for bottom-up), but graphics will be simpler bottom-up until display time. | |
Maxim: 12-Aug-2010 | cause it rasterizes in that direction. is my guess. its calculations actually aren't different either way. | |
Group: !REBOL3 ... [web-public] | ||
BrianH: 13-May-2011 | >> stats/series == [16384 11618 4590 25 151 150 199] >> a: [1 2 3] == [1 2 3] >> stats/series == [16384 11623 4601 25 135 134 202] Only one of those is the new block - the rest are overhead of either the STATS function or of the REPL loop itself, or runtime overhead, or call overhead, or assignment overhead. I'm starting to think that STATS/series isn't very useful. | |
BrianH: 13-May-2011 | Maxim, a series reference only contains a pointer to the internal series structure and either a pointer to the offset or a 32bit index (Carl could say which). The internal series structure could have a pointer to the start of the series, or it could be a header of the series data itself, depending on which is better for memory allocation. What you see in extensions are marshalled values, not regular R3 stack frames or other value slots. | |
Andreas: 20-May-2011 | R3 won't utilise more than 1 core either way :) | |
Kaj: 21-May-2011 | Global variable space should be the special object holding global values in R2. That's not the symbol table, either | |
Geomol: 24-May-2011 | About logic, I guess, it's related to a wish to use PICK with logic argument. It works like this for SKIP: >> skip [a b] true == [a b] >> skip [a b] false == [b] and you can use PICK instead of EITHER sometimes like: value: pick [1 2] b > 1 instead of value: either b > 1 [1] [2] | |
Geomol: 24-May-2011 | Yes, the initial imagined behaviour is turned around with logic. :) The PICK method is also faster than the EITHER method, if it's simple values to pick. If you have to reduce the block, the EITHER method is faster, as EITHER already reduce its blocks. | |
Pekr: 13-Jun-2011 | This is by far the longest period of Carl's disappearance, IIRC. The reasons we can only speculate about - some personal/family difficulcies, burn-out to the REBOL topic, new daily job, which does not left you with much energy and free time to do some other stuff, REBOL related. We tried to get Carl's answer on R3 Chat, only with sporadic answer of recent Carl's job. But no answers to "what's next" for the REBOL. The reasons might be various again - Carl is willing to proceed, he just dosn't have time/energy. He is most probably not willing to open-source the project either, which gets us into kind of schizophrenic situation - no open-source, no progress either. If Carl would know the answer to what's next for REBOL question, he would already share it with us. But he did not do so, yet, which is a bit disappointing of course. As for a phone call - I don't know - I would not call him, as it could get him into feeling, that we push him to give us an answer, which he might not have right now. But - I think that call from some friend, e.g. Reichart, would be accepted differently. But then - we can't push anyone to do anything, and from few weeks old discussion I think that Reichart does not necessarily feel urge to do such a thing, which is OK too. So ... we wait ... and RED progresses at least, so hopefully in the end, there is still the chance that we will see the light in the end of the tunnel :-) | |
Gregg: 17-Jul-2011 | The original was written before MAP-EACH and the new COLLECT. Here is the source I have, updated to use those as the current version does, but with the last rule reverted to the original. Related cc reports: http://issue.cc/r3/1096 http://issue.cc/r3/690 split: func [ "Split a series into pieces; fixed or variable size, fixed number, or at delimiters" series [series!] "The series to split" dlm [block! integer! char! bitset! any-string!] "Split size, delimiter(s), or rule(s)." /into "If dlm is an integer, split into n pieces, rather than pieces of length n." /local size count mk1 mk2 ][ either all [block? dlm parse dlm [some integer!]] [ map-each len dlm [ either positive? len [ copy/part series series: skip series len ] [ series: skip series negate len ; return unset so that nothing is added to output () ] ] ][ size: dlm ; alias for readability collect [ parse/all series case [ all [integer? size into] [ if size < 1 [cause-error 'Script 'invalid-arg size] count: size - 1 size: round/down divide length? series size [ count [copy series size skip (keep/only series)] copy series to end (keep/only series) ] ] integer? dlm [ if size < 1 [cause-error 'Script 'invalid-arg size] [any [copy series 1 size skip (keep/only series)]] ] 'else [ ; = any [bitset? dlm any-string? dlm char? dlm] [any [mk1: some [mk2: dlm break | skip] (keep copy/part mk1 mk2)]] ] ] ] ] ] | |
Gregg: 17-Jul-2011 | split: func [ "Split a series into pieces; fixed or variable size, fixed number, or at delimiters" series [series!] "The series to split" dlm [block! integer! char! bitset! any-string!] "Split size, delimiter(s), or rule(s)." /into "If dlm is an integer, split into n pieces, rather than pieces of length n." /local size piece-size count mk1 mk2 res fill-val add-fill-val ][ either all [block? dlm parse dlm [some integer!]] [ map-each len dlm [ either positive? len [ copy/part series series: skip series len ] [ series: skip series len ; return unset so that nothing is added to output () ] ] ][ size: dlm ; alias for readability res: collect [ parse/all series case [ all [integer? size into] [ if size < 1 [cause-error 'Script 'invalid-arg size] count: size - 1 piece-size: to integer! round/down divide length? series size if zero? piece-size [piece-size: 1] [ count [copy series piece-size skip (keep/only series)] copy series to end (keep/only series) ] ] integer? dlm [ if size < 1 [cause-error 'Script 'invalid-arg size] [any [copy series 1 size skip (keep/only series)]] ] 'else [ ; = any [bitset? dlm any-string? dlm char? dlm] [any [mk1: some [mk2: dlm break | skip] (keep/only copy/part mk1 mk2)]] ] ] ] ;-- Special processing, to handle cases where the spec'd more items in ; /into than the series contains (so we want to append empty items), ; or where the dlm was a char/string/charset and it was the last char ; (so we want to append an empty field that the above rule misses). fill-val: does [copy either any-block? series [[]] [""]] add-fill-val: does [append/only res fill-val] case [ all [integer? size into] [ ; If the result is too short, i.e., less items than 'size, add ; empty items to fill it to 'size. ; We loop here, because insert/dup doesn't copy the value inserted. if size > length? res [ loop (size - length? res) [add-fill-val] ] ] ; integer? dlm [ ; ] 'else [ ; = any [bitset? dlm any-string? dlm char? dlm] ; If the last thing in the series is a delimiter, there is an ; implied empty field after it, which we add here. case [ bitset? dlm [ ; ATTEMPT is here because LAST will return NONE for an ; empty series, and finding none in a bitest is not allowed. if attempt [find dlm last series] [add-fill-val] ] char? dlm [ if dlm = last series [add-fill-val] ] string? dlm [ if all [ find series dlm empty? find/last/tail series dlm ] [add-fill-val] ] ] ] ] res ] ] | |
Gregg: 17-Jul-2011 | split: func [ "Split a series into pieces; fixed or variable size, fixed number, or at delimiters" series [series!] "The series to split" dlm [block! integer! char! bitset! any-string!] "Split size, delimiter(s), or rule(s)." /into "If dlm is an integer, split into n pieces, rather than pieces of length n." /local size piece-size count mk1 mk2 res fill-val add-fill-val ][ either all [block? dlm parse dlm [some integer!]] [ map-each len dlm [ either positive? len [ copy/part series series: skip series len ] [ series: skip series negate len ; return unset so that nothing is added to output () ] ] ][ size: dlm ; alias for readability res: collect [ parse/all series case [ all [integer? size into] [ if size < 1 [cause-error 'Script 'invalid-arg size] count: size - 1 piece-size: to integer! round/down divide length? series size if zero? piece-size [piece-size: 1] [ count [copy series piece-size skip (keep/only series)] copy series to end (keep/only series) ] ] integer? dlm [ if size < 1 [cause-error 'Script 'invalid-arg size] [any [copy series 1 size skip (keep/only series)]] ] 'else [ ; = any [bitset? dlm any-string? dlm char? dlm] [any [mk1: some [mk2: dlm break | skip] (keep/only copy/part mk1 mk2)]] ] ] ] ;-- Special processing, to handle cases where the spec'd more items in ; /into than the series contains (so we want to append empty items), ; or where the dlm was a char/string/charset and it was the last char ; (so we want to append an empty field that the above rule misses). fill-val: does [copy either any-block? series [[]] [""]] add-fill-val: does [append/only res fill-val] case [ all [integer? size into] [ ; If the result is too short, i.e., less items than 'size, add ; empty items to fill it to 'size. ; We loop here, because insert/dup doesn't copy the value inserted. if size > length? res [ loop (size - length? res) [add-fill-val] ] ] ; integer? dlm [ ; ] 'else [ ; = any [bitset? dlm any-string? dlm char? dlm] ; If the last thing in the series is a delimiter, there is an ; implied empty field after it, which we add here. case [ bitset? dlm [ ; ATTEMPT is here because LAST will return NONE for an ; empty series, and finding none in a bitest is not allowed. if attempt [find dlm last series] [add-fill-val] ] char? dlm [ if dlm = last series [add-fill-val] ] string? dlm [ if all [ find series dlm empty? find/last/tail series dlm ] [add-fill-val] ] ] ] ] res ] ] | |
Rebolek: 18-Aug-2011 | A bug? >> a: [false] == [false] >> either a/1 [true][false] == true | |
Ladislav: 18-Aug-2011 | No, try this: a: [#[false]] either a/1 [true][false] | |
Rebolek: 18-Aug-2011 | I solved it using either get a/1 [true][false] | |
Ladislav: 19-Aug-2011 | As I see it, the rule should be, that either you wish the function you create to be modified/modifiable and then you should use the property of the MAKE function, or you don't wish that, and in that case other functions should not help to do it. | |
Pekr: 7-Sep-2011 | Ladislav - I don't mind you thinking I am wrong, as I might be easily misunderstood. This time though, I insist. You either know what has to be done to support your effort, or you don't, which is often the case of good engineers ... | |
Ladislav: 7-Sep-2011 | You either know what has to be done to support your effort, or you don't, which is often the case of good engineers ... - that is typical for you, an unrelated thing. You ignored Karl Robillard's effort, so it is your ignorance. I did not. | |
BrianH: 8-Oct-2011 | Yes, we've made other functions help work around the potential security weakness of MAKE function! - that's the tradeoff we made for efficiency. And as long as you either use COPY/deep generators like FUNC, or control the accessibility of your source, it's a really good tradeoff. | |
BrianH: 9-Oct-2011 | I'm curious: How can you get a word 'b bound to a function context, when the function is not running, you don't have access to the original function body, and all you have is a word 'a bound to that same context? No command or extension tricks either - they're already assumed to be unsafe. | |
Ladislav: 9-Oct-2011 | I'm curious: How can you get a word 'b bound to a function context, when the function is not running, you don't have access to the original function body, and all you have is a word 'a bound to that same context? No command or extension tricks either - they're already assumed to be unsafe. - I offer you this statement, which I *can* prove in a reasonable sense: - I assume, that F is a function having a context with more than one variable (Otherwise, there is nothing to prove, is there?) -, so, for the simplification, let's assume, that there are variables 'var-a and 'var-b in F's context, such that: - the Attacker has already access to the variable 'var-a bound to the F's context - , but he does not have the access to the variable 'var-b bound to the F's context yet - now, let's assume, that having access to the variable 'var-b in the F's context he would be able to "do some harm" (whatever that "harm" is) Provided, that the above conditions are met, the Attacker is already able to do the harm even not having the variable 'var-b bound to the F's context available yet. Do I have even to prove the statement? | |
BrianH: 9-Oct-2011 | The above statement requires either access to a word of the same spelling bound to the context. I'm talking about accessing a different word. | |
Ladislav: 9-Oct-2011 | Proof: 1) Due to the way how the function contexts are implemented in R3, the word 'b in F's context does not refer to a password when F is not running. 2) Because of that, I either cannot read the password at all, or have to be able to read it somehow, which is possible *only* when the function is running. (oherwise, there is no danger of me reading the password as is well known) 3) do I have to continue? | |
Ashley: 1-Nov-2011 | On a separate note, I want to standardize on either R2 or R3 for work (no GUI or SDK required). What are the advantages of R3 compared to R2 at present, and what (apart from GUI and SDK) can R2 do that R3 can't? | |
Andreas: 1-Nov-2011 | weak and underpowered CALL.No /output or /wait parameter IIRC. I agree with the general notion (that CALL is weak, atm), but: /wait is there (albeit not working on Linux, IIRC). /output is missing indeed. But CALL is fully doable as extension or from within the hostkit. So if anyone really needs it, it's a matter of either developing it yourself or funding the development. (Feel free to contact me, if interested in the latter.) | |
BrianH: 10-Nov-2011 | Alright, not "most of the time", just in this case. For others: >> 1 + 1.0 == 2.0 >> 1 + $1 == $2 >> 1 + 100% == 2.0 Maybe that's why it seems weird. I guess that since R3 char! values are currently limited to the codepoints in the BMP they are 16 bits, so converting back to char! would be a potential loss of range. It could go either way, so I guess the datatype-on-the-left rule is a way for the developer to specify which they want. And that rule applies to string types too (for INSERT and APPEND), so it's not completely weird. | |
Marco: 26-Nov-2011 | wish for R3 / Topaz / Red / World: I wish that refinements would be totally reworked (not R2 compatible :( ). Current situation with some examples: view/new/title/offset/options win "Dialog" 20x20 'resize remove_last: func [{remove last (n) element(s) of a series} serie [series!] /n num [integer!] ][ num: any [num 1] remove/part skip tail serie negate num num ] append: func [{Appends a value to the tail of a series and returns the series head.} series [series! port!] value /only ][ head either only [ insert/only tail series :value ] [ insert tail series :value ] ] New situation with different syntax and default values: view win /new true /title "Dialog" /offset 20x20 /options 'resize remove_last: func [{remove last (n) element(s) of a series} series [series!] /n: 1 [integer!] ][ remove skip tail series negate n /part n ] append: func [{Appends a value to the tail of a series and returns the series head.} series [series! port!] value /part /only /dup ][ head insert tail series :value /part part /only only /dup dup ] Note that append could also be redifined as: #macro append [] [head insert tail] | |
Ladislav: 23-Jan-2012 | defined?: func either rebol/version >= 2.100.0 [[ {find all defined words in the given context} context [any-object!] /local words ]][[ {find all defined words in the given context} context [object!] /local words ]][ words: first context remove-each word words [not value? word] words ] | |
Ladislav: 23-Jan-2012 | this looks more likely: defined?: either rebol/version >= 2.100.0 [ func [ {find all defined words in the given context} context [any-object!] /local words ][ words: words-of context remove-each word words [not value? word] words ] ][ func [ {find all defined words in the given context} context [object!] /local words ][ words: bind first context context remove-each word words [not value? word] words ] ] | |
Group: Core ... Discuss core issues [web-public] | ||
BrianH: 16-Oct-2010 | No refinement to MOLD needed. MOLD should know nothing about heredocs. Use a separate formatter function, like this: mold-heredoc: func [value tag [string!]] [ ajoin ["#[[" tag "^/" either string? :value [value] [mold :value] "^/" tag "]]"] ] | |
Ladislav: 16-Oct-2010 | Whether the tag is optional or not - well, I am not firmly at either side. Nevertheless, the empty tag can be considered a tag as well, just a special one. | |
GrahamC: 24-Oct-2010 | This is my attempt at a function that returns the object or value at the end of the given path. If there is nothing at the given path, it returns none. get-obj-value: func [ obj [object!] path [path! word!] /local id ][ if word? path [ path: to-path path ] either not empty? path [ either all [ id: in obj path/1 obj: get id ][ either 1 = length? path [ return obj ][ either object? obj [ get-obj-value obj remove copy path ][ return none ] ] ][ return none ] ][ obj ] ] improvements appreciated | |
Sunanda: 25-Oct-2010 | Not as far as I know, You could probe the system like this: write %tmp "one length" write %TMP "another length" either (get in info? %tmp 'size) = (get in info? %TMP 'size) ['insensitive]['sensitive] | |
Sunanda: 25-Oct-2010 | What I meant to write was: all [exists what-dir? exists? uppercase what-dir exists? lowercase what-dir] Plus then you need to check if info? is the same on all three. I think that covers your case......But is not perfect either .... It fails If the what-dir path happens to contain no case sensitive characters. It's tricky! | |
Oldes: 25-Oct-2010 | I take it back.. REBOL cannot have any idea what I want to do, so better to use compare function, like: sort-pairs: func[block-of-pairs][ sort/compare block-of-pairs func[a b][ either a/x < b/x [ 1 ][ either a/x = b/x [ either a/y < b/y [ 1 ][ either a/y > b/y [-1][0] ] ][ -1 ] ] ] ] sort-pairs [748x430 68x206 748x194 305x147] ;== [748x430 748x194 305x147 68x206] | |
GrahamC: 27-Oct-2010 | either write your own parser ... or use my smtp challenge :) | |
BrianH: 2-Nov-2010 | Post it to the idioms group in R3 chat #754, either the file, a link to the original, or as source in a message. | |
Ladislav: 14-Nov-2010 | switch: func [ "Selects a choice and evaluates what follows it." value "Value to search for." cases [block!] "Block of cases to search." /default case "Default case if no others are found." ][ either value: select cases value [do value] [ either default [do case] [none]] ] replace SELECT by SELECT/CASE | |
BrianH: 19-Nov-2010 | What should this function be called, and what options does it need? change-in: funct [key value] [ either a: find block key [change next a :value][ repend block [key :value] ] ] It basically implements the a/key: value operation of maps, but for series. | |
BrianH: 9-Dec-2010 | Note that the unless guard above is compatible with the R3 version. If either series is empty or at its tail at that position, it's a noop, silently. | |
BrianH: 9-Dec-2010 | But it looks like the error is triggered before the SQL call, so it looks like either the db or counter variables are none. | |
BrianH: 10-Dec-2010 | And not well enough documented either. I don't really know how /compare works, not completely. | |
Ladislav: 10-Dec-2010 | I know, that it is documented somewhere, that the Comparator can yield either logic! value or a number, where a negative number means "<", zero means "=", and a positive number means ">" | |
Sunanda: 10-Dec-2010 | BrianH <And not well enough documented either. I don't really know how /compare works, not completely.> Comparators and the stable-sort trick (-1, 0 +1) are documented here in an old change log. It never made it into the dictionary for SORT: http://www.rebol.com/docs/changes-2-5.html#section-72 | |
Ladislav: 16-Dec-2010 | ; implementation: swap-sub: func [ {swap the subseries using the SWAP-FIRST function} a [series!] b [integer!] /local la lb pa pb ][ pa: a la: b - 1 pb: skip a la lb: (length? a) - la while [all [la > 0 lb > 0]][ either la <= lb [ loop la [ swap-first pa pb pa: next pa pb: next pb ] pb: skip pa la lb: lb - la ][ pa: skip pa la - lb loop lb [ swap-first pa pb pa: next pa pb: next pb ] pa: skip pa negate la la: la - lb pb: skip pa la ] ] a ] | |
Ladislav: 16-Dec-2010 | this may look more readable: ; implementation: swap-n: func [ {swap n elements} a [series!] b [series!] n [integer!] ][ loop n [swap-first a b a: next a b: next b] ] swap-sub: func [ {swap the subseries using the SWAP-FIRST function} a [series!] b [integer!] /local la lb pa pb ][ pa: a la: b - 1 pb: skip a la lb: (length? a) - la while [all [la > 0 lb > 0]][ either la <= lb [ swap-n pa pb la pb: skip pa la lb: lb - la ][ pa: skip pa la - lb swap-n pa pb lb pa: skip pa negate la la: la - lb pb: skip pa la ] ] a ] | |
Ladislav: 16-Dec-2010 | swap-sub: func [ {swap the subseries using the SWAP-FIRST function} a [series!] b [integer!] /local la lb pa pb ][ pa: a la: b - 1 pb: skip a la lb: (length? a) - la while [all [la > 0 lb > 0]][ either la <= lb [ swap-n pa pb la pa: pb pb: skip pa la lb: lb - la ][ swap-n skip pa la - lb pb lb la: la - lb pb: skip pa la ] ] a ] swap-first: func [ {swap the first elements of A and B} a [series!] b [series!] /local t ][ k: k + 1 set/any 't first a change/only a first b change/only b get/any 't ] k: 0 swap-sub [1 2 3 4 5 6 7 8 9] 7 k ; == 6 | |
BrianH: 23-Feb-2011 | Here's a working version: map-each: func [ "Evaluates a block for each value(s) in a series and returns them as a block." [throw catch] 'word [word! block!] "Word or block of words to set each time (local)" data [block!] "The series to traverse" body [block!] "Block to evaluate each time" /into "Collect into a given series, rather than a new block" output [any-block! any-string!] "The series to output to" ; Not image! /local init len x ][ ; Shortcut return for empty data either empty? data [any [output make block! 0]] [ ; BIND/copy word and body word: either block? word [ if empty? word [throw make error! [script invalid-arg []]] copy/deep word ; /deep because word is rebound before errors checked ] [reduce [word]] word: use word reduce [word] body: bind/copy body first word ; Build init code init: none parse word [any [word! | x: set-word! ( unless init [init: make block! 4] ; Add [x: at data index] to init, and remove from word insert insert insert tail init first x [at data] index? x remove x ) :x | x: skip ( throw make error! reduce ['script 'expect-set [word! set-word!] type? first x] )]] len: length? word ; Can be zero now (for advanced code tricks) ; Create the output series if not specified unless into [output: make block! divide length? data max 1 len] ; Process the data (which is not empty at this point) until [ ; Note: output: insert/only output needed for list! output set word data do init unless unset? set/any 'x do body [output: insert/only output :x] tail? data: skip data len ] ; Return the output and clean up memory references also either into [output] [head output] ( set [word data body output init x] none ) ] ] | |
james_nak: 12-Mar-2011 | I'm learning more about what may be happening. According to the docs, I may be getting either a 401 or 404 error. More as I figure this out. | |
Group: !REBOL3 Proposals ... For discussion of feature proposals [web-public] | ||
BrianH: 9-Nov-2010 | Keep in mind that only *one* of those proposals for the new model of function behavior would be done. I am in favor of either "Definitional return with an option to not define RETURN and EXIT, dynamic return as a fallback" or "Definitional return with an option to not define RETURN and EXIT, no dynamic return". How about you? | |
Maxim: 9-Nov-2010 | right now.. my brain would choose this way: my-brain [ ] hour: 12h35AM options: [ "Dynamic return with optional transparency" "Definitional return only" "Dynamic-return-only functions vs. option of definitional-return-only functions" "Dynamic return with a definitional return option" "Definitional return with an option to not define RETURN and EXIT, dynamic return as a fallback" "Definitional return with an option to not define RETURN and EXIT, no dynamic return" ] either hour > 00:00:00 & hour < 06:00:00 [ select options random length? options ][ write altme://!REBOL3 Proposals/answer read http://www.rebol.net/wiki/Exceptions ] | |
BrianH: 9-Nov-2010 | Btw, Ladislav, thanks again for the CLOSURE constructor. If you hadn't come up with that great a solution then R2 likely wouldn't have gotten closures at all, and none of the other fake datatypes would have made it in either, which would have been a real tragedy if we missed out on the typeset! stuff. | |
BrianH: 9-Nov-2010 | If given a choice I would prefer only a single return type, dynamic or definitional. Definitional would be better, but we could work with either, as long as they have their version of the [throw] option. That means 6 or 1. | |
BrianH: 11-Nov-2010 | I really need to fill in the Exceptions page with the real differences and advantages of dynamic and definitional scoping. There are advantages that either has that the other does not. It would be a real loss to not have both in different circumstances. The different circumstances being definitional for returns and dynamic for breaks and throws. | |
BrianH: 11-Nov-2010 | Well it comes down to this: Functions are defined lexically. Though they are called dynamically, they aren't called until after they have already been bound, definitionally. But as a side effect of tasking, those bindings are stack-relative, and those stacks are task-local. But random blocks of code outside of functions are bound to object contexts, and those are *not* task-local. So that means that the old R2 practice of calling shared blocks of code is a really bad idea in R3 if any words are modified, unless there is some kind of locking or synchronization. This means that those blocks need to be moved into functions if their code is meant to be sharable, which means that at least as far as RETURN and EXIT are concerned, they can be considered lexically scoped. The advantage that we would get from being able to call a shared block of code and explicitly return in that block is moot, because we can't really do that much anymore. This means that we don't lose anything by switching to definitional code that we haven't already lost for other reasons. At least as far as functions are concerned, all task-safe code is definitional. Loops are also defined lexically, more or less, and the rebinding ones are also task-safe because they are BIND/copy'd to a selfless object context that is only used for that one call and thrown away afterwards. And most calls to loops are task-safe anyways because they are contained in functions. However, the LOOP, FORALL, FORSKIP and WHILE loops do not rebind at the moment. We actually prefer to use those particular loops sometimes in R3 code because they can be more efficient than *EACH and REPEAT, because they don't have that BIND/copy overhead. Other times we prefer to use *EACH or REPEAT, in case particular loop fits better, or has high-enough repetitions and enough word references that the 27% overhead for stack-local word reference is enough to be more than the once-per-loop BIND/copy overhead. Since you don't have to move blocks into *loops* to make them task-safe, you can use blocks referred to by word to hold code that would be shared between different bits of code in the same function. This is called manual common subexpression elimination (CSE), and is a common optimization trick in advanced REBOL code, because we have to hand-optimize REBOL using tricks that the compiler would do for us if we were using a compiled language. Also, PARSE rules are often called from loops, and they are frequently (and in specific cases necessarily) referred to by word instead of lexically nested; most of the time these rules can be quite large, maximizing BIND/copy overhead, so you definitely don't want to put the extensive ones in a FOREACH or a closure. Switching to definitional break would have three real downsides: * Every loop would need to BIND/copy, every time the loop is called, including the loops that we were explicitly using because they *don't* BIND/copy. * Code that is not nested in the main loop block would not be able to break from that loop. And code that is nested in the main loop would BIND/copy. * We can in theory catch unwinds, run some recovery code, and send them on their way (hopefully only in native code, see #1521). Definitional escapes might be hard or impossible to catch in this way, depending on how they are implemented, and that would mean that you couldn't recover from breaks anymore. The upside to definitional break would be that you could skip past a loop or two if you wanted to, something you currently can't do. Another way to accomplish that would be to add /name options to all the loop functions, and that wouldn't have the BIND/copy overhead. Or to use THROW or THROW/name. The situation with THROW is similar to that of the non-binding loops, but more so, still task-safe because of functions. But CATCH and THROW are typically the most useful in two scenarios: * Escaping through a lot of levels that would catch dynamic breaks or returns. * Premade custom escape functions that might need to enforce specific semantics. Both of these uses can cause a great deal of difficulty if we switched to definitional throw. In the first case, the code is often either broken into different functions (and thus not nested), or all dumped into a very large set of nested code that we wouldn't want to BIND/copy. Remember, the more levels we want to throw past, the more code that goes into implementing those levels. In the second case definitional throw would usually not work at all because the CATCH and the THROW would contained in different functions, and the code that calls the function wrapping the THROW would not be nested inside the CATCH. So you would either need to rebind every bit of code that called the THROW, or the definitional THROW would need to be passed to the code that wants to call it like a continuation (similar concept). Either way would be really awkward. On the plus side of dynamic (whatever), at least it's easy to catch an unwind for debugging, testing or recovery purposes. For that matter, the main advantage of using THROW/name as the basic operation that developers can use to make custom dynamic escape functions is that we can build in a standard way to catch it and that will work for every custom escape that is built with it. The end to the arms race of break-through and catch. | |
BrianH: 11-Nov-2010 | It's not task-safe either, but recursion-safety is more of an issue for now. | |
BrianH: 13-Nov-2010 | We could really use a native LET or SELFLESS - either would do, actually, and could be used to implement the other. |
2301 / 2691 | 1 | 2 | 3 | 4 | 5 | ... | 22 | 23 | [24] | 25 | 26 | 27 |