Hi - Interesting question, neat recursive solution. Trying it out, I needed to escape the inner double quotes in the definition of other-quote:
: other-quote ( quote -- quote’ ) "\"" = "``" "\"" ? ; to pass the compiler, and all worked well. Cheers, ~cw On Sun, Oct 7, 2018 at 1:18 PM Luca Di Sera <bloodtype.si...@gmail.com> wrote: > Thanks a lot for the explanation. > > It was very clear and now it seems almost obvious where the error was. I > was able to correct another source I wrote where I was stuck on the same > error. > Your solution is beautiful. Code like yours is the reason I was drawn to > factor so much. > > I'm really thankful for the help, which was almost instantaneous. > > Thanks again, > Luca Di Sera > > Il giorno dom 7 ott 2018 alle ore 14:26 Alexander Ilin <ajs...@yandex.ru> > ha scritto: > >> A shorter way to write `other-quote`: >> >> : other-quote ( quote -- quote' ) >> "''" = "``" "''" ? ; >> >> 07.10.2018, 15:21, "Alexander Ilin" <ajs...@yandex.ru>: >> >> Hello, Luca! >> >> Such a humble email, I could not leave without an answer. Questions like >> this are completely appropriate on this mailing list. >> >> Here are a few changes I made to make your code compilable: >> >> WAS: >> : gather-input ( mapping -- seq\f ) >> readln ; >> >> CORRECT: >> : gather-input ( -- seq\f ) >> readln ; >> >> After that fix, the error you mentioned comes up, the one with the >> incorrect stack-effects in the `while` call. >> >> WAS: >> : solve ( -- ) >> quote-mapping [ gather-input ] [ prepare-input process-input ] while >> drop ; >> >> CORRECT: >> : solve ( -- ) >> quote-mapping [ gather-input *dup* ] [ prepare-input process-input ] >> while *2drop* ; >> >> The `while` word consumes one output of the first quotation (the `?` >> parameter), so you need to `dup` the output of `gather-input` to keep a >> copy on the stack for the next quotation. >> >> The general approach you took is fine in Factor, as far as I can see. >> Here is my solution, similar to yours, but with a slightly different choice >> of the stream reading method. It uses recursion instead of the `while` loop: >> >> >> USING: kernel io ; >> >> IN: 00272_TEX_Quotes >> >> : other-quote ( quote -- quote' ) >> "''" = [ "``" ] [ "''" ] if ; >> >> : process-input ( quote -- ) >> "\"" read-until swap [ write ] when* [ >> dup write other-quote process-input >> ] [ drop ] if ; >> >> : solve ( -- ) >> "``" process-input ; >> >> MAIN: solve >> >> This is how I tested it in the listener: >> "272.txt" utf8 [ solve nl ] with-file-reader >> >> 07.10.2018, 13:21, "Luca Di Sera" <bloodtype.si...@gmail.com>: >> >> Hello to all, >> >> I'm a beginner factor programming. >> I learned about factor in the "Seven More Languages in Seven Weeks" >> <https://pragprog.com/book/7lang/seven-more-languages-in-seven-weeks> >> book and could not avoid falling in love with it. >> I'm trying to learn it at work in my lunch-breaks and one of the projects >> I'm following as a didactical exercise is to use it as a secondary language >> ( to C++ ) to solve competitive programming exercises. >> >> Now, It is a few days that I'm stuck on some non-working code that I >> can't seem to solve on my own, for how embarrassing that is. >> First of all this is the code: >> >> >> USING: syntax sequences kernel io splitting ; >> >> IN: UVa.00272_TEX_Quotes.Factor.00272_TEX_Quotes >> >> >> >> CONSTANT: quote-mapping { "``" "''" } >> >> >> >> : switch-quote ( mapping x -- mapping x ) >> >> [ reverse ] dip ; >> >> >> >> : print-quote ( mapping x -- mapping x ) >> >> [ dup first write ] dip ; >> >> >> >> : gather-input ( mapping -- seq\f ) >> >> readln ; >> >> >> >> : prepare-input ( str -- seq ) >> >> "\"" split ; >> >> >> >> : process-input ( mapping seq -- mapping ) >> >> [ print-quote switch-quote write ] each ; >> >> >> >> : solve ( -- ) >> >> quote-mapping [ gather-input ] [ prepare-input process-input ] while >> drop ; >> >> >> >> MAIN: solve >> >> >> This code is a, currently in testing, solution to UVa 272 >> <https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=208> >> . >> What I was trying to do is the following : >> >> >> 1. Read all lines of input one by one >> 2. For each line that is read split it in a sequence where the " are >> 3. Print the sequence back with quotes between each element ( >> changing between closing and opening quotes ) >> >> Now, the main problems I'm getting with this codes are related to >> stack-effects. In particular after solving some of the errors the one I >> can't currently solve is the following: >> >> >> The word solve cannot be executed because it failed to compile >> >> >> >> The input quotations to “while” don't match their expected effects >> >> Input Expected Got >> >> [ gather-input ] ( ..a -- ..b ? ) ( x -- x ) >> >> [ prepare-input process-input ] ( ..b -- ..a ) ( x x -- x ) >> >> >> From my understanding, this is an unbalanced-branches-error. >> By reading the documentation I can see what this error is about, yet the >> reasons it is appearing and the method to correct the code are still flying >> over my head. >> I supposed it may have something to do with the way I'm passing the >> values around on the stack. >> >> Hoping this is an accepted topic on this mailing list, I was hoping >> someone could help me by explaining, or by providing resources I can deepen >> my understanding with, how this code should actually be written to work >> and if there is some essential-error I'm doing in using factor in this code >> ( And I would be most thankful for suggestion on how to actually write >> something like this in a Factor way ). >> >> >> >> ---=====--- >> Александр >> >> ,, >> >> _______________________________________________ >> Factor-talk mailing list >> Factor-talk@lists.sourceforge.net >> https://lists.sourceforge.net/lists/listinfo/factor-talk >> >> >> >> ---=====--- >> Александр >> >> _______________________________________________ >> Factor-talk mailing list >> Factor-talk@lists.sourceforge.net >> https://lists.sourceforge.net/lists/listinfo/factor-talk >> > _______________________________________________ > Factor-talk mailing list > Factor-talk@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/factor-talk >
_______________________________________________ Factor-talk mailing list Factor-talk@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/factor-talk