Comment by codygman

12 years ago

> Idris - it seems like the only one that's oriented towards practical programming

Whether you like ATS or not, it's very oriented towards practical programming. Also, ATS mostly looks bad IMO because of the style the author uses.

I still haven't fully formed an opinion on ATS though. Idris does seem really cool and stuff like enforcing time/space usage through the type system excites me.

I'm not sure whether my issue with ATS is the style of the author or its type system, although I suspect the former.

ATS is based on ML (the author started with Dependent ML), but the code has a very imperative feel, leading to statements like "let () = expr() in ..." and "let x = ... in ()".

The stuff at http://www.ats-lang.org/Examples.html is just hideous, by the way.

  • Here's just a small translation of the ats examples[0] page.

    ----------------- Copying File ----------------

    Authors version:

        fun
        fcopy (
          inp: FILEref
        , out: FILEref
        ) : void = let
          val c = fileref_getc (inp)
        in
          if c >= 0 then let
            val () = fileref_putc (out, c) in fcopy (inp, out)
          end // end of [if]
        end (* end of [fcopy] *)
    

    ----------------- Naieve Fibonacci ----------------

    My version:

        fun fcopy ( 
          inp: FILEref,
          out: FILEref
        ) : void = let
          val c = fileref_getc (inp)
        in
          if c >= 0 then let
            val () = fileref_putc (out, c) in fcopy (inp, out)
          end 
        end 
    

    Authors version:

        fun
        fib (
          n: int
        ) : int =
          if n >= 2 then fib (n-2) + fib (n-1) else n
    

    My Version (not sure if valid!):

        fun fib ( n: int ) : 
          int = if n >= 2 then fib (n-2) + fib (n-1) else n
    

    ----------------- Fast Fibonacci ----------------

    Authors Version:

        fun
        fibc (
          n: int
        ) : int = let
          fun loop (n: int, f0: int, f1: int) =
            if n > 0 then loop (n-1, f1, f0+f1) else f0
          // end of [loop]
        in
          loop (n, 0, 1)
        end // end of [fibc]
    

    My Version:

        fun fibc ( n: int ) : int = 
          let
            fun loop (n: int, f0: int, f1: int) =
              if n > 0 then loop (n-1, f1, f0+f1) else f0
          in
          loop (n, 0, 1)
        end
    

    0: http://www.ats-lang.org/Examples.html