On Sunday, August 18, 2019 at 7:10:26 AM UTC+3, Brandon Barker wrote: > > Hi Artyom - would you mind sharing the repo URL, assuming it is open? > > Well, here it is:
https://github.com/ashalkhakov/libatsc > On Thursday, August 8, 2019 at 2:49:43 AM UTC-4, Artyom Shalkhakov wrote: >> >> Hi Brandon, Alexander, >> >> On Wednesday, August 7, 2019 at 5:31:04 AM UTC+3, Brandon Barker wrote: >> >>> I just want to say this is quite intriguing, I think it would be very >>> appealing to have a standard library built on this idea (a modification of >>> Temptory?), perhaps with some more fleshed out examples of IO splits before >>> really digging in. >>> >> >> I'm writing such a library in my spare time, but I find that HX did most >> of the work back in ATS0/ATS1 days. >> >> Getting back to the problem Alexander mentioned, we could try using >> fractional permissions. I'll take an array as an example. >> >> We could still try to use fractional permissions (similarly to what is >> described here >> <http://www.cs.uwm.edu/faculty/boyland/papers/iterators.pdf>, PDF) >> >> - a collection gets one more type index, k:int (k >= 0) >> - k stands for fraction 2^(-k) (e.g. k=0 is 1, k=1 is 1/2, etc.) >> >> Let's make a fractional dynamically-resizeable array: >> >> absview farray_v(a:vtflt, l:addr, n:int, k:int) >> >> Examples: >> >> farray_v(a,l,n,0) <- whole permission to array, allows writing! >> farray_v(a,l,n,k) <- k > 0, this is a read-only permission, can't reassign >> >> Basically, it's OK to *split* the view in half. >> >> praxi split : {a:vtflt}{l:addr}{n:int}{k:nat} farray_v(a,l,n,k) -> >> (farray_v(a,l,n,k+1), farray_v(a,l,n,k+1)) >> praxi unsplit : {a:vtflt}{l:addr}{n:int}{k:pos} (farray_v(a,l,n,k), >> farray_v(a,l,n,k)) -> farray_v(a,l,n,k-1) >> >> Allocation and deallocation only deal with the whole permission: >> >> fun{a:tflt} >> farray_free {l:addr;n:int} (farray_v(a,l,n,0) | ptr l): void >> fun{a:vtflt} >> farray_alloc (capacity: int): [l:addr] (farray_v(a,l,0,0) | ptr l) >> >> Now we can imagine that some array operations are destructive, so we >> require k=0 for the view, but the read-only operations can be used with any >> k. >> >> fun{a:tflt} >> farray_get_at {l:addr;n:int;k:int;i:nat | i < n} (!farray_v(a,l,n,k) | >> ptr l, int i): a >> fun{a:vtflt} >> farray_insert_before {l:addr;n:int;k:int;i:nat | i <= n} >> (!farray_v(a,l,n,0) >> farray_v(a,l,n+1,0) | ptr l, int i, a): void >> >> Basically: >> >> - destructive operations can only be called if you have the whole >> permission (i.e. k=0) >> - destructive operations are: insert, append, prepend, delete >> >> However, if we are to give safe types to C++-style iterators, we'd still >> need lots more precision... It isn't enough to have an farray(a,n), you >> have to ensure that the iterator is from *this* array not *that* array. >> This will be very painful to work with. I'll sketch out an iterator API >> below. >> >> // basically a pointer to array element (but may point past the end of >> array: this is the "end" iterator) >> absvtbox >> fiter (a:vtflt,l:addr,k:int,b:bool) // b=true: this is the end iterator, >> i.e. it can't be read from/written to >> >> // simple pointer equality >> fun >> eq_fiter {a:vtflt}{l:addr}{k1,k2:int} (!fiter(a,l,k1,b1), >> !fiter(a,l,k2,b2)): bool (b1 == b2) >> >> // taking pointers out >> fun{a:vtflt} >> farray_begin {l:addr}{n:int}{k:int} (!farray_v(a,l,n,k) >> >> farray_v(a,l,n,k+1) | ptr l): [b:bool] fiter(a,l,k+1,b) >> fun{a:vtflt} >> farray_end {l:addr}{n:int}{k:int} (!farray_v(a,l,n,k) >> >> farray_v(a,l,n,k+1) | ptr l): fiter(a,l,k+1,true) >> >> // putting pointers back >> prfun >> fiter_putback {a:vtflt}{l:addr}{n:int}{k:pos}{b:bool} (!farray_v(a,l,n,k) >> >> farray_v(a,l,n,k-1), fiter(a,l,k,b)): void >> >> fun{a:vtflt} >> fiter_succ {l:addr}{k:int} (fiter(a,l,k,b)): fiter(a,l,k,b) >> fun{a:vtflt} >> fiter_pred {l:addr}{k:int} (fiter(a,l,k,b)): fiter(a,l,k,b) >> fun{a:tflt} >> fiter_get {l:addr}{k:int} (!fiter(a,l,k,false)): a >> fun{a:tflt} >> fiter_set {l:addr}{k:int} (!fiter(a,l,k,false), a): void >> >> For trees, it's going to be pretty similar, I think: if you have parent >> links in this tree, then an iterator is again simply a pointer, and the >> "end" iterator is the NULL pointer (so again pretty simple to check). >> >> Oh my, this above doesn't directly address the question, sorry! If there >> was some way for g_signal_emit( "CHDIR") to invalidate all iterators to >> the tree (and moreover, to track this statically), but it doesn't even >> mention the tree to begin with. >> >> >>> On Thu, Mar 21, 2019, 8:18 PM gmhwxi <gmh...@gmail.com> wrote: >>> >>>> >>>> One can definitely build a monad-based library to support IO: >>>> >>>> absvtype IO(a:vt@ype) = ptr >>>> >>>> The problem with IO monad is that it is so broad. With linear types, >>>> a programmer can specify a lot more precisely. >>>> >>>> >>is that ATS doesn't (by default?) model an IO effect. >>>> >>>> No, it doesn't if you use the default library. But nothing prevents you >>>> from tracking IO effects in ATS. >>>> >>>> In the book you mentioned in your message, I was really thinking of >>>> views for specifying memory layouts. With linear views, a programmer >>>> can be very precise in describing what memory a function can >>>> access/update. >>>> Compared to state monads, this kind of precision is unmatched. >>>> >>>> On Thursday, March 21, 2019 at 1:28:42 PM UTC-4, Brandon Barker wrote: >>>>> >>>>> >>>>> >>>>> On Thursday, March 21, 2019 at 9:30:40 AM UTC-4, Brandon Barker wrote: >>>>>> >>>>>> Hi Artyom, >>>>>> >>>>>> I'm also grappling with the issue of RT in this case as I'd so far >>>>>> only thought about it in terms of function calls, but what you and >>>>>> Vanessa >>>>>> say helped me to understand the issue. Though I haven't managed to get >>>>>> ATS >>>>>> to have the same behavior as OCaml in the "let expression" above, I >>>>>> suspect >>>>>> it is possible. The key phrase here seems to be "side-effecting >>>>>> expression", and relates to the fact that functions in ATS can perform >>>>>> side >>>>>> effects without having any effect type or IO monad ascribed to the value >>>>>> (again, iirc). >>>>>> >>>>> >>>>> Well, maybe that isn't the real key - the real key, I now think, is >>>>> that ATS doesn't (by default?) model an IO effect. In section 6.9 of >>>>> http://ats-lang.sourceforge.net/DOCUMENT/INT2PROGINATS/PDF/main.pdf >>>>> it is mentioned that using both linear and dependent types may be used to >>>>> do this, though I think the suggestion here is for more than printing to >>>>> e.g. STDOUT. >>>>> >>>>> If anyone has looked at modeling/enforcing an IO-like effect type in >>>>> ATS, I'd be interested to see it. >>>>> >>>>>> >>>>>> Perhaps tonight I should try out the same in Idris or PureScript, >>>>>> which are not lazily evaluated by default but do use IO, to get a better >>>>>> understanding. >>>>>> >>>>>> On Thursday, March 21, 2019 at 3:17:46 AM UTC-4, Artyom Shalkhakov >>>>>> wrote: >>>>>>> >>>>>>> Hi Brandon, >>>>>>> >>>>>>> Admittedly I don't really understand what RT is, but from what I >>>>>>> understand, in Haskell the expression like [print "ha"] is basically a >>>>>>> command to the top-level interpreter (which is the language runtime) to >>>>>>> perform an effect on the console (moreover, it will be evaluated on >>>>>>> as-needed basis). Moreover, the ";" is itself another comand, the >>>>>>> explicit >>>>>>> sequencing command, the meaning of which is "perform the left-hand side >>>>>>> effects, then perform the right-hand side effects". Such a command is a >>>>>>> value, so it can be passed as a value and reused as many times as is >>>>>>> necessary. In ATS, the expression like [print "ha"] evaluates right >>>>>>> there >>>>>>> to a void/"no value", and the ";" is also NOT a value at all, but >>>>>>> rather a >>>>>>> "shortcut" syntax to a "let-in-end" form. >>>>>>> >>>>>>> I like to imagine an interpreter that sits in the Haskell's runtime. >>>>>>> Values of IO type are commands to this interpreter. Typical Haskell >>>>>>> IO-based programs are building up these commands as they are being >>>>>>> evaluated by the runtime. The runtime starts evaluation at the "main" >>>>>>> expression defined by the programmer. >>>>>>> >>>>>>> чт, 21 мар. 2019 г. в 03:45, Brandon Barker <brandon...@gmail.com>: >>>>>>> >>>>>>>> I'm a little rusty, so can't come up with many good examples. >>>>>>>> >>>>>>>> Apparently it is possible to do something like this in OCaml: >>>>>>>> >>>>>>>> implement >>>>>>>> main0 () = { >>>>>>>> val () = let >>>>>>>> val ha = print("ha") >>>>>>>> in >>>>>>>> (ha; ha) // How to get two ha's here? >>>>>>>> end >>>>>>>> } >>>>>>>> >>>>>>>> >>>>>>>> After running the program, you would only see one "ha", which >>>>>>>> violates RT. >>>>>>>> >>>>>>>> However, ATS doesn't seem to allow a sequence expression in the >>>>>>>> "in" position of a let expression, as this doesn't compile. Admittedly >>>>>>>> I'm >>>>>>>> just trying to see if ATS2 doesn't have RT in this particular case, >>>>>>>> but it >>>>>>>> would also be good to know about the sequence expressions here. >>>>>>>> >>>>>>>> -- >>>>>>>> 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/5eba6b86-4146-4ba2-a87f-f8c511d902f0%40googlegroups.com >>>>>>>> >>>>>>>> <https://groups.google.com/d/msgid/ats-lang-users/5eba6b86-4146-4ba2-a87f-f8c511d902f0%40googlegroups.com?utm_medium=email&utm_source=footer> >>>>>>>> . >>>>>>>> >>>>>>> >>>>>>> >>>>>>> -- >>>>>>> Cheers, >>>>>>> Artyom Shalkhakov >>>>>>> >>>>>> -- >>>> 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-lan...@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/3d13aac1-2f28-47af-afbd-6d9eced901db%40googlegroups.com >>>> >>>> <https://groups.google.com/d/msgid/ats-lang-users/3d13aac1-2f28-47af-afbd-6d9eced901db%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 view this discussion on the web visit https://groups.google.com/d/msgid/ats-lang-users/4f0608cf-1e3d-402e-8544-68893888db0b%40googlegroups.com.