[HN Gopher] Gleam: A Basic Introduction
       ___________________________________________________________________
        
       Gleam: A Basic Introduction
        
       Author : Alupis
       Score  : 52 points
       Date   : 2024-10-11 18:57 UTC (4 hours ago)
        
 (HTM) web link (peq42.com)
 (TXT) w3m dump (peq42.com)
        
       | systems wrote:
       | the gleam tour is also very good https://tour.gleam.run/
       | 
       | very very good
        
         | xorvoid wrote:
         | From the tutorial:
         | 
         | // Division by zero is not an error
         | 
         | io.debug(3.14 /. 0.0)
         | 
         | It prints 0
         | 
         | Yuck. Division by zero is an unfortunate reality but basically
         | nobody with mathematical background thinks that just defining
         | x/0 = 0 is a good solution.
         | 
         | Often in numerical computing, getting an NaN or Inf is a
         | blessing in that it's a hint that your algorithm is numerically
         | buggy, in the same way that a crash or a exception would
         | indicate a program bug.
         | 
         | This approach is the numeric equivalent of a program continuing
         | on after an undefined variable, just assuming it's 0. That was
         | tried by scripting languages in the 90s and these days most
         | folks think it was a bad approach.
        
           | Buttons840 wrote:
           | INTERCAL. It just skips lines if they're syntactically
           | invalid or cause a runtime error; it just skips them and
           | keeps going.
        
           | Alupis wrote:
           | The divide-by-zero thing is explained here[1]. The relevant
           | bits:
           | 
           | > Gleam does not implicitly throw exceptions, so throwing an
           | exception is not an option. The BEAM VM does not have a
           | Infinity value, so that is not an option. Therefore Gleam
           | returns 0 when dividing by zero.
           | 
           | > The standard library provides functions which return a
           | Result type for division by zero which you can use if that is
           | more suitable for your program.
           | 
           | You can also use Guards[2] to prevent handle a divide-by-zero
           | situation before you attempt it.
           | 
           | [1] https://gleam.run/frequently-asked-questions/#why-does-
           | divis...
           | 
           | [2] https://tour.gleam.run/everything/#flow-control-guards
        
           | Ndymium wrote:
           | I wouldn't call myself a person with a mathematical
           | background, but there are those people who believe it's just
           | fine. [0] I don't have enough knowledge to debate that, but
           | it would seem to disprove "basically nobody". Zero is a
           | convention, like NaN or Inf are conventions.
           | 
           | A problem that Gleam has here is that the Erlang runtime does
           | not have NaN or Inf in its float type (or integer type for
           | that matter). It could be represented with an atom, but that
           | would require an atom and a float having the same type in
           | Gleam, which is not something the type system can do (by
           | design). The operator could, in theory, return a
           | Result(Float, DivisionByZeroError), but that would make using
           | it very inconvenient. Thus zero was chosen, and there is an
           | equivalent function in the stdlib that returns a result
           | instead, if you wish to check for division by zero.
           | 
           | [0] https://www.hillelwayne.com/post/divide-by-zero/
        
           | throwawaymaths wrote:
           | Yeah you can really get yourself into trouble if you make
           | dividing by zero zero. It's a strong indication that you have
           | done something horribly wrong in your code upstream of that
           | point. Why would you throw away that signal?
        
           | Fire-Dragon-DoL wrote:
           | I have no math background but every line of code I wrote that
           | involved a division, I just wished that division by 0 results
           | in 0, so this actually resonated with me
        
           | whalesalad wrote:
           | Regardless of what happens in the language, this needs to be
           | handled.
           | 
           | In python for instance, the developer needs to be prepared to
           | catch a divide by zero exception.
           | 
           | In gleam, the same consideration is required but the
           | implementation will just differ.
           | 
           | I don't actually see an issue here. It's a potential gotcha,
           | but once you are aware of this feature of the language, it's
           | no different than any other.
        
       | cedws wrote:
       | I've been interested in Gleam, but I didn't realise it just
       | transpiles to Erlang, I thought it compiled directly to BEAM
       | bytecode. Bit of a turnoff to be honest, I really don't want to
       | deal with transpilation.
        
         | Ndymium wrote:
         | Which part do you feel like would be an issue? When you run
         | `gleam compile`, it will automatically call the Erlang compiler
         | to finish the job.
         | 
         | I find it very handy that the intermediate Erlang (or JS) files
         | are available in the build directory. It lets you easily see
         | what form your code will take when compiled.
        
           | rtorr wrote:
           | Also prevents lock-in if you ever need to move away from
           | gleam.
        
           | pan69 wrote:
           | I don't think it's the transpile part that would the issue,
           | it's the runtime aspect. If Gleam transpiles to
           | Erlang/Javascript that's great but once you run the program,
           | you have to potentially deal with runtime issues specific to
           | those environments which you might not be familiar with.
           | 
           | It seems that Gleam is really useful for those who are
           | already in either the Erlang/Javascript ecosystem.
        
             | Alupis wrote:
             | On the contrary, it's a great first BEAM language to learn
             | because of it's simplicity - both in terms of the grammar
             | as well as it's tooling/compiler.
             | 
             | For me personally, the Javascript target is the least
             | interesting bit - the BEAM/Erlang target is where it's at
             | for backend work. The BEAM is fascinating and full of ideas
             | that were once ahead-of-their-time but now are really
             | coming into their own with compute performance having
             | caught up.
             | 
             | Gleam is a strongly typed language, and is unapologetically
             | very functional. Error handling in general is quite
             | different than it would be on a normal stack-based
             | language/vm. In my experience, the Erlang target doesn't
             | make debugging any harder or more difficult than you would
             | expect for an exception-less language.
        
           | cedws wrote:
           | Another layer of abstraction, another thing to go wrong,
           | another thing to rot.
        
         | Muromec wrote:
         | It makes perfect sense to target erlang and not BEAM directly
         | as allows erlang compiler to optimize the code for the newer
         | BEAM runtime with newer fancier opcodes.
        
         | hosh wrote:
         | Gleam used to compile to Core Erlang (Erlang Intermediate
         | Representation) but looks like it now compiles to pretty-
         | printed Erlang.
         | 
         | https://blog.lambdaclass.com/an-interview-with-the-creator-o...
        
       | written-beyond wrote:
       | I honestly gave gleam a serious look, considering it to build a
       | system that might really benefit from it's concurrency model.
       | However the lack of Macros/macro-style reflection capabilities
       | really put me off. It makes working with SQL databases needlessly
       | verbose. It's the same with go, though go posses the capabilities
       | to directly unmarshal SQL rows into a structure with tags, it's
       | far from straightforward.
        
       ___________________________________________________________________
       (page generated 2024-10-11 23:00 UTC)