Thread: [ats-lang-users] dropping out the prelude?
Unleashing the potentials of types and templates
Status: Beta
Brought to you by:
ats-hwxi
From: Guillaume Y. <gui...@ci...> - 2011-04-26 17:12:33
|
Hi. I've been trying to make a small compiler on top of ATS to provide a syntax I like more for ATS code. For instance, I currently can write the following code: open native <stdio.h> type io_stream = native "FILE *" let stdin : io_stream = native "stdin" let stdout : io_stream = native "stdout" let stderr : io_stream = native "stderr" let fputs : string * io_stream -> int = native "fputs" let _ = fputs ("Hello, world!\n", stdout) let exported main () : int = 0 which is arguably cleaner than ATS syntax. I also have some rudimentary support for ML algebraic datatypes. However, I've been trying to drop the prelude, and while the -D_ATS_PRELUDE_NONE option to atscc allows to stop C code from compiling against the prelude, it still requires the ATS part of the code of the prelude. I've been trying to manually get rid of it, but it seems that atsopt has builtin code that checks the existence of files in the prelude. For instance prelude/fixity.ats. Isn't there a way to work around that in a clean way? (I have a very ugly way to work around it, but it's not satisfactory.) I also a question about licencing. This is not about starting a licencing flame war, but more to know what is allowed and what is not. I see that ATS is distributed under GPL v3. Also that some headers in the prelude are distributed under LGPL v2.1. Also that some headers in various libs are proprietary (which surprises me a bit). But my question is more about compiled ATS code. And about some runtime code that ATS softwares gets linked to. It seems to me that it still is GPL or LGPL. So are all code linked against the runtime GPL? Best regards, -- Guillaume Yziquel |
From: Hongwei Xi <hw...@cs...> - 2011-04-26 21:48:16
|
On Tue, 26 Apr 2011, Guillaume Yziquel wrote: >>Hi. >> >>I've been trying to make a small compiler on top of ATS to provide a >>syntax I like more for ATS code. For instance, I currently can write the >>following code: >> >> open native <stdio.h> >> >> type io_stream = native "FILE *" >> >> let stdin : io_stream = native "stdin" >> let stdout : io_stream = native "stdout" >> let stderr : io_stream = native "stderr" >> >> let fputs : string * io_stream -> int = native "fputs" >> let _ = fputs ("Hello, world!\n", stdout) >> >> let exported main () : int = 0 >> >>which is arguably cleaner than ATS syntax. I also have some rudimentary >>support for ML algebraic datatypes. If this can help ocaml programmers use ATS, I am all for it :) >>However, I've been trying to drop the prelude, and while the >>-D_ATS_PRELUDE_NONE option to atscc allows to stop C code from compiling >>against the prelude, it still requires the ATS part of the code of the >>prelude. I've been trying to manually get rid of it, but it seems that >>atsopt has builtin code that checks the existence of files in the >>prelude. For instance prelude/fixity.ats. Isn't there a way to work >>around that in a clean way? (I have a very ugly way to work around it, >>but it's not satisfactory.) I will be happy to accommodate it. Maybe you can first come up with a design and try it yourself. >>I also a question about licencing. This is not about starting a >>licencing flame war, but more to know what is allowed and what is not. I >>see that ATS is distributed under GPL v3. Also that some headers in the >>prelude are distributed under LGPL v2.1. Also that some headers in >>various libs are proprietary (which surprises me a bit). Generally speaking, we have: ATS/Anairiats compiler source -> GPL v3 ATS/Anairiats libscode -> LGPL v2.1 where libs include prelude, libc, libats. Libs in contribute are handled individually. If you found discrepancies, please let me know. >>But my question is more about compiled ATS code. And about some runtime >>code that ATS softwares gets linked to. It seems to me that it still is >>GPL or LGPL. So are all code linked against the runtime GPL? As far as I can tell. --Hongwei Computer Science Department Boston University 111 Cummington Street Boston, MA 02215 Email: hw...@cs... Url: http://www.cs.bu.edu/~hwxi Tel: +1 617 358 2511 (office) Fax: +1 617 353 6457 (department) |
From: Guillaume Y. <gui...@ci...> - 2011-04-26 22:36:01
|
Le Tuesday 26 Apr 2011 à 17:48:07 (-0400), Hongwei Xi a écrit : > On Tue, 26 Apr 2011, Guillaume Yziquel wrote: > > >>Hi. > >> > >>I've been trying to make a small compiler on top of ATS to provide a > >>syntax I like more for ATS code. For instance, I currently can write the > >>following code: > >> > >> open native <stdio.h> > >> > >> type io_stream = native "FILE *" > >> > >> let stdin : io_stream = native "stdin" > >> let stdout : io_stream = native "stdout" > >> let stderr : io_stream = native "stderr" > >> > >> let fputs : string * io_stream -> int = native "fputs" > >> let _ = fputs ("Hello, world!\n", stdout) > >> > >> let exported main () : int = 0 > >> > >>which is arguably cleaner than ATS syntax. I also have some rudimentary > >>support for ML algebraic datatypes. > > If this can help ocaml programmers use ATS, I am all for it :) The main issue is, unsurprisingly syntax, and I fear about fitting dependent types and linear types into an ML typing scheme. Somehow, I like the agda way of handling dependent types, though it has a haskellish flavour that i'm a bit uncomfortable with. Anyhow, all the parser will have to be rewritten when I have a clearer idea of where the syntax is headed to. > >>However, I've been trying to drop the prelude, and while the > >>-D_ATS_PRELUDE_NONE option to atscc allows to stop C code from compiling > >>against the prelude, it still requires the ATS part of the code of the > >>prelude. I've been trying to manually get rid of it, but it seems that > >>atsopt has builtin code that checks the existence of files in the > >>prelude. For instance prelude/fixity.ats. Isn't there a way to work > >>around that in a clean way? (I have a very ugly way to work around it, > >>but it's not satisfactory.) > > I will be happy to accommodate it. Maybe you can first come up with a > design and try it yourself. If it means hacking the ATS code of atsopt, I'm still too uncomfortable with ATS to do it. For now, what I do is: fill the files in prelude/ with empty files, install them into a custom dir (different from ATS folder), and then use my own language to generate files for the prelude that will again be installed into a custom dir. So there's a bootstrapping problem here. The best would be a command line option to atsopt to avoid checking for the prelude, and eventually, being able to chose another prelude folder. Also, I'd be happy if the build system was a bit easier to use when wanting to customise relocation of the libs, binaries and so forth. For now, I'm using the OCaml shell module to script installation: let call = function | [] -> assert false | prog::args -> Shell.call [Shell.cmd ~chdir: (rootdir^"/git/ats-lang) prog args;; call ["cp"; "-R"; (rootdir^"/git/ats-lang-bootstrap"); "bootstrap0"];; call ["mkdir"; "bootstrap1"];; call ["aclocal"];; try call ["automake"; "--add-missing"; "--foreign"] with _ -> ();; call ["autoconf"];; call ["touch"; "config.mk.in"; "config.h.in"];; call ["sed"; "-i"; "s/PACKAGE_TARNAME='ats-anairiats'/PACKAGE_TARNAME='acaml'/g"; "configure"]; call ["sed"; "-i"; "s/PACKAGE_VERSION='.*'/PACKAGE_VERSION='0.0.1'/g"; "configure"]; call ["sh"; "configure"; "--prefix=/home/ats"];; call ["make"];; call ["make"; "install"];; Somehow, I'd like to avoid to be forced using sed. Maybe there are options in the configure script that I have missed, but I do not believe so. > >>I also a question about licencing. This is not about starting a > >>licencing flame war, but more to know what is allowed and what is not. I > >>see that ATS is distributed under GPL v3. Also that some headers in the > >>prelude are distributed under LGPL v2.1. Also that some headers in > >>various libs are proprietary (which surprises me a bit). > > Generally speaking, we have: > > ATS/Anairiats compiler source -> GPL v3 > ATS/Anairiats libscode -> LGPL v2.1 Fair enough. The GC is also GPL v3. That hurts a bit more. I mean, I'm fine with GPL, but I'm wondering whether or not you'll take the bother to specify things like linking exceptions. Or going LGPL for the GC. Or if the perspective of having everything GPL is a rather fixed perspective. > where libs include prelude, libc, libats. Libs in contribute are handled > individually. > > If you found discrepancies, please let me know. > > >>But my question is more about compiled ATS code. And about some runtime > >>code that ATS softwares gets linked to. It seems to me that it still is > >>GPL or LGPL. So are all code linked against the runtime GPL? > > As far as I can tell. OK. That position seems to me to be a bit tough. I mean, when you link with g++ runtime, gcc guys do not expect such code to be GPL as far as I know. Again, not wanting to start an argument, just notifying my surprise about this. > --Hongwei -- Guillaume Yziquel |
From: Hongwei Xi <hw...@cs...> - 2011-04-26 22:44:37
|
>>That position seems to me to be a bit tough. I mean, when you link with >>g++ runtime, gcc guys do not expect such code to be GPL as far as I >>know. Again, not wanting to start an argument, just notifying my >>surprise about this. >>> >>GPL or LGPL. So are all code linked against the runtime GPL? >>> As far as I can tell. Sorry I was wrong. Linking should be LGPL (not GPL). --Hongwei Computer Science Department Boston University 111 Cummington Street Boston, MA 02215 Email: hw...@cs... Url: http://www.cs.bu.edu/~hwxi Tel: +1 617 358 2511 (office) Fax: +1 617 353 6457 (department) |
From: Hongwei Xi <hw...@cs...> - 2011-04-27 00:02:00
|
On Wed, 27 Apr 2011, Guillaume Yziquel wrote: >>The GC is also GPL v3. That hurts a bit more. I mean, I'm fine with GPL, >>but I'm wondering whether or not you'll take the bother to specify >>things like linking exceptions. Or going LGPL for the GC. Or if the >>perspective of having everything GPL is a rather fixed perspective. FYI. I have just changed the license for GCATS from GPL 3 to LGPL 2.1. It was written largely following Bohem's GC. So it should probably be given an MIT (aka. X11) license. --Hongwei Computer Science Department Boston University 111 Cummington Street Boston, MA 02215 Email: hw...@cs... Url: http://www.cs.bu.edu/~hwxi Tel: +1 617 358 2511 (office) Fax: +1 617 353 6457 (department) |
From: Guillaume Y. <gui...@ci...> - 2011-04-27 01:38:26
|
Le Wednesday 27 Apr 2011 à 00:34:08 (+0200), Guillaume Yziquel a écrit : > Le Tuesday 26 Apr 2011 à 17:48:07 (-0400), Hongwei Xi a écrit : > > On Tue, 26 Apr 2011, Guillaume Yziquel wrote: > > > > >>However, I've been trying to drop the prelude, and while the > > >>-D_ATS_PRELUDE_NONE option to atscc allows to stop C code from compiling > > >>against the prelude, it still requires the ATS part of the code of the > > >>prelude. I've been trying to manually get rid of it, but it seems that > > >>atsopt has builtin code that checks the existence of files in the > > >>prelude. For instance prelude/fixity.ats. Isn't there a way to work > > >>around that in a clean way? (I have a very ugly way to work around it, > > >>but it's not satisfactory.) Not only atsopt checks for the existence of files in prelude/, it also checks that certain items are declared. For instance, exception_viewtype and bool_t0ype. INTERNAL ERROR (ats_stadyncst2): s2cstref_get_cst: the pervasive static constant [bool_t0ype] is not available. The above error message is a message I get when I refactor the contents of the files in prelude. Had a look at: http://www.ats-lang.org/IMPLEMENTATION/ATSOPT/ats_stadyncst2_dats.html and I do not really see what this file means and how it works. Are such values defined here because they are tightly coupled with the parser of ATS source code? -- Guillaume Yziquel |
From: Hongwei Xi <hw...@cs...> - 2011-04-27 02:16:31
|
>>The above error message is a message I get when I refactor the contents >>of the files in prelude. Had a look at: >> >>http://www.ats-lang.org/IMPLEMENTATION/ATSOPT/ats_stadyncst2_dats.html >> >>and I do not really see what this file means and how it works. It define some static and dynamic constants. >>Are such values defined here because they are tightly coupled with the >>parser of ATS source code? Such values are needed for type-checking. There are not needed for parsing. For what you are doing, you can create another namespace, say XYZ, for the generated ATS code. If you have a type called iostream, then transalte it into $XYZ.iostream. There is no need to use the default name space (as the generated ATS code is not meant to be read). --Hongwei Computer Science Department Boston University 111 Cummington Street Boston, MA 02215 Email: hw...@cs... Url: http://www.cs.bu.edu/~hwxi Tel: +1 617 358 2511 (office) Fax: +1 617 353 6457 (department) |
From: Guillaume Y. <gui...@ci...> - 2011-04-27 02:49:31
|
Le Tuesday 26 Apr 2011 à 22:16:21 (-0400), Hongwei Xi a écrit : > >>The above error message is a message I get when I refactor the contents > >>of the files in prelude. Had a look at: > >> > >>http://www.ats-lang.org/IMPLEMENTATION/ATSOPT/ats_stadyncst2_dats.html > >> > >>and I do not really see what this file means and how it works. > > It define some static and dynamic constants. OK. This is precisely what I'm interested in understanding and eventually amend to fit my needs. Although it seems to me a bit unnecessary to do so, it's useful to get a trimmed down system do try to do something lean and clean. > >>Are such values defined here because they are tightly coupled with the > >>parser of ATS source code? > > Such values are needed for type-checking. There are not needed for > parsing. OK. But why are they necessarily predefined? I mean, for instance abstype string_int_type (int) doesn't seem to me to be a requirement to have that predefined. strings could just be defined in user code. What led me to mention parsing was that if you have a literal "a string", you need the typechecker to assign a type and you need it predefined somewhere. By 'tight coupling', i meant: being able to feed to the type checker types associated to things like string literals. Am I mistaken? In a sense, they'd just be hooks, and that would explain why string_int_type is required, while it seems acceptable that the string type be defined separately in user code. I am currently having such an issue with my trimmed down system: /home/ats/git/acaml/samples/code.dats: 178(line=7, offs=23) -- 181(line=7, offs=26): error(2): the static identifier [int] is unrecognized. > For what you are doing, you can create another namespace, say XYZ, for > the generated ATS code. If you have a type called iostream, then transalte > it into $XYZ.iostream. There is no need to use the default name space > (as the generated ATS code is not meant to be read). That's a neat idea, and a clean separation. > --Hongwei -- Guillaume Yziquel |
From: Hongwei Xi <hw...@cs...> - 2011-04-27 03:16:05
|
On Wed, 27 Apr 2011, Guillaume Yziquel wrote: >>Le Tuesday 26 Apr 2011 à 22:16:21 (-0400), Hongwei Xi a écrit : >>> >>The above error message is a message I get when I refactor the contents >>> >>of the files in prelude. Had a look at: >>> >> >>> >>http://www.ats-lang.org/IMPLEMENTATION/ATSOPT/ats_stadyncst2_dats.html >>> >> >>> >>and I do not really see what this file means and how it works. >>> >>> It define some static and dynamic constants. >> >>OK. This is precisely what I'm interested in understanding and >>eventually amend to fit my needs. Although it seems to me a bit >>unnecessary to do so, it's useful to get a trimmed down system do try to >>do something lean and clean. >> >>> >>Are such values defined here because they are tightly coupled with the >>> >>parser of ATS source code? >>> >>> Such values are needed for type-checking. There are not needed for >>> parsing. >> >>OK. But why are they necessarily predefined? I mean, for instance >> >> abstype string_int_type (int) >> >>doesn't seem to me to be a requirement to have that predefined. strings >>could just be defined in user code. What led me to mention parsing was >>that if you have a literal "a string", you need the typechecker to >>assign a type and you need it predefined somewhere. By 'tight coupling', >>i meant: being able to feed to the type checker types associated to >>things like string literals. Am I mistaken? A literal string is given the type string_int_type(n) for some n, where n is the length of the string. For instance, "abc" is given the type string_int_type(3). >>In a sense, they'd just be hooks, and that would explain why >>string_int_type is required, while it seems acceptable that the string >>type be defined separately in user code. I am currently having such an >>issue with my trimmed down system: >> >>/home/ats/git/acaml/samples/code.dats: 178(line=7, offs=23) -- >>181(line=7, offs=26): error(2): the static identifier [int] is >>unrecognized. You can use something like 'myint' for 'int' and then define 'myint' somewhere plus functions operating on 'myint'. --Hongwei Computer Science Department Boston University 111 Cummington Street Boston, MA 02215 Email: hw...@cs... Url: http://www.cs.bu.edu/~hwxi Tel: +1 617 358 2511 (office) Fax: +1 617 353 6457 (department) |
From: Hongwei Xi <hw...@cs...> - 2011-04-27 18:02:24
|
Hi, I am used to writing C-style if-expressions like: (x >= y ? x : y) So, i have loaded if! (external identifier) with a syntactic definition to support writing if! (EXP1, EXP2, EXP3) for (if EXP1 then EXP2 else EXP3) Here is a comparsion: if! (x >= y, x, y) if x >= y then x else y Saving 5 keystrokes :) Another comparison if space chars are removed: if!(x >= y,x,y) if x >= y then x else y --Hongwei Computer Science Department Boston University 111 Cummington Street Boston, MA 02215 Email: hw...@cs... Url: http://www.cs.bu.edu/~hwxi Tel: +1 617 358 2511 (office) Fax: +1 617 353 6457 (department) |
From: Guillaume Y. <gui...@ci...> - 2011-04-27 18:37:41
|
Le Wednesday 27 Apr 2011 à 14:02:06 (-0400), Hongwei Xi a écrit : > > Here is a comparsion: > > if! (x >= y, x, y) > if x >= y then x else y > > Saving 5 keystrokes :) Hmmm... perhaps it's because I'm more used to ML, but I'm not so convinced that the former is a huge win over the latter... I think ATS already uses quite a lot of punctuation symbols, and that it doesn't really enhance readability. -- Guillaume Yziquel |
From: Matthias B. <mat...@gm...> - 2011-04-28 17:55:15
|
Hi, > Hi, > > I am used to writing C-style if-expressions like: > (x >= y ? x : y) > > So, i have loaded if! (external identifier) with a syntactic > definition to support writing What is the advantage over a macro? |
From: Hongwei Xi <hw...@cs...> - 2011-04-28 19:46:22
|
>>> I am used to writing C-style if-expressions like: >>> (x >= y ? x : y) >>> >>> So, i have loaded if! (external identifier) with a syntactic >>> definition to support writing >> >>What is the advantage over a macro? Good point. A macro definition is like: macdef ifmac (_cond, _then, _else) = if ,(_cond) then ,(then) else ,(_else) I could not think of any advantage of if! over ifmac. --Hongwei Computer Science Department Boston University 111 Cummington Street Boston, MA 02215 Email: hw...@cs... Url: http://www.cs.bu.edu/~hwxi Tel: +1 617 358 2511 (office) Fax: +1 617 353 6457 (department) |
From: Guillaume Y. <gui...@ci...> - 2011-05-03 20:53:43
|
Le Tuesday 26 Apr 2011 à 23:15:56 (-0400), Hongwei Xi a écrit : > On Wed, 27 Apr 2011, Guillaume Yziquel wrote: > > >>Le Tuesday 26 Apr 2011 à 22:16:21 (-0400), Hongwei Xi a écrit : > >>> >>The above error message is a message I get when I refactor the contents > >>> >>of the files in prelude. Had a look at: > >>> >> > >>> >>http://www.ats-lang.org/IMPLEMENTATION/ATSOPT/ats_stadyncst2_dats.html > >>> >> > >>> >>and I do not really see what this file means and how it works. > >>> > >>> It define some static and dynamic constants. I'm still on this one. Specifically, concerning the link above, there is the line: implement Sizeof_viewt0ype_int = s2cstref_make "sizeof_viewt0ype_int" I've been desperately searching around the compiler's source code and in the prelude, but I do not see what is in charge of emitting 'sizeof' in generated C code. I'm interested in the following pieces of code found in the prelude sta sizeof_viewt0ype_int : viewt@ype -> int stadef sizeof = sizeof_viewt0ype_int typedef sizeof_t (a:viewt@ype) = size_int_t0ype (sizeof_viewt0ype_int a) implement{a} ref (x) = begin let var x = x in ref_make_elt_tsz {a} (x, sizeof<a>) end end where ref_make_elt_tsz is implemented in C code. As far as I understand it, 'ref' is a templatised function, and 'sizeof<a>' is the application of the static 'a' to get an int, given that sizeof is a static term of type 'viewt@ype -> int'. I'd be really curious to know how it is known that ATS 'sizeof' should be generating the C 'sizeof' in generated C code. This doesn't seem to be specified in the prelude, but the fact that I could not squeeze out sizeof_viewt0ype_int from the prelude seems to indicate that it is a builtin. Is it possible to declare in vanilla ATS a static term that gets written down in C code by a given token? Or is it only possible for this specific 'sizeof_viewt0ype_int' builtin? -- Guillaume Yziquel |
From: Hongwei Xi <hw...@cs...> - 2011-05-03 21:07:39
|
>> >>I've been desperately searching around the compiler's source code and in >>the prelude, but I do not see what is in charge of emitting 'sizeof' in >>generated C code. >> >>I'm interested in the following pieces of code found in the prelude >> >> sta sizeof_viewt0ype_int : viewt@ype -> int >> stadef sizeof = sizeof_viewt0ype_int >> >> typedef sizeof_t >> (a:viewt@ype) = size_int_t0ype (sizeof_viewt0ype_int a) >> >> implement{a} ref (x) = begin >> let var x = x in ref_make_elt_tsz {a} (x, sizeof<a>) end >> end >> >>where ref_make_elt_tsz is implemented in C code. >> >>As far as I understand it, 'ref' is a templatised function, and >>'sizeof<a>' is the application of the static 'a' to get an int, given >>that sizeof is a static term of type 'viewt@ype -> int'. >> >>I'd be really curious to know how it is known that ATS 'sizeof' should >>be generating the C 'sizeof' in generated C code. This doesn't seem to >>be specified in the prelude, but the fact that I could not squeeze out >>sizeof_viewt0ype_int from the prelude seems to indicate that it is a >>builtin. 'sizeof' is treated specially. sizeof<a> is mapped to a value of the form VPsizeof (declared in ats_ccomp.sats), which is then mapped to 'sizeof' in C. >>Is it possible to declare in vanilla ATS a static term that gets written >>down in C code by a given token? Or is it only possible for this specific >>'sizeof_viewt0ype_int' builtin? What kind of static term? An example would be good. --Hongwei Computer Science Department Boston University 111 Cummington Street Boston, MA 02215 Email: hw...@cs... Url: http://www.cs.bu.edu/~hwxi Tel: +1 617 358 2511 (office) Fax: +1 617 353 6457 (department) |
From: Guillaume Y. <gui...@ci...> - 2011-05-03 21:50:25
|
Le Tuesday 03 May 2011 à 17:07:26 (-0400), Hongwei Xi a écrit : > >> > >>I'd be really curious to know how it is known that ATS 'sizeof' should > >>be generating the C 'sizeof' in generated C code. This doesn't seem to > >>be specified in the prelude, but the fact that I could not squeeze out > >>sizeof_viewt0ype_int from the prelude seems to indicate that it is a > >>builtin. > > 'sizeof' is treated specially. sizeof<a> is mapped to a value > of the form VPsizeof (declared in ats_ccomp.sats), which is then mapped to > 'sizeof' in C. OK. Thanks. Helpful to know the compiler a bit better. > >>Is it possible to declare in vanilla ATS a static term that gets written > >>down in C code by a given token? Or is it only possible for this specific > >>'sizeof_viewt0ype_int' builtin? > > What kind of static term? An example would be good. The first one that pops to my mind would be the 'offsetof' macro definition in stddef.h. Or the 'container_of' macro for the linux kernel. Doesn't seem impossible to port these macros to ATS, but still. But it's perhaps a more general thing. It might allow interesting metaprogramming facilities: reflecting name of types as strings, or calling out C++ functions by implementing name mangling in such a static term. I do not really have anything specific, really. These are just what springs to mind. It was more a question about what is possible or not, not a feature request. I just failed to find in the documentation anything that would explain this kind of code generation for sizeof, that's all. > --Hongwei -- Guillaume Yziquel |