Re: [ats-lang-users] mkdtemp and modifiable strings
Unleashing the potentials of types and templates
Status: Beta
Brought to you by:
ats-hwxi
From: Guillaume B. <gui...@gm...> - 2011-02-09 10:37:25
|
2011/2/8 Hongwei Xi <hw...@cs...> > On Tue, 8 Feb 2011, Guillaume Brunerie wrote: > > >>But I have a few questions, because I don't really understand how to use > >>strings in ATS. > >> > >>1) Could you explain the differences between 'string', 'strbuf', 'strptr' > ? > >>(and 'free_gc_v', etc.) > > a string is non-linear; it can only be free by GC > a strbuf is like a flat array of bytes, where the last one is null. > strptr is a linear string, which can be manually freed. > Thank you, but perhaps you mean that a strptr *must* be freed? Because I guess that the linear typing will not allow a memory leak here. >>In the example of > >>mkdtemp you gave, you are using a function from prelude/SATS/unsafe.sats > >>which does not seems very good (and I don't want to use such functions). > Why > >>not having a type which says that the return value is either the null >>pointer or the same pointer as the argument? > I did it in the fixed version. However, the unsafe cast was used for > a different purpose. Say that you want to call rmdir, which is given > the following type: > > fun rmdir (path: string): int(*error code*) > > Now suppose that you have a linear string or strbuf as your path. > You cannot pass it to rmdir directly. Of course, rmdir can be given > a type that accepts linear string in the first place but then you can no > longer call rmdir on a constant string. In the past, I did something like > this: > > fun rmdir_string ... > fun rmdir_strptr > fun rmdir_strbuf > > overload rmdir with rmdir_string > overload rmdir with rmdir_strptr > overload rmdir with rmdir_strbuf > > This style was so awkward that I now prefer casting over it. > But you could use string_of_strbuf or string_of_strptr, why do you need to cast with such unsafe functions? Guillaume |