AltME groups: search
Help · search scripts · search articles · search mailing listresults summary
world | hits |
r4wp | 18 |
r3wp | 193 |
total: | 211 |
results window for this page: [start: 201 end: 211]
world-name: r3wp
Group: Parse ... Discussion of PARSE dialect [web-public] | ||
Steeve: 29-Apr-2011 | >[skip to "[" | to end] should be even better | |
Steeve: 29-Apr-2011 | > [skip to "[" | end skip] skip an extra loop by exiting with a fail | |
Geomol: 1-May-2011 | I've thought some more about [thru end], which return false in the R2 version, but return true in R3. My version return false as R2, but I better understand the R3 way, now I've programmed it. It can be seen as, how THRU should be understood (, as also Ladislav said something about)? Do we think of [thru rule] as [to rule rule] or [to rule skip] ? If the TO keyword can handle complex rules like: parse [a b] [to ['a 'b] ['a 'b]] then the first might make better sense, and [thru end] should return true. But we can't parse like that in R2, so maybe we think more of it as the second, and then [thru end] should return false. But if you look in my version, I have to catch this special case, where END follows THRU, so it takes more code, which isn't good. In any case, Ladislav's suggestion to use [end skip] as a fail rule is much better. If you're not at the end, the first word (end) will give false, else the next will fail, as you can't skip past end. | |
Geomol: 2-May-2011 | Yes, and that should work in all cases, if the b rule is found, complex or not. And this will return true, if b is END, because END is a repeatable rule (you can't go past it with SKIP). NONE is also repeatable, and if you look in the code, I have to take care of this too separately. This mean, we can't parse none of datatype none! by using the NONE keyword, but we can using a datatype: >> parse reduce [none] [none] == false >> parse reduce [none] [none!] == true So it raises the question, if the NONE keyword should be there? What are the consequences, if we drop NONE as a keyword? And are there other repeatable rules beside END and NONE? In R2 or R3. | |
Geomol: 4-May-2011 | [any end]Êand [some end] As we don't have warnings, I suggest these to produce errors. They can produce endless loops, and that should be pointed out in the docs, if they don't produce errors. [opt end] Yes, it's legit, but what's the point of this combination? At best, the programmer knows, what she does, and the combination will do nothing else than slowing the program down. At worst, the programmer misinterpret this combination, and since it doesn't produce an error or anything, it's a source of confusion. I suggest to make it produce an error. [into end] Produces an error today, so fine. [set end ...] and [copy end ...] I wasn't thinking of [set var end], but about setting a var named end to something, like [set end integer!]. Problem with this is, that now the var, end, can be used and looks exactly like the keyword, end, maybe leading to confusion. But after a second thought, maybe this being allowed is ok. [thru end] Making this produce an error will solve the problem with the confusion around, what this combination mean. And in the first place, it's a bad way to produce a 'fail' rule (in R2, in R3 it has the value true, and parsing continues). It's slow compared to e.g. [end skip]. | |
BrianH: 4-May-2011 | If you're going to make a better parse, it might be good to take into account the efforts that have already started to improve it in R3. The R3 improvements need a little work in some cases, but the thought that went into the process is quite valuable. [set end ...] or [copy end ...]: In R3, using any PARSE keyword (not just 'end) in a rule for other reasons triggers an error. >> parse [a] [set end skip] ** Script error: PARSE - command cannot be used as variable: end [any end] or [some end]: What Ladislav said. [opt end]: The point of the combination is [opt [end (do something)]]. [opt anything] is no more useless than [opt end]. Don't exclude something that has no effect just for that reason. Remember, [none] has no effect as well, but it's still valuable for making rules more readable. | |
Ladislav: 31-Oct-2011 | I guess, that this should be efficient: alpha: make bitset! [#"a" - #"z" #"A" - #"Z"] escape-amps: func [ text [string!] entities [hash!] /local result pos1 pos2 ][ result: copy "" parse/all text [ pos1: any [ ; find the next amp thru #"&" pos2: [ ; entity check some alpha pos3: #";" ( ; entity candidate unless find entities copy/part pos2 pos3 [ ; not an entity insert insert tail result copy/part pos1 pos2 "amp;" pos1: pos2 ] ) | ( ; not an entity insert insert tail result copy/part pos1 pos2 "amp;" pos1: pos2 ) ] | (insert tail result pos1) end skip ; no amp found ] ] result ] | |
Ladislav: 31-Oct-2011 | This alternative does not use the COPY call, so, it has to be faster: alpha: make bitset! [#"a" - #"z" #"A" - #"Z"] escape-amps: func [ text [string!] entities [hash!] /local result pos1 pos2 pos3 ][ result: copy "" parse/all text [ pos1: any [ ; find the next amp thru #"&" pos2: [ ; entity check some alpha pos3: #";" ( ; entity candidate unless find entities copy/part pos2 pos3 [ ; not an entity insert insert/part tail result pos1 pos2 "amp;" pos1: pos2 ] ) | ( ; not an entity insert insert/part tail result pos1 pos2 "amp;" pos1: pos2 ) ] | (insert tail result pos1) end skip ; no amp found ] ] result ] | |
Dockimbel: 1-Dec-2011 | Endo: in your first attempt, your second rule in SOME block is not making the input advance when the end of the string is reached because (remove "") == "", so it enters an infinite loop. A simple fix could be: t: "abc56xyz" parse/all t [any [digit (prin "d") | x: skip (prin "." remove x) :x]] (remember to correctly reset the input cursor when modifying the parsed series) As others have suggested, they are more optimal ways to achieve this trimming. | |
Gregg: 2-Dec-2011 | load-csv: func [ "Parse newline delimited CSV records" input [file! string!] /local p1 p2 lines ] [ lines: collect line [ parse input [ some [p1: [to newline | to end] p2: (line: copy/part p1 p2) skip] ] ] collect/only rec [ foreach line lines [ if not empty? line [rec: parse/all line ","] ] ] ] | |
Group: Core ... Discuss core issues [web-public] | ||
Ladislav: 19-Feb-2012 | MAP is an associative (Key <-> Value) data "storage". In R2 a correspoding way would be to use the hash! datatype, however, if you want to discern keys from values you need to use a separate Keys hash! and a separate Values block, otherwise you end up having Keys and Values intermixed. Your way of using the /skip refinement and a block is slower, however it searches only in Keys as well due to the /skip 2 use. When not used, it would search in Values. |
201 / 211 | 1 | 2 | [3] |