I should have been a bit clearer when I said my program didn’t work. It does, but only for fixed strings: there is none of the RE special character magic. And, I agree, the crucial question is how to construct a pattern from a string that treats the special characters as special characters, rather than just literals.
In passing, write( type( <abc> )) writes string, whereas write(type( <a[bc]*> )) writes pattern, which isn’t quite what I expected. I had quite high hopes for Arbno(), but soon realised that it wanted a pattern for its argument, not a string and, even when I fed it with a variable that had the type of pattern, it still didn’t work how I might have expected it to. At that stage, I asked my original question. If Clint’s “option #1" is "write a library procedure that parses the regex and builds the corresponding pattern”, I wonder whether Arbno() might be a suitable interface: i.e. if it’s a pattern already, do what it does now, otherwise turn the string into a pattern and then do it. Perhaps a separate procedure might be clearer. The reader with no time for trivia may profitably skip the rest of this message ... I may have found a use for Succeed: If I modify my program to be as below (additions in red: the reason for the strange comment at the end will be clear in a moment) procedure main(args) local f, line, re := pop(args) || Succeed() write(type(re)) every f := open(!args, "r") do { every line := !f do { if ( line ?? re ) then write(line) } } end #[dne][edn][den] If I use grep on this program source I get bash-3.2$ grep "[dne][edn][den]" gerp.icn local f, line, re := pop(args) || Succeed() end #[dne][edn][den] as expected: grep has found “eed", “end" and the regular expression itself in the final comment. Whereas, if I use the program on its own source code I get bash-3.2$ ./gerp "[dne][edn][den]" gerp.icn pattern #[dne][edn][den] showing that although I have a pattern, it isn’t interpreting the special characters. If I miss off the "|| Succeed()” from the initialisation of re and try again I get string #[dne][edn][den] I still get a pattern match, even though it’s a string not a pattern, but it’s the literal string that is matching. Therefore Succeed() may be used to turn a string into a pattern! Unfortunately not in a useful way. > On 29 Nov 2016, at 22:27, Jeffery, Clint (jeffe...@uidaho.edu) > <jeffe...@uidaho.edu> wrote: > > My thanks to Don, Jay, and anyone else who is trying out stuff related to > patterns. I am on the road ATM but will work on improving the diagnostics > related to Jay's experiments. Regarding Don's original request and Jay's > comments on it: backquotes in patterns is not a full "eval" interpreter that > will take arbitrary Icon strings and turn them into code. Maybe we need > that, and maybe someone will build it some day. In the meantime, after > figuring out the best workarounds that may be available, you can judge for > yourself whether the patterns are still useful, or whether they remain > unfinished business. > > The basic question is: given a regular expression supplied as string data s, > how best should we construct a corresponding pattern. The answer sadly is not > <`s`>. The Unicon translator has a parser for regular expressions and emits > pattern function calls for them, but we want to do it from the Unicon VM. > Options include: write a library procedure that parses the regex and builds > the corresponding pattern; write a library procedure that invokes the > translator to do the work and use dynamic loading to get the code loaded; > extend the language with a new built-in that does the same or similar; extend > the backquotes operator to do what we want here; or use another idea that you > think up. > > Don: great minds think alike. When I started to update the Unicon book to > talk about patterns, I immediately figured we needed to update the "grep" > example to use patterns, and came up against the same issue you're asking > about. I haven't implemented a solution yet, but perhaps we should do option > #1 and see what that looks like. > > Cheers, > Clint > From: Jay Hammond <homem...@talktalk.net <mailto:homem...@talktalk.net>> > Sent: Tuesday, November 29, 2016 1:55:07 PM > To: Don Ward; unicon-group@lists.sourceforge.net > <mailto:unicon-group@lists.sourceforge.net> > Subject: Re: [Unicon-group] Converting strings to patterns > > Hi Don, > I tried running your program. > To get it to do anything I had to change line 2, separate the local > declaration and the assignment. > to clarify, repat is a (new) variable that I intend to hold a pattern > procedure main(args) > local f, line, re > re := pop(args) > > write(re) > > repat := re > > every f := open(!args, "r") do { > while ( line := read(f) ) do { > if line ?? repat then write(line) > } > } > end > I created qqq.txt with the lines > QQQ > qqq > cqcqcq > and ran testpat QQQ qqq.txt after compiling testpat.icn > Output was > QQQ > then the contents of qqq.txt > as if repat always matches. (it has the null value??) > > I tried forcing repat to be a pattern (utr18 says that patterns are composed > of strings concatenated or alternated) so I tried > repat := re .| fail() > repat := re .| re > but the pattern building process gave me node errors at compile time. > dopat2.icn:6: # "re": syntax error (237;349) > File dopat2.icn; Line 16 # traverse: undefined node type > line 16 is the line after end in main, i.e. program source end. > > I tried using the -f s option at the compile step, so as to use unevaluated > expressions in patterns > like > repat := < `re` > > # that syntax ought to force a pattern! > node traversal errors again. And the backquotes were not recognised. Perhaps > I put the -f s option in the wrong place? > > I also tried > repat := < Q > || < Q > || < Q > > dopat2.icn:6: # "repat": invalid argument in augmented assignment > File dopat2.icn; Line 16 # traverse: undefined node type > so it is not considering || to be pattern concatenation > repat := < Q || Q || Q > > gave the same error! > > So although UTR18 seems to give options for converting strings to patterns I > have not had any luck so far. > > Jay > > On 29/11/2016 14:33, Don Ward wrote: >> Here is a very simple (and simple minded) grep program. The idea being to >> apply a Unicon regexp pattern to a series of files, just like grep >> >> procedure main(args) >> local f, line, re := pop(args) >> >> every f := open(!args, "r") do { >> every line := !f do { >> if line ?? re then write(line) >> } >> } >> end >> >> Of course, it doesn’t work because in line 6 I have a string instead of a >> pattern. >> >> Is there any way to convert the contents of re from a string to a pattern? >> >> After reading UTR18 again (and again), I’ve come to the conclusion that >> there isn’t any way to do it. >> The pertinent extract from UTR18 is in section 4.5.3 "Limitations due to >> lack of eval()”. >> But before I give up on the idea entirely, I thought I’d check to see if my >> understanding is correct. >> >> Don >> >> >> ------------------------------------------------------------------------------ >> >> >> _______________________________________________ >> Unicon-group mailing list >> Unicon-group@lists.sourceforge.net >> <mailto:Unicon-group@lists.sourceforge.net> >> https://lists.sourceforge.net/lists/listinfo/unicon-group >> <https://lists.sourceforge.net/lists/listinfo/unicon-group> > >
------------------------------------------------------------------------------
_______________________________________________ Unicon-group mailing list Unicon-group@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/unicon-group