World: r3wp
[Rebol School] Rebol School
older newer | first last |
Gerard 12-Jul-2011 [3688x3] | I think the same about every different aspect of REBOL for newbies. this is what misses from the actual doc. When we limit ourselves to use REBOL as another procedural orand functional language, it's relatively easy to master but when we have to delve more deeply into other aspects which would require more tools - or a more precedently acquired deepness about languages internals (kike globals storage allocastion and representation vs local ones in contexts and functions for example or even the bind mechanism - then there is some missing parts. And I agree, this is the same for Parse and the way constructs have to be thought to eventually become a master at creating new patterns easily - not mimicing others without learning (this is the first step nevertheless - whatever we are using which is new and we never met before ) ... Carl already resolved some part of this challenge with his Cookbook and How-to guides but more material needs to be covered and parse fits this need ... Not to formal and not too informal is the rule and the way to go from my POV. : ) |
I think this is why one of his last Blog's post asked for some PARSE idioms - but not a lot were submitted - this could be a real starter to help him put new docs online - when he will find some time after R3 is beta released ... But the best time to have new ideas is when we modify something and since PARSE has been modified, then may be some nimimal doc in between could be released to start many of us in the right direction ... | |
May be just extracting some parse rules from older work already running well would help us - at least pointing the material to us with some nice comments about what has been done (but often the problem domain and all is needed to solve it causes some noise preventing learnerd to distinguish the trees from the forest ... This is how most of us learned as far as now, isn't it ? ;-) | |
Maxim 12-Jul-2011 [3691x2] | yeah, I think for now, just having a dedicated rebol-parsing site which tries to market itself independently of REBOL would be nice. by independently, I mean that its content is valuable enough that it attracts new users to REBOL. REBOL parsing is still one of still most powerfull feature and a lot of techies out there would use it if they new it existed. |
... still one of *its* most powerfull ... | |
james_nak 12-Jul-2011 [3693] | This was a great discussion on an important topic. When I look at the participant's names and think, man, if you guys think it's hard, just think what it is for the regular person. :-) Last week I wrote a simple x-10 dialect and used the info from reboltutorial to get me started and I often go back to www.codeconscious.com/rebol/parse-tutorial.html for Brett's "sort of" parse tutorial. But you're right, to get answers to "why" something doesn't work would be helpful. It may seem obvious to Ladislav, but my friend I know you are a genius. I remember your presentation at the first devcon and wondering, "What in the world did that guy say?" |
Maxim 12-Jul-2011 [3694] | yeah, All of Brett's pages are awesome. |
james_nak 12-Jul-2011 [3695] | In a way, they have been the standard for a lot of my inquiries. I think it's because I personally learn best by example. I know some, if not most of you can actually figure things out given some information. It seems so logical, and it is. |
Maxim 12-Jul-2011 [3696] | it took me years before I decided to tackle a real PARSE problem. it was painfull to learn, but once its done, I realized that PARSEing is actually quite easy. much moreso than regexp at least. |
Ladislav 12-Jul-2011 [3697x2] | words, wishes... Did you contribute to the above mentioned dedicated RT-independent rebol-parsing compendium? |
(that was meant especially for Max, as a question) | |
Maxim 12-Jul-2011 [3699] | no, and my comments where not wishes or critiscism, they where just an observation. for newbies, this is what is mostly missing, that's all. I'm pretty good at parsing nowadays, but I have 0%time to write docs. |
Ladislav 12-Jul-2011 [3700x2] | Then why do you even suggest (together with Henrik, to be fair), that there is no "RT-independent REBOL parsing compendium"? |
My understanding is, that you did not bother to read it exactly like Henrik, while feeling knowledgeable enough to criticize its contents... | |
BrianH 12-Jul-2011 [3702] | Holding out for a real book, Maxim? |
Henrik 12-Jul-2011 [3703] | And Ladislav still fails to understand why this is not a good way to learn PARSE. (ok, back to work) |
Ladislav 12-Jul-2011 [3704x4] | How come you don't even know it contains lots of parsing examples? |
For Henrik, the best way to learn Parse is to read the source code of the PARSE function. I have got a surprise for you. None of: general formal grammars, BNF, regular expressions, TDPL, PEGs, etc... are taught by showing source code of some implementation and telling the user to learn the respective system from it | |
Such an approach would be unreasonable for the majority of the people. | |
Moreover, BNFs, general formal grammars, etc... are actually systems that are meant to be usable for humans as well (at least mostly), in which case there is no implementation you could show to other people. (somebody wanting to show an x-ray picture of a human brain, or what???) | |
BrianH 12-Jul-2011 [3708] | There is no general best way to teach parsing. Most people (if you include non-programmers) won't be able to learn it with any method. For the people who can learn it, different methods are more effective for different people. For some people, reading the source is the best method. For most others it isn't. Teaching hard subjects is hard. |
Maxim 12-Jul-2011 [3709] | yep. |
Geomol 12-Jul-2011 [3710] | I agree. Late studies in learning show, some children learn by doing, some need to hear it explained, some can learn by reading, some need to do something physical while learning, etc. I guess, it's the same with adults. |
BrianH 12-Jul-2011 [3711x2] | I worked on a project that failed because it depended on teaching parsing to unskilled data entry people - not my idea, and I couldn't explain to the people in charge why it was a bad one, because even teaching that was hard. It would be great if it were otherwise. |
Actually, it depended on unskilled data entry people being able to write parse specs without being taught - even worse. | |
Geomol 12-Jul-2011 [3713] | I couldn't explain to the people in charge why it was a bad one Many people in charge isn't well positioned for their job. And they're often very hard to fire. |
Maxim 12-Jul-2011 [3714x2] | yeah, its probably deeply rooted into how skill someone is at perceptions of different types. its like trying to dance with an arythmic person... they just can't do it even if they love the music! |
(last comment related to Geomol's comment on learning) | |
Steeve 12-Jul-2011 [3716] | - "You're unable to convince someone to change his mind with a logical argument, If that someone is wrong because of illogical ruling." I don't remember the exact citation |
Maxim 12-Jul-2011 [3717] | shit it - shit out ;-) |
Steeve 12-Jul-2011 [3718] | Sorry I should have say "parameter" instead of "argument" Or maybe not ;-) |
Maxim 12-Jul-2011 [3719x2] | (as opposed to shit in - shit out hehe that wasn't a typo... it might have been too subtle) |
are you mixing up groups? | |
Steeve 12-Jul-2011 [3721x2] | lol |
I was reacting to that one: I couldn't explain to the people in charge why it was a bad one | |
Awi 10-Aug-2011 [3723] | Is there something like reform/with ["id" "name" "address" "city"] "," where there result will be "id,name, address,city" in rebol? |
Awi 11-Aug-2011 [3724] | I've found a solution replace/all reform ["id" "name" "address" "city"] " " "," |
Sunanda 11-Aug-2011 [3725] | That may not always give you what you'd expect if the strings have embedded spaces: replace/all reform ["id" "last name" "address" "city"] " " "," == "id,last,name,address,city" This may work better in that situation: skip head remove back tail remove back tail replace/all mold ["id" "last name" "address" "city"] {" "} "," 2 |
Henrik 11-Aug-2011 [3726x2] | it would be so nice to have an interleave function, or an opposite of extract. |
reform interleave ["id" "name" "address" "city"] "," | |
Awi 11-Aug-2011 [3728x3] | Thanks Sunanda for pointing the issue, this should have saved me from debugging predictable error in the future :-) |
@Henrik: I just read about ReBin http://www.rebol.com/article/0044.html . Yes, this would be what I'm looking for. A binary representation of valid Rebol values. | |
sorry, wrong chatroom | |
Endo 11-Aug-2011 [3731x3] | I'm using this function to do that: merge: func [b [block!] /local t r] [parse b [some [t: any-type! (append r: "" join form first t either tail? next t [""][","])]] r] >> merge ["a" 5 *] == "a,5,*a,5,*" |
can be easily extended to use optional separator char. | |
Oops! Sorry small mistake, here is the correct one :) merge: func [b [block!] /local t r] [r: copy "" parse b [some [t: any-type! (append r join form first t either tail? next t [""][","])]] r] | |
Gregg 11-Aug-2011 [3734x3] | Here's my version. |
; A dialected version of this could be very flexible; allowing more ; than just fixed size groupings. ; This could also be done by adding a /SKIP refinement to INSERT. delimit: func [ ;[throw catch] "Insert a delimiter between series values." series [series!] "Series to delimit. Will be modified." value "The delimiter to insert between items." /skip ;<-- be sure to use system/words/skip in this func size [integer!] "The number of items between delimiters. Default is 1." ][ ; Hmmm, I wonder if we could extend the function spec dialect ; to include constraints like this declaratively? And should ; we trap the arg like this, or just use MAX to make sure we ; have a positive value? I think I'll do the latter for now, ; but leave this here as a comment. ;if all [size not positive? size] [ ; throw make error! join [script invalid-arg] size ;] ; By default, delimiters go between each item. ; MAX catches zero and negative sizes. size: max 1 any [size 1] ; If we aren't going to insert any delimiters, just return the series. ; This check means FORSKIP should always give us a series result, ; rather than NONE, so we can safely inline HEAD with it. if size + 1 > length? series [return series] ; We don't want a delimiter at the beginning. series: system/words/skip series size ; Use size+n because we're inserting a delimiter on each pass, ; and need to skip over that as well. If we're inserting a ; series into a string, we have to skip the length of that ; series. i.e. the delimiter value is more than a single item ; we need to skip. size: size + any [ all [list? series 0] ; lists behave differently; no need to skip dlm. all [any-string? series series? value length? value] all [any-string? series length? form value] 1 ] head forskip series size [insert/only series value] ] | |
make-csv: func [block] [rejoin delimit copy block #","] | |
Endo 12-Aug-2011 [3737] | Nice indeed. Here is improved version of mine: merge: func [ "Merge a block using a delimiter. Default is coma." b [block!] "Block to merge." /with c [char! string!] "Delimiter char or string." /local t r ] [ r: make string! 64 c: any [c ","] parse reduce b [some [t: any-type! ( append r join first t either tail? next t [""][c] )]] r ] |
older newer | first last |