7 ms·
The Neut Programming Language
- gnabgib 2y agoBig in 2020 as a Show HN (456 points, 80 comments) https://news.ycombinator.com/item?id=23283880 https://news.ycombinator.com/item?id=23283880
- dang 2y agoThanks! Macroexpanded: Show HN: A dependently-typed programming language with static memory management - https://news.ycombinator.com/item?id=23283880 https://news.ycombinator.com/item?id=23283880 - May 2020 (78 comments) I'll see if I can email the author.
- tempodox 2y agoAs a matter of personal preference, hoisted curlies drive me insane.
- layer8 2y agoWhat are “hoisted curlies”?
- stronglikedan 2y agoIf I had to guess, it's putting the opening curly bracket on the same line as the function definition, instead of the next line. And if I'm correct, then I also agree.
- patrickmay 2y agoAllman style FTW!
- tempodox 2y agoif (condition) { // <- hoisted curly do_it(); }
- adrian_b 2y agoObviously the personal preferences about code formatting vary a lot among programmers and it is impossible to reach unanimity. For instance, I am among those who are annoyed when seeing lines of text wasted with the opening curly brace, reducing thus the number of useful text lines visible on the screen. Probably it is best to use an automatic code formatter and format the code according to personal preferences while working with it and then reformat it according to project rules when committing the code to the repository.
- mindcrime 2y ago> For instance, I am among those who are annoyed when seeing lines of text wasted with the opening curly brace, Conversely, I'm one of the people who are annoyed when the tokens that represent a block of code don't form a vertical line, making it much harder to see "at a glance" where blocks begin and end. > Probably it is best to use an automatic code formatter and format the code according to personal preferences while working with it and then reformat it according to project rules when committing the code to the repository. At the end of the day, I'm convinced there is no "right" way to do this. Everybody has their preferences, and who's to say that one set of preferences is objectively more meaningful than another? You care about wasted vertical space, I don't. I care about tokens lining up, you (probably?) don't (at least not as much as I do). But neither of us is really "right" or "wrong".
- bombela 2y agoAnd I am annoyed with the lack of indentation with a dedicated character (like tab maybe). With spaces, my editor has to guess how much to delete. If I want to tabulate a table. It might fight me. This really irks me. I want it all. No lines wasted, uniform indentation, dedicated indentation character. Python with tab for indentation feels right to me. I also like to set a vertical highlight in my editor to vertically delinate indentation levels.
- lmm 2y agoThe best available evidence is that bug count correlates only with number of lines of code, and therefore an approach that reduces the number of lines of code is objectively better. Some people don't like Whitney-style code, but as far as I can see that's just intellectual cowardice.
- sirwhinesalot 2y agoThe Koka language uses a similar approach to track resource usage, except there they use ref counting and just remove unnecessary ref counting operations. Neat stuff.
- eddd-ddde 2y agoKoka is one of those languages that I really wish continue developing and growing. So many cool design concepts.
- fuzztester 2y agoIt looks partly like OCaml, with the "let ... in" kind of syntax. Also the "unit" word. I think in OCaml it means a function that doesn't return any value, but why is the word unit used for that?
- chris_pie 2y agoIt's a standard practice in functional languages: https://en.wikipedia.org/wiki/Unit_type https://en.wikipedia.org/wiki/Unit_type
- fuzztester 2y agoThat sounds like those corporate types who brush off any complaints by users, by saying "that is corporate policy" :) #sorrycouldntresist But seriously, according to that link, it seems to me like the zero or empty type is more suitable. But I am not a PL or type theory expert.
- saithound 2y ago> But seriously, according to that link, it seems to me like the zero or empty type is more suitable. That's a bit different. The empty type is only suitable for functions that never return (e.g. loop infinitely, crash the program). The type checker will prevent functions that have the empty type as a return type from returning.
- akdas 2y agoTo expand on this: the "unit" here represents the number of possible values that can be returned. The confusion is probably because "empty" can mean two things: - What's inside the returned value. That may be why the parent suggested empty for the unit type. But that's now what "unit" means in the common parlance. - How many possible values can be returned. Never returning means the function has zero possible return values.
- lmm 2y agoIt's a one type, not a zero type - the function does return and it always returns the same thing. It makes this kind of function more normal and regular - you can say that functions always return 1 value, and then it means you don't have to special-case void functions (which is a problem you have to work around in e.g. C++ templating), you can do things like put the return value of the function in a variable and then use it for something since it's just a normal value (which matters if you want to write e.g. a generic compose function that runs a bunch of functions in, IDK, a database transaction or something).
- sestep 2y agoFor "How Fast is This?" it links to a benchmarks page, which only shows that it's faster than Haskell. It would be more informative to instead compare against a language that is more popular and/or more performant than Haskell.
- deleted 2y ago[deleted]
- hajile 2y agoC is usually 1-4x faster than Haskell. This looks to be within 1-2x. The key takeaway for me is that you're in the range where very slight variations in implementation of the same algorithm make the difference between which is faster.
- asplake 2y agoCould someone explain the “Necessity and noema” section [1] or share a reference? Looked like it might be significant but I couldn’t make much sense of it [1] https://vekatze.github.io/neut/terms.html#necessity-and-noema https://vekatze.github.io/neut/terms.html#necessity-and-noem...
- ninalanyon 2y agoDDG took me straight to https://en.wikipedia.org/wiki/Noema https://en.wikipedia.org/wiki/Noema
- theamk 2y agohttps://vekatze.github.io/neut/static-memory-management.html https://vekatze.github.io/neut/static-memory-management.html is a good explanation. TL/DR: All functions are pass-by-value. To avoid complete tanking of performance, they have "noema" (same as a reference in other language), which contains pointer to "hyle" (reference target in other languages). Since the language is GC-free, the references cannot escape out of the block they are defined in. The language authors really like inventing the new programming terms.
- asplake 2y agoAh, thanks
- saghm 2y agoFrom glancing through a few of the pages that piqued my interest, I was somewhat surprised to see this section in "How to Execute Types" (https://vekatze.github.io/neut/how-to-execute-types.html https://vekatze.github.io/neut/how-to-execute-types.html): > Here, we'll see how a type is translated into a function that discards/copies the terms of the type. To see the basic idea, let's take a simple ADT for example: data item { | New(int, int) } > The internal representation of New(10, 20) is something like the below: > New(10, 20) // ↓ (compile) let v = malloc({2-words}) in store(10, v[0]); store(20, v[1]); v I suspected that it's not actually heap-allocating every single bit of memory in every program, and from looking around more in the docs, I _think_ the "Allocation Canceling" section here explains what I was missing (https://vekatze.github.io/neut/basis.html#allocation-canceling https://vekatze.github.io/neut/basis.html#allocation-canceli...): > When a free is required, Neut looks for a malloc that is the same size and optimizes away such a pair if one exists. This is a really interesting way of automating memory management at compile time. I imagine there's still a lot of room for different choices in this strategy (e.g. choosing to reuse part of a larger allocation rather than looking for one that's exactly the same size and then leaving behind the remainder to re-use for a future allocation), and I'm super curious about whether this would end up encouraging different patterns than existing memory management systems. Offhand, it almost seems like it could act as a built-in allocation buffer managed by the compiler, and I'm curious if the algorithm for reusing memory is smart enough to handle something like manually allocating the maximum amount of memory needed for the lifetime of the program up front and then re-using that for the duration of the program to avoid needing to allocate anything dynamically at all (although my worry would be that this would devolve into the knapsack problem and not be feasible in practice). If this did work though, my immediate idea would be for some sort of hook where you could specify the maximum amount of memory you'd be willing to use, which could then turn "using too much memory at runtime" into a compiler error. My assumption is that that I'm missing something that would make all of this not work the way I'm thinking though.
- agentultra 2y agoThere might even be some possibility for cross-pollination with ideas such as Counting Immutable Beans [0]. I’ve long wondered if there could be a functional programming language that made static memory management less verbose and easier to manage without monads and other explicit structures. [0] https://arxiv.org/abs/1908.05647 https://arxiv.org/abs/1908.05647
- ftbsqcfjm 2y ago[dead]
- skulk 2y agoI'm currently reading through the automatic memory management claims which look really cool (reminds me of linear types), but the highlighted punctuation (, : =) makes it very painful to read.
- deleted 2y ago[deleted]
- layer8 2y agoSyntax highlighting of the background color is weird. It makes everything look like surrounded by a halo.
- HackerThemAll 2y ago3 times on HN: 4 days ago, 3 days ago, and this one 2 days ago. Still no, thank you, doesn't seem to be as compelling as Rust to me.