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 <august...@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-ea
>>>>>> c3-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/ms
>>>> gid/ats-lang-users/e608c7bb-42ce-457b-a606-9fe3525f801d%40go
>>>> oglegroups.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-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/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-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/CAPPSPLrui%2BAxaAeqjZ8C6JB09T_0nUPBau%3DoHoYs8vr3b%3DY1OQ%40mail.gmail.com.

Reply via email to