World: r3wp
[Parse] Discussion of PARSE dialect
older newer | first last |
Gordon 29-Jun-2006 [1105x2] | In the phrase. "Print index :x", what does putting a colon before a variable do again? |
Oops I meant "Print index? :x" | |
Izkata 29-Jun-2006 [1107] | Not sure - I remember seeing it in others' parse rules, so I just put it there and it worked '^^ Take it out and see what happens lol |
Gordon 29-Jun-2006 [1108] | :) |
Izkata 29-Jun-2006 [1109] | I think it was like get-word or something |
BrianH 29-Jun-2006 [1110x3] | ; Did you try this? data: read/lines to-file Readfile fields: [note category flag] foreach x data [ set fields parse x "," ; do something ] |
In particular, remember not to use parse/all | |
>> parse {"Hello, World", "Blah"} "," == ["Hello, World" "Blah"] | |
Gordon 29-Jun-2006 [1113] | Hi BrianH; Yes I did try that and the problem was that even though I specified the "," as the delimiter, it came across an embedded quote #"^"" and split the input at the quote. Rebol Shouldn't have split it up that way, to my understanding. I will post some simple data to test. |
BrianH 29-Jun-2006 [1114x2] | Embedded quotes should be escaped somehow. |
Please include some troublesome data if you could. | |
Gordon 29-Jun-2006 [1116] | This data was exported by PalmOS. I like the Palm desktop for keeping track on notes/,memos addresses but the search engine sucks badly. Therefore I wanted to export the data to allow a nice Rebol search on it.. Therefore, the PalmOS export function does "escape" an embedded quote by quoting it again. Ex: Press the "Home" button becomes Press the Home button. |
Tomc 29-Jun-2006 [1117] | truth (as far as i know) is: word is is a shortcut for :word but there are a few places such as inside parse where the shortcut does not work so you need to make it explicit |
Gordon 29-Jun-2006 [1118x4] | I will get some troubleshooting data posted in a minute. |
Tomc: Do I understand that :word would be like "get word" except in a parse sentence? | |
Wait I said that wrong | |
Tomc: Do I understand that :word would be like "get word" and needed in a parse sentence but you can just use the shortcut 'word' most everywhere else? | |
BrianH 29-Jun-2006 [1122] | The colon before the word prevents the interpreter from evaluating active values like functions and parens. It's a safety thing. |
Tomc 29-Jun-2006 [1123x3] | works for me |
you can use :word everywhere you would use word | |
as far as i know | |
BrianH 29-Jun-2006 [1126] | Except when you want an active value assigned to the word to be evaluated, like when you are calling a function. |
Tomc 29-Jun-2006 [1127] | and that would be get 'word not get word |
BrianH 29-Jun-2006 [1128] | In parse rules the :word means something different (not in the code blocks in parens). |
Gordon 29-Jun-2006 [1129] | Thanks Tomc and BrianH. I'll chew on it for a while. Meanwhile I'm working on building some test data for the first problem. |
Tomc 29-Jun-2006 [1130] | in the pars rume (not the paren) it means "be here now" |
Gordon 29-Jun-2006 [1131x2] | okay so in the parse rules (except in a parenthesized code block) it means "be here now"? |
but what does 'be here now' mean? | |
Tomc 29-Jun-2006 [1133] | to change to point you are in what you are parsing backtracking or jumping ahead |
Gordon 29-Jun-2006 [1134] | Thanks |
BrianH 29-Jun-2006 [1135] | Setting the parse position. |
Tomc 29-Jun-2006 [1136] | inside the parens it means what is in what I am parsing at the point pointed to by :word |
Anton 30-Jun-2006 [1137] | BrianH, correct except not, I think, parens: >> foreach word [(1 + 2)][print mold word] (1 + 2) |
BrianH 30-Jun-2006 [1138] | That's interesting. Parens and paths used to be active - oh yeah, that was changeda while ago. Still, there are some value types that are active (function types, lit-path, lit-word) and if you think you will get one of these you should disable their evaluation by referencing them with a get-word, unless you intend them to be evaluated. |
Anton 30-Jun-2006 [1139x2] | parens changed at around View 1.2.10 |
both parens and paths changed between View 1.2.1 and 1.2.5, actually. | |
DideC 30-Jun-2006 [1141x2] | Gordon: I did not read this thread in a whole but as for converting CSV string to/from Rebol blocks, here is some fully functionnal functions : |
;***** Conversion function from/to CSV format csv-to-block: func [ "Convert a string of CSV formated data to a Rebol block. First line is header." csv-data [string!] "CSV data." /separator separ [char!] "Separator to use if different of comma (,)." /without-header "Do not include header in the result." /local out line start end this-string header record value data chars spaces chars-but-space ; CSV format information http://www.creativyst.com/Doc/Articles/CSV/CSV01.htm ] [ out: copy [] separ: any [separ #","] ; This function handle replacement of dual double-quote by quote while copying substring this-string: func [s e] [replace/all copy/part s e {""} {"}] ; CSV parsing rules header: [(line: copy []) value any [separ value] (if not without-header [append/only out line])] record: [(line: copy []) value any [separ value] (append/only out line)] value: [any spaces data any spaces (append line this-string start end)] data: [start: some chars-but-space end: | #"^"" start: any [some chars | {""} | #"," | newline] end: #"^""] chars: complement charset rejoin [ {"} separ newline] spaces: charset exclude { ^-} form separ chars-but-space: exclude chars spaces parse/all csv-data [header any [newline record] any newline end] out ] block-to-csv: func [ "Convert a block of blocks to a CSV formated string." blk-data [block!] "block of data to convert" /separator separ "Separator to use if different of comma (,)." /local out csv-string record value v ] [ out: copy "" separ: any [separ #","] ; This function convert a string to a CSV formated one csv-string: func [val] [head insert next copy {""} replace/all copy val {"} {""} ] record: [into [some [value (append out #",")]]] value: [set v string! (append out csv-string v) | set v any-type! (append out form v)] parse/all blk-data [any [record (remove back tail out append out newline)]] out ] | |
Graham 30-Jun-2006 [1143] | there's also the sql csv thingy in the library |
Gordon 30-Jun-2006 [1144] | DideC: Thanks. I've copied and pasted it for review and added it to my local public library. This script should be useful especially with the html help page. Documentation on a script is very rare and much appreciated. Graham: Did a search using "librarian" and search term of "sql cvs" and didn't come up with anything. Although, I think we've got it covered now anyhow. |
Graham 1-Jul-2006 [1145] | Trying to do some macro expansion in text ... This is not working :( expand-macros: func [tmp [string!] macros [block!] /local white-rule rule len lexp ] [ white-rule: charset [#" " #"^/"] foreach [macro expansion] macros [ len: length? macro lexp: length? expansion rule: compose/deep copy [ [ to here: white-rule (macro) white-rule ( change/part here expansion len ?? macro) lexp skip ] to end ] parse/all tmp [some [rule]] ] tmp ] |
BrianH 1-Jul-2006 [1146x2] | Are macros marked by some starting character? That would make this easier to implement. |
Also, it would help to know whether macro expansions can contain further macros. | |
Graham 1-Jul-2006 [1148] | no, they can be any characters (alphanumeric), but should not contain further macros. |
Tomc 1-Jul-2006 [1149] | ise if the macros are delimited you should be able to do it in one pass |
Graham 1-Jul-2006 [1150x3] | What I was trying to do above is to look for the macro text preceded by a space or newline, and ending in a space or newline. |
and then replace in situ. | |
leaving the whitespace unaffected. | |
Tomc 1-Jul-2006 [1153x2] | in that case sorting them from long to short to begin with will foil recursive macro rxpansion |
at the macros and expansons single tokens | |
older newer | first last |