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 
> <javascript:>> 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 <javascript:>.
>> To post to this group, send email to ats-lan...@googlegroups.com 
>> <javascript:>.
>> 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/a2093631-431f-4ccf-8668-6eb34ca2f039%40googlegroups.com.

Reply via email to