[HN Gopher] Janet - a Lisp-like functional, imperative programmi...
       ___________________________________________________________________
        
       Janet - a Lisp-like functional, imperative programming language
        
       Author : tsujp
       Score  : 208 points
       Date   : 2021-10-13 11:26 UTC (11 hours ago)
        
 (HTM) web link (github.com)
 (TXT) w3m dump (github.com)
        
       | matvore wrote:
       | I am a happy though very new Janet user. I started migrating my
       | existing workflow optimization scripts (e.g. Git wrappers) to--
       | and writing new ones--in Janet as of a few months ago. I used to
       | use Perl but I switched to Janet as it is a much simpler language
       | and VM, and being a Lisp is ~infinitely extensible.
       | 
       | Janet has os/ and file/ packages, as well as a PEG system which
       | mostly stand in for the best features of Perl. Some low-level
       | POSIX-specific operations (like daemonizing and forking) aren't
       | practical but I can just use C for those.
       | 
       | I am also using it to teach my son very simple programming. He
       | can't type well yet, so the terseness of the language helps
       | (there are cryptic symbols but he likes learning their names and
       | how to type them). Its REPL and functional style I feel help a
       | lot too.
        
         | harryvederci wrote:
         | I've played with the idea of converting my bash path scripts to
         | Janet, but haven't had the time yet. Have you experienced any
         | downsides of using it for your optimization scripts?
        
           | matvore wrote:
           | I would say that if you're interested, go for it.
           | 
           | My complaints about Janet are not too big. I feel like there
           | are many ways to do some things, and they are all basically
           | the same. Most of this excessive flexibility is inherited
           | from Clojure.
           | 
           | 1. It's never clear whether I need `cond` or can get by with
           | `case` until I've waffled around a bit
           | 
           | 2. I don't know whether to choose `if`, `and`, or `when`, for
           | conditionals, because there are many times when all three
           | would work. Also, if the condition expression is trivially
           | negated (e.g. change '=' to '!=') then even `or` would work,
           | making 4 choices.
           | 
           | 3. It's hard to choose between `->` vs. manually-nested
           | expressions.
           | 
           | EDIT: formatting
        
             | actuallyalys wrote:
             | I'm pretty experienced with Clojure and here are my takes
             | on those:
             | 
             | 1. The Janet docs suggest `cond` as a replacement for if-
             | if-else-else chains in other languages and `case` for
             | `switch`-`case` blocks. That's a pretty good rule, although
             | maybe you've already encountered that explanation? My main
             | rule of thumb is that if the important value is "enum-y",
             | representing a particular kind of thing or state, try
             | `case`. If not, use `cond`. Neither Janet nor Clojure have
             | enums (although you might be able to hack them in through
             | macros or interop), so keywords usually serve that role.
             | 
             | 2. I would prefer `when` to `if` because it's usually
             | clearer what's going on. I usually don't use `and` in place
             | of `if`. The trivial negation problem is an issue in
             | basically any programming language that has `and`, `or`,
             | and `not`, but it does add more options. Whether to use
             | `and` or the equivalent `or`, I think your first instinct
             | is often best.
             | 
             | 3. I tend to favor threading macros (`->` and `->>`) when
             | something is three or more functions nested and manually
             | nested expressions for the rest.
             | 
             | For a total beginner, I would actually suggest forgetting
             | about the more specialized options until you're
             | comfortable. In other words, just use `cond`, `if`, and
             | manual nesting. (Obviously still use `and` within the
             | branches of `cond` or `if`.)
        
         | jhgb wrote:
         | Have you perchance tried Gerbil as well?
        
         | Karrot_Kream wrote:
         | > Janet has os/ and file/ packages, as well as a PEG system
         | which mostly stand in for the best features of Perl. Some low-
         | level POSIX-specific operations (like daemonizing and forking)
         | aren't practical but I can just use C for those.
         | 
         | The README briefly mention the C API. How easy is it to use it,
         | and how easy is it to "lift" results from the C API into Janet?
         | (e.g. wrapping an fd from the POSIX API into a file object)
        
           | matvore wrote:
           | Good question :) I actually haven't had a good excuse to use
           | the C API yet. When I need C I just code the entire tool in
           | C, or use IPC.
        
             | cjohnson318 wrote:
             | Dumb question: Is IPC Inter-Process Communication? Or is it
             | an unrelated tool?
        
       | nyanpasu64 wrote:
       | > Multithreading
       | 
       | Does it have a global interpreter lock (GIL)?
        
         | pansa2 wrote:
         | > _Each thread has its own Janet heap, which means threads
         | behave more like processes that communicate by message
         | passing._
         | 
         | https://janet-lang.org/docs/threads.html
         | 
         | Janet doesn't seem to have shared-memory multithreading. Each
         | thread runs independently, so a GIL should not be necessary.
        
           | saikyun wrote:
           | Though you can share memory manually, i.e. in C but access it
           | from Janet.
        
             | ahungry wrote:
             | I wrote similar here: https://github.com/ahungry/janet-
             | pobox although it probably needs updates to work with 1.18
             | and above.
        
               | saikyun wrote:
               | Oh, that's really cool. :) Thanks for mentioning it.
        
       | gwn7 wrote:
       | Off topic: Is it just me or are there any others who find naming
       | programming languages with women's names a bit weird?
       | 
       | Julia, Janet, Eve...
       | 
       | I understand the guy referring to his car as his "girlfriend" and
       | give it a women's name. I just can't feel the same about tech.
       | 
       | I guess this may be the nerd's way of immortalizing their
       | sweetheart, but if I was a woman I'd rather prefer to be a car
       | and not a programming language.
       | 
       | A programming language doesn't feel much anthropomorphizable to
       | me, let alone lady-like.
       | 
       | Women, what do you think?
        
         | dragonwriter wrote:
         | > I understand the guy referring to his car as his "girlfriend"
         | and give it a women's name. I just can't feel the same about
         | tech.
         | 
         | Why do you assume programming langauges with female coded names
         | are because the creator is viewing it as a girlfriend?
         | 
         | Not all creators are heterosexual males (or otherwise oriented
         | toward females as preferred or even acceptable romantic
         | partners), and even those that are don't necessarily view women
         | exclusively through the lens of romantic involvement such that
         | that would be the implication of a female name. Also, not all
         | female-coded names are actually female in reference (Janet is
         | named after a character that is expressly not a woman.)
         | 
         | > A programming language doesn't feel much anthropomorphizable
         | to me, let alone lady-like.
         | 
         | Why "let alone lady-like"? Why are female-coded names a
         | particular issue, if the problem is that programming languages
         | aren't "anthropomorphizable"? (I don't actually think naming
         | things after people is inherently about anthropomorphization;
         | we do it to freeways and bridges and other things as an honor,
         | not as anthropomorphization.)
        
           | gwn7 wrote:
           | > Why do you assume programming langauges with female coded
           | names are because the creator is viewing it as a girlfriend?
           | 
           | I am not assuming that. I was just comparing it to the
           | situation with cars.
           | 
           | > Not all creators are heterosexual males (or otherwise
           | oriented toward females as preferred or even acceptable
           | romantic partners), and even those that are don't necessarily
           | view women exclusively through the lens of romantic
           | involvement such that that would be the implication of a
           | female name.
           | 
           | I wasn't implying such a thing. But I knew a woke person was
           | going to point it out to me anyway. Funny.
           | 
           | > Janet is named after a character that is expressly not a
           | woman
           | 
           | The logo of the programming language is the face of an
           | attractive woman wearing a lipstick and a fancy hairdo. Also,
           | Janet is portrayed by a woman in the Good Place. Don't tell
           | me that the name of the language has nothing to do with a
           | woman.
           | 
           | > Why are female-coded names a particular issue
           | 
           | I don't think it is an issue. I was just thinking out loud.
           | 
           | Take it easy.
        
             | jjnoakes wrote:
             | > I am not assuming that
             | 
             | Well you did say: "this may be the nerd's way of
             | immortalizing their sweetheart", which seems to me to
             | strongly imply that your impression may be closer to
             | assuming it than to not assuming it.
             | 
             | I have no horse in this race (I'm not the one who replied
             | to your original comment), but it did seem like you were
             | assuming something awful close to what you are denying.
        
         | blacktriangle wrote:
         | Ada, Alice...
         | 
         | Interesting question, but it might just be a yellow volkswagon
         | effect. Quickly looking at Wikipedia's list of languages,
         | theres Babbage, Bertrand, Cecil, Darwin, Dylan, Escher, Euclid,
         | Euler, Godel, Hume, Orwell, Tom, Zeno, and probably a few
         | others I missed.
         | 
         | EDIT: Haskell and Pascal, how embarassing to miss those
        
           | srcreigh wrote:
           | I also like to believe PageRank was named after Larry Page.
        
           | [deleted]
        
           | hjek wrote:
           | > Haskell and Pascal, how embarassing to miss those
           | 
           | and Curry, while we're at it, https://curry-lang.org/
        
           | Tommah wrote:
           | also Haskell and Pascal
        
             | WJW wrote:
             | It's a shame that Haskell Brooks Curry did not have any
             | more names because all three of his names have already been
             | used for programming languages by now.
        
           | zajio1am wrote:
           | It is interesting that female-named languages from your
           | examples generally use first-name, while male-named languages
           | generally use surname.
        
           | phreack wrote:
           | I was first introduced to programming with Pascal, can't
           | believe I forgot about it until I saw your list.
        
         | avgcorrection wrote:
         | No, I don't think that giving non-objects/not objectifiable
         | things women's names is weird. Nor that the necessary
         | implication is that they are named after girlfriends.
        
         | jonstaab wrote:
         | It's like naming boats after women. A recognition of the
         | distinct nobility and beauty of women our culture has lost
         | track of.
        
         | snicker7 wrote:
         | I mean, this is done well outside programming languages. See;
         | for example, tropical hurricanes.
        
           | hairofadog wrote:
           | That used to be true, but hurricanes haven't been named
           | exclusively after women since 1978.
           | 
           | > _The practice of naming hurricanes solely after women came
           | to an end in 1978 when men 's and women's names were included
           | in the Eastern North Pacific storm lists. In 1979, male and
           | female names were included in lists for the Atlantic and Gulf
           | of Mexico._
           | 
           | https://www.nhc.noaa.gov/aboutnames_history.shtml
        
         | [deleted]
        
         | empthought wrote:
         | Not named after a woman (or rather, named after not-a-woman):
         | https://github.com/janet-lang/janet#why-is-it-called-janet
        
           | Barrin92 wrote:
           | >not-a-woman
           | 
           | given that the character of the show in question is an
           | archetypal secretary arguing it's not a woman is a fairly big
           | stretch. Not only is it a woman, it's a woman embodying a
           | female stereotype, (in line with the purpose of the language,
           | being an easy helper), and the 60s art deco woman's magazine
           | style logo
        
             | avgcorrection wrote:
             | Can't decide if "if it looks like a female secretary then
             | it's a woman" is progressive or backwards.
        
               | Barrin92 wrote:
               | I suppose that depends on whether you think women should
               | be doomed to the role but it takes some extraordinary
               | imagination to pretend the stereotype doesn't exist, or
               | that one gets around it by making the woman in question
               | an artificial one
               | 
               | kinda like if I made a software called arnold with a
               | picture of he-man as a logo I doubt one would be
               | considered backward for thinking I had a guy in mind
        
       | spsesk117 wrote:
       | This looks really interesting, going to check this out later
       | today. Anyone using Janet for anything that would care to comment
       | on their experience?
        
         | ianthehenry wrote:
         | I've been writing about my first impressions of the language
         | here:
         | 
         | https://ianthehenry.com/posts/janet-game/
         | 
         | Not a whole lot of content yet, but I plan to keep going with
         | it.
         | 
         | I am pretty firmly in the Haskell/OCaml "let me program with
         | types" camp for most development, but it's a great to have a
         | little scripting language to reach for instead of bash or
         | Python or Perl. Using Janet (coming from Python) reminds me a
         | bit of:
         | 
         | https://xkcd.com/353/
         | 
         | Except... without the rich standard library :)
        
           | CraigJPerry wrote:
           | Your writing style is really enjoyable, I binged the 3 posts
           | and really enjoyed, especially the macros post
        
           | spsesk117 wrote:
           | Thanks for the link, I'll definitely check it out! What
           | actually piqued my interest was the surface impression of
           | something like a Lispier Perl/Python.
        
           | actuallyalys wrote:
           | I've thought about using Janet for a game, but there's more
           | examples of people using love2d plus Fennel so I'm more
           | likely to use that combination for my future Lisp game
           | experiments. (Fennel is similar to Janet and created by the
           | same person, but compiles to Lua.)
        
         | frompdx wrote:
         | I use Janet most often as a glue for shell utilities using the
         | sh package (https://github.com/andrewchambers/janet-sh). It's a
         | great tool for building small containerized jobs. I think it
         | has a ton of potential as the ecosystem grows and matures.
         | 
         | Some rough spots:
         | 
         | - No canonical http client. There are a few attempts at
         | wrapping libcurl but nothing complete and well documented yet.
         | However, the creator of Joy framework for Janet does have an
         | http client library.
         | 
         | - The main http server circlet is MIT licensed, but it is built
         | on top of Mongoose, which is GPL/paid commercial. Something to
         | be aware of if you want to distribute binaries made with this
         | library.
         | 
         | - I have never been successful getting any of the UI or drawing
         | libraries to work.
         | 
         | - Naming of packages is a bit confusing even if you have
         | watched the Good Place and are aware of all of the inside
         | jokes.
        
           | saikyun wrote:
           | > I have never been successful getting any of the UI or
           | drawing libraries to work.
           | 
           | Have you tried jaylib (built on top of raylib)? I have gotten
           | that to work well on macos, linux and windows. :)
           | 
           | > The main http server circlet is MIT licensed, but it is
           | built on top of Mongoose, which is GPL/paid commercial.
           | Something to be aware of if you want to distribute binaries
           | made with this library.
           | 
           | While I haven't used it outside of development, chidi is MIT
           | licensed. :) https://git.sr.ht/~pepe/chidi
        
             | frompdx wrote:
             | When I tried to use jaylib I was not able to get it to work
             | at the time. Might have to give it another shot.
             | 
             | The http server used in Chidi is actually fairly new and I
             | was not aware of it. It is part of the spork package. About
             | two months ago I chatted with the creator of Janet about
             | whether or not an http server will be added. He said it
             | would not be added to core, but it looks like he added to
             | spork about a month ago. It looks like it is a pure Janet
             | implementation so there should be no licensing conflicts.
             | I'll have to try it out.
        
               | saikyun wrote:
               | I know I had some trouble with raylib's dependencies on
               | Linux. If you get stuck, feel free to at me at the janet
               | gitter.
        
               | frompdx wrote:
               | Will do, thanks!
        
             | jd_mongodb wrote:
             | The Mongoose github says it's MIT Licensed
             | https://github.com/Automattic/mongoose
        
               | frompdx wrote:
               | Different mongoose in this case: https://cesanta.com/
        
               | jd_mongodb wrote:
               | Doh!
        
         | swlkr wrote:
         | I wrote a few websites with it, notably:
         | 
         | https://github.com/swlkr/janetdocs
         | 
         | I also scraped together a large web framework and a small one:
         | 
         | https://github.com/joy-framework/joy
         | https://github.com/swlkr/osprey
        
           | frompdx wrote:
           | Thanks for all of your work Sean. I've messed around a bit
           | with Joy and have been keeping an eye on the development of
           | the framework.
        
             | swlkr wrote:
             | Hey no problem! It's always great when something I make for
             | myself works out for someone else too!
        
           | spsesk117 wrote:
           | Oh awesome, thanks for sharing, I have already been looking
           | at some community examples on there!
        
           | cellularmitosis wrote:
           | Because swlkr is a bit modest, I'll take this opportunity to
           | point out his Janet twitch streams on his behalf. Definitely
           | check them out! (google for "twitch swlkr")
        
             | swlkr wrote:
             | haha thanks for the shout out!
             | 
             | I'm currently working on ruby stuff on stream but maybe I
             | won't be able to stay away from Janet for long
        
           | harryvederci wrote:
           | I'm using your html library (a Clojure hiccup clone, sort of)
           | and tw (tailwind) library, and often use janetdocs to find
           | examples of how to use Janet functions. Thanks a lot man!
        
             | swlkr wrote:
             | Hey! It's nice to see someone using the stack!
             | 
             | What's funny about tw is that it was kind of like a ghetto
             | tailwind jit before it was released!
             | 
             | Janet can really help you move fast
        
               | harryvederci wrote:
               | Haha, I like that description: "ghetto tailwind jit".
               | 
               | From your blog it seems like you're not really using it
               | yourself anymore, though?
               | 
               | I tried to add a styling thingy (sorry, really not
               | familiar with the terminology) to `tw` to add support for
               | "print" media queries (like this:
               | https://tailwindcss.com/docs/breakpoints#styling-for-
               | print), but didn't get it to work on the first try. If I
               | do make it work I'll create a PR :)
        
               | swlkr wrote:
               | Oh yeah, that's a bit of journey, each variant is kind of
               | annoying to handle manually.
               | 
               | I always look forward to any and all PRs!
               | 
               | Edit: Yeah I haven't used it lately, I currently use roda
               | + sequel now (ruby libraries).
               | 
               | I have limited time after work and I really want to get
               | some "SaaS apps" up and running, so the trade-off was
               | spend less time on libraries and more time on
               | applications.
        
         | saikyun wrote:
         | I'm making an editor, Freja, which is like a tiny Emacs with
         | graphical support. Makes it fun to create gui apps and games.
         | :)
         | 
         | Ultima Underworld inspired game I'm making for a game jam:
         | https://youtu.be/1fWsV83P-S8
         | 
         | Demo of pixel editor:
         | https://www.youtube.com/watch?v=KOBi805nxNc
         | 
         | Freja: https://github.com/Saikyun/freja
         | 
         | ---
         | 
         | My experience has overall been very nice. I come from Clojure,
         | and comparing to that:
         | 
         | - so nice and small! Clojure is great but has a lot of baggage
         | from JVM, for good and bad
         | 
         | - very easy to get started interoping with C. You need to
         | manually wrap libraries, but I think it's pretty easy. As a
         | benefit, you are able to throw exceptions from C that can be
         | catched from Janet. The C support is what sells me on Janet
         | over Clojure
         | 
         | - repl:ing works well, but you can get tripped up by early
         | binding and lack of namespaces. There are ways around it, but
         | when coming from Clojure it was a bit hard to wrap my head
         | around
         | 
         | - many libraries that you'd want are already wrapped, like
         | http-servers and postgresql connections. But ofc this is an
         | area that is thinner than older languages. It's decently easy
         | to wrap C-libs though
         | 
         | - easy to understand data structures if you've used JS / Lua --
         | "everything is a hashmap" (but there are also arrays and
         | strings)
        
           | spsesk117 wrote:
           | Wow! Some really cool projects, thanks for sharing, I'll
           | definitely check out Freja later this evening!
           | 
           | Thanks so much for the info and commentary!
        
             | saikyun wrote:
             | Thank you. :)
             | 
             | If you do try it out, I'd be happy for any feedback on
             | Freja! :)
             | 
             | I should mention that Windows support is currently a bit
             | behind, so if you're on Windows I could fix that then
             | comment here again when it's done. :)
        
           | diskzero wrote:
           | Freja looks really cool! Thanks for sharing it. I find these
           | types of projects very inspiring. They bring back the wonder
           | and joy that I felt when I first discovered computers in the
           | early 80s. You felt like you were in control of a whole new
           | world and anything was possible.
        
           | sesm wrote:
           | Why do you mean by 'throw exceptions from C'? C has no
           | exceptions.
        
             | swdunlop wrote:
             | That is like saying Scheme does not have exceptions, except
             | in C, we have setjmp instead of call/cc. It is technically
             | correct, but there is something more flexible that can be
             | perverted into doing the same thing.
             | 
             | https://en.wikipedia.org/wiki/Setjmp.h#Exception_handling
        
             | ahungry wrote:
             | In libjanet you can use a C call like janet_panic() that'll
             | "panic" and throw an exception/error up in the active Janet
             | runtime (so when something bad/unexpected happens in your C
             | code you are providing an API to from Janet, you'd use
             | this).
        
         | harryvederci wrote:
         | I'm using it for some side projects, combined with htmx
         | (htmx.org).
         | 
         | What I like:
         | 
         | 1. The applications start really quickly, compared to Clojure.
         | 
         | 2. It feels like I could learn everything about the language if
         | I ever want to dive into the internals. With Clojure/Babashka I
         | don't think that would be possible for me.
         | 
         | 3. A bit vague, but it really feels nice to program in this
         | language. I can easily get things to work, I can mess around in
         | a REPL if I want to, and #4:
         | 
         | 4. The community is great. Instead of searching on the
         | internet, when I don't know how to do something, I ask a
         | question on gitter / matrix and before long there's an answer
         | from a more experienced person (sometimes even from the creator
         | of the language).
         | 
         | 5. The package manager (JPM) is really easy to use.
         | 
         | 6. In terms of download size, Janet it tiny. But compared to
         | Lua, it's way more "batteries included" due to the great
         | standard library.
         | 
         | What could be better:
         | 
         | 1. Tooling I guess, but that's logical for younger languages. I
         | use Olical his "Conjure" Neovim plugin, which is great. I don't
         | think it's possible to jump to the definition of a function
         | name if my cursor is on it. Maybe that's normally done through
         | LSP in Conjure, I'm not sure. I don't know if there are plans
         | to add LSP support to Janet?
         | 
         | 2. I just found out a couple of days ago that Janet has no
         | `set` datastructure. You can work around this by using a
         | hashmap where each key maps to a value of true, or you can use
         | a library that adds the datastructure.
         | 
         | 3. Not sure if this would have downsides in Janet, but
         | something I really like about Clojure is that you can use a lot
         | of standard library functions on all data types. In Janet
         | sometimes you have to look up a function specific to a data
         | type, where Clojure would be more agnostic - with functions
         | that work on different datatypes in an expected way, and return
         | a `sequence`.
         | 
         | 4. Some library authors have the tendency to use "The Good
         | Place" references in their library names. I know the name
         | "Janet" is a reference to that series, and I know developers in
         | all languages are always trying to be funny. But finding a
         | library called "html" (by swlkr) is way more helpful than
         | finding one named after some character from a series.
         | 
         | What I think I will like, but haven't tried yet:
         | 
         | 1. Object Oriented Programming in Janet seems nice
         | (https://janet-lang.org/docs/object_oriented.html).
         | 
         | 2. PEG (Parsing Expression Grammars - https://janet-
         | lang.org/docs/peg.html )
        
       | ltbarcly3 wrote:
       | Maybe I'm just too pedantic, but this is not a functional
       | language. Yes, you can write functional style code, but you can
       | write functional style code in C, C++, Java, Python, JS, Ruby,
       | Common Lisp, Scheme, etc etc. That does not make any of these
       | languages 'functional'.
        
         | jmkr wrote:
         | I've noticed that the language inspires how people write code,
         | and the community.
         | 
         | Sure you can write functionally in Python with generators,
         | first class and higher order functions, but its not really how
         | the community writes (all the time).
         | 
         | Scheme isn't pure functional, it is mutable, but people write
         | _as if_ it is immutable.
        
         | JoelMcCracken wrote:
         | Functional doesn't really have a consistent definition, and you
         | end up always with "yeah but"s in any discussion e.g. haskell
         | isn't functional because C ffi and unsafePerformIO.
         | 
         | Point being, its very hard to say "X is or is not functional",
         | as there isn't an objective consideration.
         | 
         | (FYI, I love Haskell and use it daily and write it
         | professionally)
        
           | ltbarcly3 wrote:
           | This language has mutable strings. This is in some sense the
           | opposite of functional style.
        
             | JoelMcCracken wrote:
             | So for me the primary qualifier is "are functions first
             | class"; then "can functions be defined like data" (lambda);
             | then "does it have a rich library of functionality that
             | allows one to program functionally with it"; then "Is fp
             | style idiomatic" ; then probably "does it have a good
             | method to control mutability"; then "does it control side
             | effects"
             | 
             | There may be some other examples in there. Personally I
             | like things with controlled side effects. But it's just my
             | preferred set of trade offs.
             | 
             | Anyway I mean its just tough to be dogmatic about it. I get
             | what you're saying but why is that the dividing line?
        
         | pjmlp wrote:
         | Only for those revisionist folks that have decided Haskell is
         | the baseline for FP.
        
         | AlexCoventry wrote:
         | The main question for me is whether it has persistent data
         | structures with structural sharing. If it has that, I'm happy
         | to call it "functional." Without that it's hard to write
         | efficient pure functions.
        
         | wrycoder wrote:
         | _Is this Scheme /Common Lisp? Where are the cons cells?
         | 
         | Nope. There are no cons cells here._
        
         | dragonwriter wrote:
         | > Yes, you can write functional style code, but you can write
         | functional style code in C, C++, Java, Python, JS, Ruby, Common
         | Lisp, Scheme, etc etc. That does not make any of these
         | languages 'functional'.
         | 
         | Lisp-family languages (both CL and its immediate predecessors,
         | and Scheme) for a long time were the _textbook example_ of
         | functional languages. The relatively novel (and still niche)
         | attempt to redefine things so that only pure functional
         | languages are "functional languages", and particularly the
         | people that insist on this usage as if it were firmly
         | established and abuse those who don 't conform to their
         | preferred redefinition, is a bit annoying.
        
           | ltbarcly3 wrote:
           | This is not correct, lisp operations on lists have always
           | been to modify in place, with copying versions added later.
           | The technology did not exist to do functional programming
           | efficiently enough (and to some extent that technology still
           | does not exist generally).
        
             | bluefox wrote:
             | Simply false. For example, LISP 1.5 manual had this
             | definition for UNION:                 (union (lambda (x y)
             | (cond ((null x) y) ((member              (car x) y) (union
             | (cdr x) y)) (t (cons (car x)              (union (cdr x)
             | y))))))
             | 
             | It had a MAPLIST (today called MAPCAR):
             | maplist[x;fn]=[null[x]->NIL;
             | t->cons[fn[x];maplist[cdr[x];fn]]]
             | 
             | Or APPEND:                 append[x;y] = [null[x] -> y; T
             | -> cons[car[x]; append[cdr[x];y]]]
             | 
             | Et cetera. Sure, it also had, say, NCONC. But it had these
             | operators and style from the beginning, not surprisingly,
             | as Lisp came from lambda calculus.
        
       | [deleted]
        
       | [deleted]
        
       | ngcc_hk wrote:
       | Wonder given it is easy to be embedded, will we have an iOS janet
       | app?
        
       | jordemort wrote:
       | This is one of those languages I'd like to try because the people
       | I know of that are using it seem so dang happy.
        
         | cellularmitosis wrote:
         | Start by browsing some of the user submitted examples over at
         | https://janetdocs.com/
        
       | abhinav22 wrote:
       | Congratulations on it. I use Common Lisp myself, but always great
       | to see energy and passion in other languages, especially in the
       | Lisp family of languages (but I am clearly biased).
        
       | hatmatrix wrote:
       | Why use this over Chicken Scheme?
        
         | progre wrote:
         | I'm unqualified to answer since I haven't used Chicken Scheme,
         | but the name implies that it's a Scheme, right? Janet is a
         | "modern" lisp-like with [] and {} for arrays and maps. Also, I
         | think Chicken compiles to C? Janet compiles to bytecode.
        
         | tut-urut-utut wrote:
         | While we are at this topic: why use Chicken Scheme over this?
        
           | outworlder wrote:
           | Decent amount of libraries (eggs) for one(and a package
           | manager). Follows a language spec (R5RS).
           | 
           | Then we get to the personal preferences territory. You may
           | prefer a Scheme(with its hygienic macros and other goodies).
           | Or the way it generates C code (which is then compiled).
           | 
           | As an example. At one time I was experimenting with writing
           | iOS games in Scheme. The usual option would be cross-
           | compilation. I would cross compile my Scheme program as a
           | library and add the to project. But XCode is annoying because
           | it wants ARM code for the actual device, and X86 code for the
           | simulator. Rather than building a complicated build system, I
           | just told Chicken to stop at C code generation, then added
           | the generated code to the XCode project. XCode could now
           | compile the entire thing as if it was all C+Objective C code
           | in the first place. Add a couple of instructions for the
           | actual embedding and there's my hybrid Scheme+Objective C
           | program.
           | 
           | Related to the example above, I was missing an OpenGL ES
           | library. But I found a similar library from Gambit Scheme.
           | Given that they are both Scheme, the code would work with
           | _almost_ no changes. The only changes were related to the
           | foreign function interface (to call C), which were not
           | standardized. So I just wrote a  'compatibility' macro, and
           | the code would now run.
           | 
           | Ultimately though, it's all up to you. I'm just happy there's
           | always some healthy baseline interest in Lisp-like languages.
        
           | oshiar53-0 wrote:
           | or, maybe newLISP and vice-versa
        
             | michaelsbradley wrote:
             | Gerbil? https://cons.io/
        
         | ranit wrote:
         | A copy-paste from "Use Cases" in Janet's README.md:
         | 
         | Janet makes a good system scripting language, or a language to
         | embed in other programs. It's like Lua and Guile in that
         | regard. It has more built-in functionality and a richer core
         | language than Lua, but smaller than GNU Guile or Python.
        
           | asimjalis wrote:
           | I like using Hy for these use cases. Because it gives you
           | access to all of the Python module ecosystem while staying in
           | a Lisp-like language.
        
           | outworlder wrote:
           | Chicken Scheme also makes a good language to embed in other
           | programs. As does Gambit.
           | 
           | They are Schemes though.
        
       | threatofrain wrote:
       | Anything new happen with Janet?
       | 
       | https://news.ycombinator.com/item?id=28255116 (August 2021) [114
       | Comments]
       | 
       | https://news.ycombinator.com/item?id=23164614 (May 2020) [269
       | Comments]
        
         | diggan wrote:
         | Some interesting changes since August this year:
         | 
         | - Threaded channels `ev/thread-chan` (`thread` has been
         | deprecated [and removed in latest version [[1.18]]])
         | 
         | - JPM (Janet Package Manager) is now separate, not distributed
         | together with Janet anymore
         | 
         | - Janet binary can directly run image files with `-i`
        
           | [deleted]
        
           | db65edfc7996 wrote:
           | (Not a lisp guy).
           | 
           | What is an image and why would I want to run one? My best
           | guess is that an image would be platform independent bytecode
           | vs compiled executable?
        
             | mumblemumble wrote:
             | It's a dump of the state of the run-time environment,
             | including data. Probably the easiest use case is using it
             | as a savegame feature when you're working in the REPL.
             | 
             | It's not necessarily portable. Some lisps will use machine-
             | independent bytecode, others use native code. I'm not sure
             | which one Janet does.
        
             | cellularmitosis wrote:
             | When folks run emacs, they aren't actually starting it
             | entirely from scratch. They are booting up a similar
             | "image", which allows for much faster startup.
             | 
             | The lack of image support is what prevents Clojure from
             | competing on startup time (but see also grallvm and
             | babashka)
        
               | pjmlp wrote:
               | There are also the JIT caches on HotSpot, OpenJ9 and
               | Azul.
        
             | ianthehenry wrote:
             | I think of it as one of the defining features of Smalltalk,
             | not Lisp, although there is plenty of cross-pollination.
             | 
             | https://en.wikipedia.org/wiki/Smalltalk#Image-
             | based_persiste...
             | 
             | Janet's object system seems to be modeled after ideas first
             | popularized in the Self language -- a Smalltalk derivative
             | -- so there could be some direct inspiration there.
             | 
             | https://en.wikipedia.org/wiki/Self_(programming_language)
        
               | lispm wrote:
               | LISP I from 1960.
               | 
               | http://bitsavers.org/pdf/mit/rle_lisp/LISP_I_Programmers_
               | Man...
               | 
               | page 67: SET card
               | 
               | '...the state of the memory as it stands is read out onto
               | tape 8 as the new "base" image for the memory...'
        
               | coldtea wrote:
               | Damn, why don't we have programming environments with
               | such capabilities today? (the kind @pjmlp mentioned
               | "images, REPL with typo suggestions, OS wide debugging,
               | code browser", etc." and so on)
               | 
               | Not in the @pjmlp kind of availability ("Why you say
               | that? There's this commercial language envinronment from
               | a company in rural Austria that all of 100 companies use
               | and all of 1000 people ever heard of that gives you
               | exactly that! A 2-person department in the basement,
               | right across the toilets in Jane Street uses it for
               | something. And somebody made a weather balloon controller
               | with it. Plus some mid-90s research team had this in some
               | research language that has these features, that over 10K
               | students have installed!").
               | 
               | Not even in the Pharo, SBCL, etc. kind of availability.
               | 
               | It would nice to have it in the "competes with Java, C#,
               | Python, Javascript, PHP" or at least Go and Rust, for
               | popularity, adoption, libraries, websites and sources
               | devoted to it, job opportunities, vendor support,
               | enterprise adoption, and such" kind of availability...
        
               | pjmlp wrote:
               | Because those features cost money to develop, and plenty
               | of developers nowadays want to be paid, while refusing to
               | pay for the work of others.
               | 
               | So you get what is possible with long nights, weekends
               | and abandoned university thesis after graduation,
               | instead.
        
               | coldtea wrote:
               | > _Because those features cost money to develop, and
               | plenty of developers nowadays want to be paid, while
               | refusing to pay for the work of others._
               | 
               | Yes, but v8, Grail, the JVM, .NET takes lots of money to
               | develop as well. Even Swift (despite Apple being stingy,
               | so that is probably just a 5 person team force-fed Jolt
               | Cola) costs a lot. But companies seem to pay for those,
               | but not for those other styles/features.
               | 
               | To be frank, even if we had this technology, but it was a
               | closed source, proprietary affair, I wouldn't want it
               | anyway. That's another must-have feature in 2021 - and
               | it's not just about "not wanting to pay" (I pay for IDEA
               | subscription, for example). It's about what such a
               | license would mean for corporate adoption, ability to
               | tinker with it, reliance on a single vendor, and so on.
        
               | pjmlp wrote:
               | Lisp systems had it first, specially Lisp Machines, that
               | is where Smalltalk got its idea from.
               | 
               | Xerox PARC was pursuing three workstation based OSes in
               | parallel, based on Lisp, Smalltalk and Mesa (later
               | evolved into Cedar).
               | 
               | So the ideas regarding images, REPL with typo
               | suggestions, OS wide debugging, code browser,.... were
               | available across them all.
        
         | Igelau wrote:
         | I'd never heard of it until
         | https://news.ycombinator.com/item?id=28845971 was shared here
         | yesterday. I guess I'm not alone in just finding out about it
         | and that's why it's posted here.
        
       | michaelhoffman wrote:
       | What's the advantage of not having lists? How does this affect
       | one's programming style versus Scheme or Common Lisp (or Emacs
       | Lisp, honestly the Lisp I'm most familiar with)?
        
         | tombert wrote:
         | Disclaimer: I've never used Janet, but I am pretty familiar
         | with Clojure.
         | 
         | In Clojure, there are lists, but the most common structure for
         | sequential data is actually a vector [1], which works more-or-
         | less as a slightly modified version of the Clojure version of a
         | hashmap. Advantages of doing it this way is that you get log32
         | indexed lookup times (vs linear for lists), and you also get
         | log32 [2] append-to-the-end semantics instead of "push to the
         | beginning" that you have with lists.
         | 
         | In practice it generally doesn't affect a lot, but occasionally
         | when I do need to put an item in the front of a collection, I
         | will wish I had used a list instead of a vector, but I feel
         | like the far more-common usecase is to append to the end, since
         | in Erlang there's been a few times where I end up having to
         | reverse the list after I'm done building it.
         | 
         | [1] At least how I use it, I haven't done any statistics to
         | prove this.
         | 
         | [2] Don't let the log scare you! Log32 is very good and also
         | effectively constant time for most in-practice use cases. Log32
         | of a billion is basically six, meaning you're dealing with a
         | constant factor times six hops for inserts and lookups on _a
         | billion elements_.
        
           | mst wrote:
           | Phil Bagwell's VList data structure seems really interesting
           | as a way to avoid a bunch of the pitfalls of naive lists
           | performance-wise - the paper's good fun and there seems to be
           | an implementation in racket for anybody who wants to play
           | with it.
        
             | spicybright wrote:
             | Does any one have a copy of anything related to this?
             | 
             | Wikipedia had an article on it deleted, and I'm not getting
             | much from the first few pages of google...
        
               | mst wrote:
               | Racket implementation: https://docs.racket-
               | lang.org/functional-data-structures/VLis...
               | 
               | There's a copy I made of the original paper here:
               | http://trout.me.uk/lisp/
        
       ___________________________________________________________________
       (page generated 2021-10-13 23:00 UTC)