[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)