Yes, as you guessed I am having problems with covariance. Some I have 
solved but this one leaves me very puzzled:

I'll copy the code here in the order that it appears in my file. First (in 
"csv_lib.hats", which is #include:d at the very beginning) I have a template

extern fun {a: vt0ype} extfree(x: a): void

which is used to free variables in some of the functions using the [Either] 
constructor. Then I have:

vtypedef CSVErrors = List0_vt(CSVError)

where CSVError is a non-linear datatype. If I after that definition write

implement {CSVErrors} extfree(errs) = list_vt_free(errs),

then I get a compiler error telling me that [CSVErrors] can't be assigned 
the type of linear lists. If I try to go explicit and write

implement{CSVErrors} extfree(errs) = let
     val errs: List0_vt(CSVError) = errs
   in case errs of
       | ~list_vt_nil() => ()
       | ~list_vt_cons(er, ers1) => extfree<CSVErrors>(ers1)
   end

then I get roughly the same error, saying:

The actual term is: S2Evar(CSVErrors(8927))
The needed term is: S2Eapp(S2Ecst(list_vt0ype_int_vtype); S2Ecst(CSVError), 
S2EVar(5476))

How can I help the compiler infer that CSVErrors is indeed a 
listvt0ype_int_vtype of CSVError?

Den måndag 13 mars 2017 kl. 23:42:03 UTC+1 skrev gmhwxi:
>
> Once INV annotation is done properly, template annotation can be pretty 
> much removed.
>
>
> On Mon, Mar 13, 2017 at 6:39 PM, August Alm <augu...@gmail.com 
> <javascript:>> wrote:
>
>> Thanks for the hint! I added template arguments wherever I could and now 
>> I got some error messages that actually say something. However, I do find 
>> it a bit disconcerting that the compiler would segfault rather than tell me 
>> I need to annotate templates.
>>
>> Den måndag 13 mars 2017 kl. 22:02:57 UTC+1 skrev gmhwxi:
>>>
>>> I will take a look later. Based on your description, the issue
>>> seems to be caused by not providing certain template arguments
>>> explicitly:
>>>
>>> Say, foo is a template. Please use foo<...>(...) instead of foo(...)
>>>
>>> Compared to Haskell, type inference in ATS is quite limited :)
>>>
>>> On Mon, Mar 13, 2017 at 4:51 PM, August Alm <augu...@gmail.com> wrote:
>>>
>>>> So... I added some "second stage" parsing functionality, to get the en 
>>>> result in tabular form rahter than as a single [stream_vt], and to check 
>>>> for global errors such as unequal number of columns in the rows, and now I 
>>>> am back to segfaulting! =( However, this time it does not seem to be a 
>>>> stack issue because I run into the segmentation fault already at the 
>>>> compilation stage.
>>>>
>>>> I code in Vim and have it set up so that typing ":make" will run "patsopt 
>>>> -tc -d %", i.e., typechecking only. When I do everything seems fine--no 
>>>> complaints. I have used this utility for some time now and it has always 
>>>> worked like a charm. Wierdly though, if I issue "$ patsopt -tc -d 
>>>> csv_lexer.dats" in the console instead I get a segfault. The same happens 
>>>> for every other compilation command: I've tried compiling just using type 
>>>> checking, just to c, or etc. Always segfault. Compiling with the 
>>>> "-verbose" 
>>>> flag prints
>>>>
>>>> exec(patsopt --output csv_lexer_dats.c --dynamic csv_lexer.dats)
>>>> Segmentation fault
>>>> exec(patsopt --output csv_lexer_dats.c --dynamic csv_lexer.dats) = 35584
>>>>
>>>> which does not tell me anything. 
>>>>
>>>> My code can be found at https://github.com/August-Alm/ats_csv_lexer 
>>>> Note that I have moved some function implementations into a hats-file. 
>>>> Might this be a cause of trouble? Any tips at all on how to debug this are 
>>>> most appreciated. I don't know where to even begin as gdb seems useless as 
>>>> long as I can't even generate the C-code.
>>>>
>>>> Best wishes,
>>>> August
>>>>
>>>> Den onsdag 8 mars 2017 kl. 23:44:10 UTC+1 skrev gmhwxi:
>>>>>
>>>>> >>I take that as being somewhat tongue-in-cheek. ATS is a very 
>>>>> theoretical language, after all.
>>>>>
>>>>> I know that this sounds very ironic but interesting stuff often does 
>>>>> sound ironic :)
>>>>>
>>>>> My view of programming language research is changing gradually but 
>>>>> surely. I now strongly feel
>>>>> that the most important programming support is to facilitate the need 
>>>>> to alter/adapt the behaviour
>>>>> of a written program without actually requiring direct changes to be 
>>>>> made to the program. And the
>>>>> template system of ATS can be seen as an attempt to provide 
>>>>> programming support of this sort.
>>>>>
>>>>>
>>>>> On Wed, Mar 8, 2017 at 4:47 PM, August Alm <augu...@gmail.com> wrote:
>>>>>
>>>>>> See in.
>>>>>>
>>>>>> Den onsdag 8 mars 2017 kl. 17:51:36 UTC+1 skrev gmhwxi:
>>>>>>>
>>>>>>> Tangential to the topic of monads: Do you know if someone has 
>>>>>>>> thought about the relations between ATS and "enriched effect calculus" 
>>>>>>>> (as 
>>>>>>>> described in 
>>>>>>>> http://homepages.inf.ed.ac.uk/als/Research/Sources/eec.pdf) or 
>>>>>>>> "linear state monads" (as mentioned in 
>>>>>>>> https://arxiv.org/pdf/1403.1477.pdf)? There is a clear analogy. 
>>>>>>>> Implementing a concept such as a linear state monad in ATS would be 
>>>>>>>> nice, I 
>>>>>>>> think. Monadic programming on an Arduino, anyone? =) It would 
>>>>>>>> certainly be 
>>>>>>>> a unique selling point.
>>>>>>>>
>>>>>>>
>>>>>>> I can't really follow these monad papers. Too much for me :)
>>>>>>> Given your background, maybe you could give this a try?
>>>>>>>
>>>>>>> I'm tempted but I feel like I have to understand ATS:s function tags 
>>>>>> ("cloref" and the like, the flavours of function) better first, and 
>>>>>> generally get a more solid footing. I don't want to write something 
>>>>>> "cool", 
>>>>>> I want it to be useful, too.
>>>>>>  
>>>>>>
>>>>>>> Over the years, I have gradually grown more and more cynic about 
>>>>>>> "theoretic" research
>>>>>>> in the area of programming languages. I feel that the most urgent 
>>>>>>> issue in programming is
>>>>>>> to find effective approaches to reducing programming complexity.
>>>>>>>
>>>>>>> I take that as being somewhat tongue-in-cheek. ATS is a very 
>>>>>> theoretical language, after all. To clarify, I think Haskell suffers 
>>>>>> greatly from having too little focus on efficiency (among many of its 
>>>>>> users, not among the guys working on the compiler). I heard about ATS 
>>>>>> about 
>>>>>> the same time as I heard about Idris (the dependent type thing) and 
>>>>>> decided 
>>>>>> to pursue ATS precisely because of its air of efficiency and 
>>>>>> "real-world-readiness". I do still love my Haskell though, mainly 
>>>>>> because 
>>>>>> it is so easy to be productive with it. Scala has a very good no-bs 
>>>>>> culture 
>>>>>> and good library hygiene, but I'm not too fond of OOP so...
>>>>>>  
>>>>>>
>>>>>>> For instance, in your csv parser, there are a lot of if-then-else's. 
>>>>>>> Maybe you took them from
>>>>>>> some Haskel code. The point is that if-then-else's make programming 
>>>>>>> hard to write and harder
>>>>>>> to read/follow. I propose the following style:
>>>>>>>
>>>>>>> I first tried to write it using only pattern matching but failed to 
>>>>>> get it passed the typechecker. Maybe I will have another go at it.
>>>>>>  
>>>>>>
>>>>>>> 1) Implementing a csv parser without worrying about quotes (DQUOT). 
>>>>>>> Call this version 1.
>>>>>>> 2) Using templates to improve version 1 without directly modifying 
>>>>>>> version 1. Another way
>>>>>>>     to put it: you still have version 1 available after doing the 
>>>>>>> improvement.
>>>>>>>
>>>>>>> If I was uncertain about the algorithm then such an incremental 
>>>>>> development style would surely be preferable, but since the code is a 
>>>>>> port 
>>>>>> of a tried and tested Haskell library I'm 
>>>>>> not very motivated to scrap and start over. But for my next 
>>>>>> project(s) I will try to heed your words.
>>>>>>
>>>>>> I know that this may sound a bit vague but that is my point. Being 
>>>>>>> vague makes people
>>>>>>> think more and more deeply :)
>>>>>>>
>>>>>>> Cheers!
>>>>>>>
>>>>>>>
>>>>>>> On Tuesday, March 7, 2017 at 4:52:58 PM UTC-5, August Alm wrote:
>>>>>>>>
>>>>>>>> I'm glad too! I wrote my first "Hello World" program (in Haskell) 
>>>>>>>> less than four months ago, before that I was completely illiterate 
>>>>>>>> about 
>>>>>>>> programming--writing a linear, lazy CSV-parser in ATS has definitely 
>>>>>>>> been 
>>>>>>>> my most challenging venture so far. I mean this in a good way. ATS is 
>>>>>>>> quickly becoming my favorite language. It is daunting at times, sure, 
>>>>>>>> but 
>>>>>>>> its unique combination of low-level abilities and functional 
>>>>>>>> abstractions 
>>>>>>>> makes me feel like the Star Trek idiom "To boldly go where no one has 
>>>>>>>> gone 
>>>>>>>> before", heh. The ATS sky is so vast I've almost forgot about monads. 
>>>>>>>> And 
>>>>>>>> YES!, I do suggest trying ATS to every programmer I meet. 
>>>>>>>>
>>>>>>>> Tangential to the topic of monads: Do you know if someone has 
>>>>>>>> thought about the relations between ATS and "enriched effect calculus" 
>>>>>>>> (as 
>>>>>>>> described in 
>>>>>>>> http://homepages.inf.ed.ac.uk/als/Research/Sources/eec.pdf) or 
>>>>>>>> "linear state monads" (as mentioned in 
>>>>>>>> https://arxiv.org/pdf/1403.1477.pdf)? There is a clear analogy. 
>>>>>>>> Implementing a concept such as a linear state monad in ATS would be 
>>>>>>>> nice, I 
>>>>>>>> think. Monadic programming on an Arduino, anyone? =) It would 
>>>>>>>> certainly be 
>>>>>>>> a unique selling point.
>>>>>>>>
>>>>>>>> I do not understand what you're aiming at with your suggestion to 
>>>>>>>> maje CSVState a datavtype or absvtype. Could you elaborate? I have 
>>>>>>>> seen 
>>>>>>>> abstract types used as a way to make otherwise allowed operation 
>>>>>>>> illegal 
>>>>>>>> (there is an example in your book, I think, of how to construct a 
>>>>>>>> record 
>>>>>>>> type where some fields are mutable and some are not), but not for the 
>>>>>>>> sake 
>>>>>>>> of overloading symbols.
>>>>>>>>
>>>>>>>> I will rewrite the code so that DELIM and QNLIN are passed as 
>>>>>>>> templates. I also intend to add some further functionality, like 
>>>>>>>> functions 
>>>>>>>> for filtering out errors, for printing and for collecting the output 
>>>>>>>> in 
>>>>>>>> tabular form with rows and columns rather than as a single row. When 
>>>>>>>> I'm 
>>>>>>>> satisfied I will make an npm-package out of it.
>>>>>>>>
>>>>>>>> Best wishes,
>>>>>>>> August
>>>>>>>>
>>>>>>>> Den tisdag 7 mars 2017 kl. 02:21:00 UTC+1 skrev gmhwxi:
>>>>>>>>>
>>>>>>>>> Really glad that you got it to work!
>>>>>>>>>
>>>>>>>>> I suggest that you make a npm-package for the parser and then
>>>>>>>>> publish the package. In this way, other ats-lang users can benefit
>>>>>>>>> from your work easily.
>>>>>>>>>
>>>>>>>>> You could try to introduce some abstract types into your code. For
>>>>>>>>> instance, I would suggest that you make CSVstate a datavtype 
>>>>>>>>> (linear datatype)
>>>>>>>>> (a datatype is often referred to as being semi-abstract). Then you 
>>>>>>>>> can
>>>>>>>>> introduce overloaded symbols for functions processing CSVstate, 
>>>>>>>>> making your code
>>>>>>>>> more accessible.
>>>>>>>>>
>>>>>>>>> Also, the following interface:
>>>>>>>>>
>>>>>>>>> extern fun 
>>>>>>>>> lex_csv(QNLIN: bool, DELIM: char, cs: llstring): CSVEntries 
>>>>>>>>>
>>>>>>>>> can and probably should be changed into
>>>>>>>>>
>>>>>>>>> extern
>>>>>>>>> fun{}
>>>>>>>>> lex_csv(cs: listing): CSVEntries
>>>>>>>>>
>>>>>>>>> The parameters QNLIN and DELIM can be passed via templates:
>>>>>>>>>
>>>>>>>>> extern
>>>>>>>>> fun{} lex_csv$QNLIN(): char
>>>>>>>>> extern
>>>>>>>>> fun{} lex_csv$DELIM(): char
>>>>>>>>>
>>>>>>>>> implement{} lex_csv$QNLIN() = false
>>>>>>>>> implement{} lex_csv$DELIM() = ',' // default value
>>>>>>>>>
>>>>>>>>> Writing function templates (instead of functions) enables you to 
>>>>>>>>> move
>>>>>>>>> your code around very conveniently. You can even move template code
>>>>>>>>> into the body of another function.
>>>>>>>>>
>>>>>>>>> That's all for now. Hope you will like ATS and tell/teach it to 
>>>>>>>>> your friends.
>>>>>>>>>
>>>>>>>>> Cheers!
>>>>>>>>>
>>>>>>>>> On Monday, March 6, 2017 at 4:06:11 PM UTC-5, August Alm wrote:
>>>>>>>>>>
>>>>>>>>>> The code now seems to work as inteded!
>>>>>>>>>>
>>>>>>>>>> https://github.com/August-Alm/ats_csv_lexer
>>>>>>>>>>
>>>>>>>>>> Thank you for all the help. I still don't fully grokk why the 
>>>>>>>>>> function needs to consume each of its arguments--will have to 
>>>>>>>>>> meditate more 
>>>>>>>>>> on that--but at least I know how to write code like this from now 
>>>>>>>>>> on. 
>>>>>>>>>>
>>>>>>>>>> Den måndag 6 mars 2017 kl. 17:43:36 UTC+1 skrev gmhwxi:
>>>>>>>>>>>
>>>>>>>>>>> Yes, CSVstate needs to be changed as well.
>>>>>>>>>>>
>>>>>>>>>>> However, your code needs very little change. This is like a
>>>>>>>>>>> a 5 minute job to me. I would be happy to give it a try if you 
>>>>>>>>>>> say so.
>>>>>>>>>>> But I thought that you might want to get the thrill of fixing 
>>>>>>>>>>> the code :)
>>>>>>>>>>>
>>>>>>>>>>> On Monday, March 6, 2017 at 11:30:27 AM UTC-5, August Alm wrote:
>>>>>>>>>>>>
>>>>>>>>>>>> Hrrm, I had:
>>>>>>>>>>>>
>>>>>>>>>>>> fun
>>>>>>>>>>>> parse_entry
>>>>>>>>>>>> ( st: !CSVState >> _
>>>>>>>>>>>> , at: (int, int)
>>>>>>>>>>>> , acc: !$SBF.stringbuf
>>>>>>>>>>>> , cs: llstring
>>>>>>>>>>>> ) : stream_vt(CSVEntry)
>>>>>>>>>>>>
>>>>>>>>>>>> I gather I have to change not just [!$SBF.stringbuf] but also 
>>>>>>>>>>>> [!CSVState >> _], right? What about if I did
>>>>>>>>>>>>
>>>>>>>>>>>> fun
>>>>>>>>>>>> parse_entry_con
>>>>>>>>>>>> ( st: !CSVState >> _
>>>>>>>>>>>> , at: (int, int)
>>>>>>>>>>>> , acc: !$SBF.stringbuf
>>>>>>>>>>>> , cs: llstring
>>>>>>>>>>>> ) : stream_vt_con(CSVEntry)
>>>>>>>>>>>>
>>>>>>>>>>>> and then put 
>>>>>>>>>>>>
>>>>>>>>>>>> parse_entry(...) = 
>>>>>>>>>>>> $ldelay
>>>>>>>>>>>> ( parse_entry_con(...)
>>>>>>>>>>>> , ( free(st)
>>>>>>>>>>>>   ; free(acc)
>>>>>>>>>>>>   ; free(cs)
>>>>>>>>>>>>   )
>>>>>>>>>>>> )
>>>>>>>>>>>>
>>>>>>>>>>>> --would that work? Would it be idiomatic and efficient?
>>>>>>>>>>>>
>>>>>>>>>>>> Thanks, again,
>>>>>>>>>>>> August
>>>>>>>>>>>>
>>>>>>>>>>>> Den måndag 6 mars 2017 kl. 14:30:05 UTC+1 skrev gmhwxi:
>>>>>>>>>>>>>
>>>>>>>>>>>>> I forgot to tell you something essential in using stream_vt.
>>>>>>>>>>>>> The following interface for 'test' cannot work:
>>>>>>>>>>>>>
>>>>>>>>>>>>> fun test (acc: !$SBF.stringbuf, cs: llstring): stream_vt(DT) =
>>>>>>>>>>>>>
>>>>>>>>>>>>> What you need is
>>>>>>>>>>>>>
>>>>>>>>>>>>> fun test (acc: $SBF.stringbuf, cs: llstring): stream_vt(DT) =
>>>>>>>>>>>>>
>>>>>>>>>>>>> The 'acc' stringbuf needs to be consumed by 'test'. The 
>>>>>>>>>>>>> implementation
>>>>>>>>>>>>> of 'test' looks like this:
>>>>>>>>>>>>>
>>>>>>>>>>>>> $ldelay
>>>>>>>>>>>>> (
>>>>>>>>>>>>> <code for stream construction>
>>>>>>>>>>>>> ,
>>>>>>>>>>>>> (freeing(acc); freeing(cs)) // this part is executed when the 
>>>>>>>>>>>>> stream is freed
>>>>>>>>>>>>> )
>>>>>>>>>>>>>
>>>>>>>>>>>>> On Mon, Mar 6, 2017 at 8:19 AM, August Alm <augu...@gmail.com> 
>>>>>>>>>>>>> wrote:
>>>>>>>>>>>>>
>>>>>>>>>>>>>> The points you mention are part of the reason I chose to 
>>>>>>>>>>>>>> wrote the csv lexer the way I did. It follows one of the 
>>>>>>>>>>>>>> fastests Haskell 
>>>>>>>>>>>>>> csv parsers, and I was curious to see how using linear types 
>>>>>>>>>>>>>> could optimize 
>>>>>>>>>>>>>> performance.
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> Regarding your suggestion on how to make better use of 
>>>>>>>>>>>>>> $ldelay in my code: I'm stuck on a compiler error that I can't 
>>>>>>>>>>>>>> make sense 
>>>>>>>>>>>>>> of. The following pseudo-minimal example throws the same kind of 
>>>>>>>>>>>>>> errors:
>>>>>>>>>>>>>>          
>>>>>>>>>>>>>>          #include "share/atspre_define.hats"
>>>>>>>>>>>>>>          #include "share/atspre_staload.hats"
>>>>>>>>>>>>>>          staload UN = "prelude/SATS/unsafe.sats"
>>>>>>>>>>>>>>          staload SBF = "libats/SATS/stringbuf.sats"
>>>>>>>>>>>>>>          staload _(*SBF*) = "libats/DATS/stringbuf.dats"
>>>>>>>>>>>>>>          
>>>>>>>>>>>>>>          datatype DT = D_T of @{ alpha = char }
>>>>>>>>>>>>>>          vtypedef llstring = stream_vt(char)
>>>>>>>>>>>>>>          
>>>>>>>>>>>>>>          fun
>>>>>>>>>>>>>>          test (acc: !$SBF.stringbuf, cs: llstring): 
>>>>>>>>>>>>>> stream_vt(DT) =
>>>>>>>>>>>>>>          $ldelay
>>>>>>>>>>>>>>          ( case !cs of
>>>>>>>>>>>>>>            | ~stream_vt_nil() =>
>>>>>>>>>>>>>>              if $SBF.stringbuf_get_size(acc) = i2sz(0) then 
>>>>>>>>>>>>>> stream_vt_nil()
>>>>>>>>>>>>>>              else stream_vt_cons(D_T(@{alpha = 'a'}), 
>>>>>>>>>>>>>> stream_vt_make_nil())
>>>>>>>>>>>>>>            | ~stream_vt_cons(c, cs1) =>
>>>>>>>>>>>>>>              let val crec = D_T(@{alpha = c})
>>>>>>>>>>>>>>              in stream_vt_cons(crec, test(acc, cs1))
>>>>>>>>>>>>>>              end
>>>>>>>>>>>>>>          , ~cs
>>>>>>>>>>>>>>          )
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> The compiler can not infer the type I want (which is 
>>>>>>>>>>>>>> [stream_vt_con(DT)] for the [stream_vt_nil()] following the 
>>>>>>>>>>>>>> first [then] in 
>>>>>>>>>>>>>> the function body. The error message says
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> the dynamic expression cannot be assigned the type 
>>>>>>>>>>>>>> [S2EVar(5492)].
>>>>>>>>>>>>>> [...] mismatch of sorts in unification:
>>>>>>>>>>>>>> The sort of variable is: S2RTbas(S2RTBASimp(1; t@ype))
>>>>>>>>>>>>>> The sort of solution is: S2RTbas(S2RTBASimp(2; viewtype))
>>>>>>>>>>>>>> [...] mismatch of static terms (tyleq):
>>>>>>>>>>>>>> The actual term is: S2Eapp(S2Ecst(stream_vt_con); 
>>>>>>>>>>>>>> S2EVar(5495))
>>>>>>>>>>>>>> The needed term is: S2EVar(5492)
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> (There are further errors of the same form.) Is the culprit 
>>>>>>>>>>>>>> that [stream_vt] of a nonlinear datatype requires some special 
>>>>>>>>>>>>>> care? The 
>>>>>>>>>>>>>> version with [stream_vt_make_nil()] instead of explicit 
>>>>>>>>>>>>>> [$ldelay] works so 
>>>>>>>>>>>>>> the error ought to be subtle.
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> Best wishes,
>>>>>>>>>>>>>> August
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> Den söndag 5 mars 2017 kl. 23:58:35 UTC+1 skrev gmhwxi:
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> Yes, you definitely got it :)
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> Stream_vt is very memory-frugal.
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> Haskell relies on deforestation (complex complier 
>>>>>>>>>>>>>>> optimization)
>>>>>>>>>>>>>>> to reduce memory usage of lazy evaluation. In ATS, 
>>>>>>>>>>>>>>> deforestation is
>>>>>>>>>>>>>>> not supported. Instead, the programmer needs to recycle 
>>>>>>>>>>>>>>> memory explicitly.
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> Compared to Haskell, corresponding code using stream_vt in 
>>>>>>>>>>>>>>> ATS can be
>>>>>>>>>>>>>>> much more efficient both time-wise and memory-wise.
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> For instance, the following example (for computing Mersenne 
>>>>>>>>>>>>>>> primes) can
>>>>>>>>>>>>>>> run for days without run-time GC:
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> https://github.com/githwxi/ATS-Postiats/blob/master/doc/EXAMPLE/RosettaCode/Lucas-Lehmer_test2.dats
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> It convincingly attests to the power of linear streams.
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> Cheers!
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> On Sun, Mar 5, 2017 at 5:34 PM, August Alm <
>>>>>>>>>>>>>>> augu...@gmail.com> wrote:
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> Thanks for the tip! I think I understand. I treated $ldelay 
>>>>>>>>>>>>>>>> much as a data constructor, so that all streams are equally 
>>>>>>>>>>>>>>>> lazy, whereas 
>>>>>>>>>>>>>>>> there are in fact many ways to sequence into thunks. Let me 
>>>>>>>>>>>>>>>> give an example 
>>>>>>>>>>>>>>>> to anchor the discussion. Both the following implementations 
>>>>>>>>>>>>>>>> of a 
>>>>>>>>>>>>>>>> map-template for linear streams typecheck:
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>          fun {a, b: t0ype}
>>>>>>>>>>>>>>>>          map_make_cons 
>>>>>>>>>>>>>>>>          ( xs: stream_vt(a)
>>>>>>>>>>>>>>>>          , f: a -> b
>>>>>>>>>>>>>>>>          ) : stream_vt(b) =
>>>>>>>>>>>>>>>>          case !xs of
>>>>>>>>>>>>>>>>          | ~stream_vt_nil() => stream_vt_make_nil()
>>>>>>>>>>>>>>>>          | ~stream_vt_cons(x, xs1) =>
>>>>>>>>>>>>>>>>            stream_vt_make_cons(f(x), map_make_cons(xs1, f))
>>>>>>>>>>>>>>>>          
>>>>>>>>>>>>>>>>          fun {a, b: t0ype}
>>>>>>>>>>>>>>>>          map_ldelay
>>>>>>>>>>>>>>>>          ( xs: stream_vt(a)
>>>>>>>>>>>>>>>>          , f: a -> b
>>>>>>>>>>>>>>>>          ) : stream_vt(b) =
>>>>>>>>>>>>>>>>          $ldelay
>>>>>>>>>>>>>>>>          ( case !xs of
>>>>>>>>>>>>>>>>            | ~stream_vt_nil() => stream_vt_nil()
>>>>>>>>>>>>>>>>            | ~stream_vt_cons(x, xs1) =>
>>>>>>>>>>>>>>>>              stream_vt_cons(f(x), map_ldelay(xs1, f))
>>>>>>>>>>>>>>>>          , ~xs
>>>>>>>>>>>>>>>>          )
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> The second is maximally lazy. The first, [map_make_cons] is 
>>>>>>>>>>>>>>>> less lazy because checking the case-conditions is not delayed. 
>>>>>>>>>>>>>>>> My code was 
>>>>>>>>>>>>>>>> like the first example, only much more was going on inside the 
>>>>>>>>>>>>>>>> case 
>>>>>>>>>>>>>>>> expressions. Is that a correct assessment?
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> Den söndag 5 mars 2017 kl. 04:07:42 UTC+1 skrev gmhwxi:
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> 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-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/d78409e2-aff1-4b96-98f3-eb3a5d20ff95%40googlegroups.com
>>>>>>>>>>>>>>>>  
>>>>>>>>>>>>>>>> <https://groups.google.com/d/msgid/ats-lang-users/d78409e2-aff1-4b96-98f3-eb3a5d20ff95%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/716c8c61-d535-412d-8584-d4030d20801d
>>>>>>>>>>>>>>  
>>>>>>>>>>>>>> <https://groups.google.com/d/msgid/ats-lang-users/716c8c61-d535-412d-8584-d4030d20801d%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/7eaf7ad1-e888-4aaf-bad1-f4c0d7248f26%40googlegroups.com.

Reply via email to