BTW, it seems you don't need to do much to fix the issue. Basically, you just do
1) Put the body of parse_entry into $ldelay(...) 2) Change stream_vt_make_cons into stream_vt_cons There may be a few other things but they should all be very minor. On Saturday, March 4, 2017 at 9:47:07 PM UTC-5, gmhwxi wrote: > > I took a glance at your code. > > I noticed a very common mistake involving the use of > stream (or stream_vt). Basically, the way stream is used > in your code is like the way list is used. This causes the > stack issue you encountered. > > Say that you have a function that returns a stream. In nearly > all cases, the correct way to implement such a function should > use the following style: > > fun foo(...): stream_vt(...) = $ldelay > ( > ... > ) > > The idea is that 'foo' should return in O(1) time. The body of $ldelay > is only evaluated with the first element of the returned stream is neede. > Sometimes, this is call full laziness. Without full laziness, a stream may > behave like a list, defeating the very purpose of using a stream. > > On Saturday, March 4, 2017 at 7:27:03 PM UTC-5, August Alm wrote: >> >> I've spent few hours trying to figure out how to make proper use of npm >> and gave up--for now. If the project turns into something more serious >> (i.e., useful to others) then I will have another go at it. For now my >> naive attempts at making effective use of linear streams can be witnessed >> at GitHub: https://github.com/August-Alm/ats_csv_lexer Any and all >> comments on how to improve are appreciated. >> >> Best wishes, August. >> >> Den fredag 3 mars 2017 kl. 23:57:54 UTC+1 skrev gmhwxi: >>> >>> One possibility is to build a npm package and then publish it. >>> >>> If you go to https://www.npmjs.com/ and seach for 'atscntrb'. You can >>> find >>> plenty packages. You may need to install npm first. >>> >>> If you do build a npm package, I suggest that you choose a name space for >>> yourself. E.g., atscntrb-a?a-..., where ? is the first letter of your >>> middle name. >>> >>> On Fri, Mar 3, 2017 at 5:48 PM, August Alm <augu...@gmail.com> wrote: >>> >>>> How would I best share larger code portions? I have no concerns about >>>> my making my mistakes public, heh. >>>> >>>> I believe everything is lazy as-is (all data is >>>> [stream_vt("sometype")]). And I've tried to write tail-recursive >>>> functional >>>> code. The algorithm is based on two mutually recursing functions, "fun ... >>>> and ..", similar to how you did things in your csv-parser (thanks for >>>> pointing out that piece of code). However, I cannot set them up with "fn* >>>> .. and .." to enforce a local jump because they call each other in a too >>>> intertwined way. Might that be it? >>>> >>>> >>>> Den fredag 3 mars 2017 kl. 23:32:15 UTC+1 skrev gmhwxi: >>>>> >>>>> You are welcome! >>>>> >>>>> Since I have not seen your code, I could only guess :) >>>>> >>>>> Usually, what you described can be fixed by using tail-recursion, or >>>>> by using lazy-evaluation. The former approach is straightforward. You >>>>> just need to identify the function or functions that cause the deep >>>>> stack >>>>> usage. Then try to rewrite using tail-recursion. >>>>> >>>>> >>>>> >>>>> On Fri, Mar 3, 2017 at 5:25 PM, August Alm <augu...@gmail.com> wrote: >>>>> >>>>>> Hi! >>>>>> I had indeed made a logical error that caused any stream with >>>>>> "carriage return" followed by "newline" to recurse indefinitely. Thank >>>>>> you >>>>>> for your patience and pedagogical instincts, Professor! There is still >>>>>> some >>>>>> issue though, one that I believe is more subtle. I fixed the logical >>>>>> error >>>>>> and my algorithm now handles all the test cases you suggested. However, >>>>>> when fed an actual CSV-file with a thousand rows and about 300 columns >>>>>> it >>>>>> still segfaults--unless I manually increase the stack space on my >>>>>> computer! >>>>>> I don't know exactly where the critical limit is, but increasing it from >>>>>> 8192 kbytes to 65536 certainly did the trick. The whole file parsed >>>>>> without >>>>>> problem, and rather quickly at that. It seems my algorithm makes too >>>>>> much >>>>>> use of stack allocation and that I may have to rethink some of my >>>>>> (would-be) optimization choices. >>>>>> Best wishes, >>>>>> August >>>>>> >>>>>> Den fredag 3 mars 2017 kl. 15:22:00 UTC+1 skrev gmhwxi: >>>>>>> >>>>>>> Now you may do the following tests: >>>>>>> >>>>>>> Try: >>>>>>> >>>>>>> val ins = streamize_string_char("a;b") // should work >>>>>>> >>>>>>> Try: >>>>>>> >>>>>>> val ins = streamize_string_char("a;b\n") // may not work >>>>>>> >>>>>>> Try: >>>>>>> >>>>>>> val ins = streamize_string_char("a;b\015\012") // should cause crash >>>>>>> >>>>>>> On Thursday, March 2, 2017 at 9:21:21 PM UTC-5, gmhwxi wrote: >>>>>>>> >>>>>>>> When tried, I saw the following 5 chars (ascii) in small.csv: >>>>>>>> >>>>>>>> 97 >>>>>>>> 59 >>>>>>>> 98 >>>>>>>> 13 >>>>>>>> 10 >>>>>>>> >>>>>>>> My testing code: >>>>>>>> >>>>>>>> #include"share/atspre_staload.hats" >>>>>>>> #include"share/HATS/atspre_staload_libats_ML.hats" >>>>>>>> >>>>>>>> implement main0 () = { >>>>>>>> val inp = fileref_open_exn("small.csv", file_mode_r) >>>>>>>> val ins = streamize_fileref_char(inp) >>>>>>>> val ins = stream2list_vt(ins) >>>>>>>> val ins = g0ofg1(list_vt2t(ins))97 >>>>>>>> val ( ) = println! ("length(ins) = ", length(ins)) >>>>>>>> val ( ) = (ins).foreach()(lam c => println!(char2int0(c))) >>>>>>>> (* >>>>>>>> val lexed = lex_csv(true, ';', ins) >>>>>>>> *) >>>>>>>> val () = fileref_close(inp) >>>>>>>> (* >>>>>>>> val h = (lexed.head()) >>>>>>>> val- CSV_Field(r) = h >>>>>>>> val a = r.csvFieldContent >>>>>>>> val () = println!(a) >>>>>>>> *) >>>>>>>> } >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> On Thu, Mar 2, 2017 at 9:13 PM, August Alm <...> wrote: >>>>>>>> >>>>>>>>> Just "a;b", or? (Attached.) >>>>>>>>> >>>>>>>>> Den fredag 3 mars 2017 kl. 03:03:08 UTC+1 skrev gmhwxi: >>>>>>>>>> >>>>>>>>>> I suspect that the file you used contains other characters. >>>>>>>>>> >>>>>>>>>> What is in "small.csv"? >>>>>>>>>> >>>>>>>>>> On Thu, Mar 2, 2017 at 8:52 PM, August Alm <...> wrote: >>>>>>>>>> >>>>>>>>>>> The file compiles (I've tried a few compiler options) and "gdb >>>>>>>>>>> run" yields >>>>>>>>>>> >>>>>>>>>>> Program received signal SIGSEGV, Segmentation fault. >>>>>>>>>>> 0x00007ffff783eea5 in _int_malloc (av=0x7ffff7b6a620 >>>>>>>>>>> <main_arena>, bytes=16) at malloc.c:3790 >>>>>>>>>>> >>>>>>>>>>> The frames 0-3 involve allocation functions that are not >>>>>>>>>>> particular to my file. Frame 4 says: >>>>>>>>>>> >>>>>>>>>>> #4 __patsfun_28__28__14 (arg0=<optimized out>, >>>>>>>>>>> env1=0x605540, env0=10 '\n') at csv_lexer_dats.c:9023 >>>>>>>>>>> 9023 ATSINSmove_con1_new(tmpret63__14, postiats_tysum_7) ; >>>>>>>>>>> >>>>>>>>>>> My not-so-educated guess is that this refers to making a >>>>>>>>>>> cons-cell of a stream. >>>>>>>>>>> >>>>>>>>>>> But: How can my function do just fine when manually fed >>>>>>>>>>> >>>>>>>>>>> cons('a', cons( ';', sing('b'))): stream_vt(char), >>>>>>>>>>> >>>>>>>>>>> but segfault when I use [streamize_fileref_char] to construct >>>>>>>>>>> the very same stream from the string "a;b" in a file? Where is the >>>>>>>>>>> room for >>>>>>>>>>> an infinite recursion in that? >>>>>>>>>>> >>>>>>>>>>> Thank you, >>>>>>>>>>> August >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> Den torsdag 2 mars 2017 kl. 23:04:35 UTC+1 skrev August Alm: >>>>>>>>>>>> >>>>>>>>>>>> Hi! >>>>>>>>>>>> >>>>>>>>>>>> I'm in over my head and tried writing a CSV-parser using linear >>>>>>>>>>>> lazy streams. My code thus far is 600 lines and almost to my own >>>>>>>>>>>> surprise I >>>>>>>>>>>> get it to compile! However, there is something fishy because I get >>>>>>>>>>>> a >>>>>>>>>>>> segfault when applying my program to an actual CSV-file. I've been >>>>>>>>>>>> trying >>>>>>>>>>>> to debug using gdb but the fault eludes me. Since I don't expect >>>>>>>>>>>> anyone to >>>>>>>>>>>> mull through 600 lines of code, I am hoping these code snippets >>>>>>>>>>>> are enough >>>>>>>>>>>> for one of you guys to give me some advice. >>>>>>>>>>>> >>>>>>>>>>>> This code executes just fine: >>>>>>>>>>>> >>>>>>>>>>>> implement main0 () = { >>>>>>>>>>>> >>>>>>>>>>>> val test = stream_vt_make_cons( >>>>>>>>>>>> 'a', stream_vt_make_cons( >>>>>>>>>>>> ';', >>>>>>>>>>>> stream_vt_make_sing('b'))) (* the stream ('a', ';', 'b') >>>>>>>>>>>> *) >>>>>>>>>>>> val lexed = lex_csv(true, ';', test) >>>>>>>>>>>> val h = (lexed.head()) >>>>>>>>>>>> val- CSV_Field(r) = h >>>>>>>>>>>> val a = r.csvFieldContent >>>>>>>>>>>> val () = println!(a) >>>>>>>>>>>> >>>>>>>>>>>> } >>>>>>>>>>>> >>>>>>>>>>>> Here [lex_csv] is my 600-line alogrithm. It reads a >>>>>>>>>>>> [stream_vt(char)] and gives back a [stream_vt(CSVEntry)], where >>>>>>>>>>>> [CSVEntry] >>>>>>>>>>>> is a record type, one of whose fields is [CSVFieldContent]. When >>>>>>>>>>>> executing >>>>>>>>>>>> the program I get "a" printed to the console. >>>>>>>>>>>> >>>>>>>>>>>> This code results in a segfault: >>>>>>>>>>>> >>>>>>>>>>>> implement main0 () = { >>>>>>>>>>>> >>>>>>>>>>>> val inp = fileref_open_exn("small.csv", file_mode_r) >>>>>>>>>>>> val ins = streamize_fileref_char(inp) >>>>>>>>>>>> val lexed = lex_csv(true, ';', ins) >>>>>>>>>>>> val () = fileref_close(inp) >>>>>>>>>>>> val h = (lexed.head()) >>>>>>>>>>>> val- CSV_Field(r) = h >>>>>>>>>>>> val a = r.csvFieldContent >>>>>>>>>>>> val () = println!(a) >>>>>>>>>>>> >>>>>>>>>>>> } >>>>>>>>>>>> >>>>>>>>>>>> The file "small.csv" only contains the string "a;b". Hence I >>>>>>>>>>>> would expect this code to give the result as the previous one! >>>>>>>>>>>> But, it >>>>>>>>>>>> doesn't just return something else, it segfaults. >>>>>>>>>>>> >>>>>>>>>>>> gdb indicates there is a malloc problem having to do with >>>>>>>>>>>> "GC_clear_stack_inner", in case that's helpful. (I'm a >>>>>>>>>>>> mathematician who >>>>>>>>>>>> recently left academia after postdoc and decided to teach myself >>>>>>>>>>>> programming to become more useful outside of academia; hence I >>>>>>>>>>>> understand >>>>>>>>>>>> type systems and the like--the mathy stuff--a lot better than I >>>>>>>>>>>> understand >>>>>>>>>>>> memory allocation and other stuff that most programmers are >>>>>>>>>>>> supposed to be >>>>>>>>>>>> confident with.) >>>>>>>>>>>> >>>>>>>>>>>> What could be the problem here? >>>>>>>>>>>> >>>>>>>>>>>> Best wishes, >>>>>>>>>>>> August >>>>>>>>>>>> >>>>>>>>>>>> -- >>>>>>>>>>> You received this message because you are subscribed to the >>>>>>>>>>> Google Groups "ats-lang-users" group. >>>>>>>>>>> To unsubscribe from this group and stop receiving emails from >>>>>>>>>>> it, send an email to ats-lang-user...@googlegroups.com. >>>>>>>>>>> To post to this group, send email to ats-lan...@googlegroups.com >>>>>>>>>>> . >>>>>>>>>>> Visit this group at >>>>>>>>>>> https://groups.google.com/group/ats-lang-users. >>>>>>>>>>> To view this discussion on the web visit >>>>>>>>>>> https://groups.google.com/d/msgid/ats-lang-users/69535c5c-eac3-472c-bb39-062ad4708a72%40googlegroups.com >>>>>>>>>>> >>>>>>>>>>> <https://groups.google.com/d/msgid/ats-lang-users/69535c5c-eac3-472c-bb39-062ad4708a72%40googlegroups.com?utm_medium=email&utm_source=footer> >>>>>>>>>>> . >>>>>>>>>>> >>>>>>>>>> >>>>>>>>>> -- >>>>>>>>> You received this message because you are subscribed to the Google >>>>>>>>> Groups "ats-lang-users" group. >>>>>>>>> To unsubscribe from this group and stop receiving emails from it, >>>>>>>>> send an email to ats-lang-user...@googlegroups.com. >>>>>>>>> To post to this group, send email to ats-lan...@googlegroups.com. >>>>>>>>> Visit this group at https://groups.google.com/group/ats-lang-users >>>>>>>>> . >>>>>>>>> To view this discussion on the web visit >>>>>>>>> https://groups.google.com/d/msgid/ats-lang-users/e608c7bb-42ce-457b-a606-9fe3525f801d%40googlegroups.com >>>>>>>>> >>>>>>>>> <https://groups.google.com/d/msgid/ats-lang-users/e608c7bb-42ce-457b-a606-9fe3525f801d%40googlegroups.com?utm_medium=email&utm_source=footer> >>>>>>>>> . >>>>>>>>> >>>>>>>> >>>>>>>> -- >>>>>> You received this message because you are subscribed to the Google >>>>>> Groups "ats-lang-users" group. >>>>>> To unsubscribe from this group and stop receiving emails from it, >>>>>> send an email to ats-lang-user...@googlegroups.com. >>>>>> To post to this group, send email to ats-lan...@googlegroups.com. >>>>>> Visit this group at https://groups.google.com/group/ats-lang-users. >>>>>> To view this discussion on the web visit >>>>>> https://groups.google.com/d/msgid/ats-lang-users/34dfad01-9bd4-464f-9ccd-6dfae8207f4c%40googlegroups.com >>>>>> >>>>>> <https://groups.google.com/d/msgid/ats-lang-users/34dfad01-9bd4-464f-9ccd-6dfae8207f4c%40googlegroups.com?utm_medium=email&utm_source=footer> >>>>>> . >>>>>> >>>>> >>>>> -- >>>> You received this message because you are subscribed to the Google >>>> Groups "ats-lang-users" group. >>>> To unsubscribe from this group and stop receiving emails from it, send >>>> an email to ats-lang-user...@googlegroups.com. >>>> To post to this group, send email to ats-lan...@googlegroups.com. >>>> Visit this group at https://groups.google.com/group/ats-lang-users. >>>> To view this discussion on the web visit >>>> https://groups.google.com/d/msgid/ats-lang-users/c2f9d2b7-61f5-4142-b8b2-930147ee589d%40googlegroups.com >>>> >>>> <https://groups.google.com/d/msgid/ats-lang-users/c2f9d2b7-61f5-4142-b8b2-930147ee589d%40googlegroups.com?utm_medium=email&utm_source=footer> >>>> . >>>> >>> >>> -- You received this message because you are subscribed to the Google Groups "ats-lang-users" group. To unsubscribe from this group and stop receiving emails from it, send an email to ats-lang-users+unsubscr...@googlegroups.com. To post to this group, send email to ats-lang-users@googlegroups.com. Visit this group at https://groups.google.com/group/ats-lang-users. To view this discussion on the web visit https://groups.google.com/d/msgid/ats-lang-users/cdb799aa-eb1d-43ed-9b10-f8c4abaf6dcd%40googlegroups.com.