[HN Gopher] Janet for Mortals (2023)
___________________________________________________________________
Janet for Mortals (2023)
Author : magnio
Score : 215 points
Date : 2024-11-27 05:34 UTC (17 hours ago)
(HTM) web link (ianthehenry.com)
(TXT) w3m dump (ianthehenry.com)
| incanus77 wrote:
| I enjoyed this book's practical take. It's a big part of why I am
| currently learning Janet by doing Everybody Codes in it right
| now.
|
| https://everybody.codes
| gen_greyface wrote:
| > ... has a built-in repl. At any point you can press escape and
| pull it up, and it's docked to the bottom of the page...
|
| probably not a good decision to use `Esc` since browsers have
| default bindings for it. firefox exits fullscreen on `Esc`
| threatofrain wrote:
| The book. https://janet.guide/
|
| The language. https://janet-lang.org/
| MichaelGlass wrote:
| I really like the slightly silly writing style! Reminds me of a
| toned-down Douglas Adams. Honestly, I'm not particularly
| interested in Janet but the style sucked me in.
| ulbu wrote:
| "We'll start with some numbers" I was expecting he'll start by
| proclaiming it's that language that uses floats for integers.
| 2pEXgD0fZ5cF wrote:
| Janet looks really interesting. Especially with how easy to embed
| it is.
|
| If I understand it correctly creating DSLs in it should also be
| very easy with its macro and PEG feature?
| petee wrote:
| I'm pretty new to it, but from what I've seen the answer is
| yes. And while I haven't wrote any macros yet I think PEGs are
| fantastic, and sooo readable. Their website has an example PEG
| to read Janet source - https://janet-
| lang.org/docs/syntax.html#Grammar
|
| Embedding is really easy, as is writing c modules. You can link
| shared, or use an amalgamated c file. Check out https://janet-
| lang.org/capi/embedding.html
|
| Honestly I'm having just as much fun learning Janet as I am
| writing C modules and embeddings; Janet all the things!
| afranchuk wrote:
| Writing DSLs is very easy, and fun! The PEG grammars are very
| elegant to build up. I wrote a language for programmatic
| recipes (think scaling, unit conversion, etc) with it and it
| was a delight. I'd provide an example but I haven't taken the
| time to write a README so I haven't published it publicly yet.
| 2pEXgD0fZ5cF wrote:
| Hey that's cool. Are you willing to instead share an example
| snippet of what the DSL itself looks like?
| afranchuk wrote:
| Here's an excerpt (which is in a map passed to peg/compile)
| for numeric parsing: :nonzero-int (*
| (range "19") (any (range "09"))) :int (+ "0"
| :nonzero-int) :decimal (cmt (* (? (<- :int)) "."
| (<- (some (range "09")))) ,parse-decimal) :fraction
| (cmt (\* (? (\* (number :nonzero-int) :s+)) (number
| :nonzero-int) "/" (number :nonzero-int)) ,parse-
| fraction) :integer (cmt (number :nonzero-int)
| ,parse-integer) :num (+ :decimal :fraction
| :integer)
| giraffe_lady wrote:
| It's an incredible lua replacement for embedding. A lot of the
| time for an embedded scripting language you're defining a DSL
| which bare lua is fairly poorly suited to. And you lose the
| tininess and simplicity of the embedding if you're having to
| cram PCRE and shit in there too.
|
| Janet basically just copies lua's C interop because it's the
| best part of lua. And then with PEGs and a solid macro system
| you're in a much better position for scripting, or defining a
| scripting environment, or a configuration DSL, or whatever you
| wanted a non-C language for.
| riggsdk wrote:
| The title made me believe it was just another AI assistant
| (thinking Janet from "The Good Place" - but for us non-dead
| people instead. Was pleasantly surprised to see it is a
| programming language and that the title was just a clever joke on
| that: The Janet language is named after an
| immortal being in The Good Place who helps mortals navigate the
| afterlife, hence the title.
|
| It kinda surprised me that they ship the language with a PEG
| (parsing expression grammer) instead of a basic Regex engine.
| This has been my wish for any programming language that ships a
| Regex library by default to also include a capable PEG.
| tmtvl wrote:
| GNU Guile also has a PEG library in its standard library (see
| <https://www.gnu.org/software/guile/manual/html_node/PEG-
| Pars...>).
| petee wrote:
| Janet's 'spork' module is kinda like their libc, and has a
| regex submodule; it's very likely to be installed.
|
| Janet is my first exposure to PEGs, so nothing to compare
| against but I love how powerful and easy they are. I have a
| better grasp of them in only a few months than dabbling over
| 20yrs with regex.
|
| Also there is quite a bit of The Good Place callbacks within
| the Janet community; numerous 3rd party modules are named after
| characters, for example.
| philsnow wrote:
| I had also not seen PEGs before, but the way you can use
| parsing node identifiers recursively (and mutually
| recursively) seems very intuitive.
| tessierashpool wrote:
| Elm does something similr. Neither elm/regex nor elm/parser are
| built-in, but elm/regex encourages you to use elm/parser
| instead.
|
| btw, I like the namesake, but a language named Janet is pretty
| much obligated to also prioritize control.
| purerandomness wrote:
| Absolutely love the writing style, which was the reason I got
| sucked into functional programming and the Janet language deeper
| than I'd had previously wanted to.
|
| Thank you!
| Tomte wrote:
| > Okay great. I think that's a totally reasonable second code
| sample ever for you to look at.
|
| I like it.
| prokopton wrote:
| I'm holding out for the one written for immortals.
| petee wrote:
| Meanwhile I'm waiting on "Janet for Normies" for myself
| sourcepluck wrote:
| Ooooh, is this the start of a series - who's going to do
| those two, and then "Janet for Aliens", "Janet for the Rest
| of Us", "Janet for Dummies", and so on. The titles write
| themselves!
| rfrey wrote:
| Preorder now, delivery in 10,000 years.
| numeromancer wrote:
| I am not waiting for Janet for Ethereals. Once it ships, it
| will always have been available.
| katspaugh wrote:
| Love the book! It's fun and inspiring to write programs
| recreationally!
| petee wrote:
| This book got me started with Janet a few months ago, and I
| really think it helped me get past the difficulty I've had in the
| past starting with Lisp-y languages (Janet is Lisp like only in
| appearance afaik) but this just clicked. I'm having a lot of fun
| writing Janet and refer back to the book often.
|
| I do think the macro example that is early in the book is a
| _little_ overwhelming; if you can get past that everything is far
| easier. Whats great is that you can leave the author a comment
| right from the repl, so I did :)
| sourcepluck wrote:
| Not to mention https://bauble.studio/ from the same author!
|
| It doesn't work in my browser - which is understandable because
| my computer is ancient - but sometimes when I want a break from
| study in the library I'll spend thirty minutes on a library
| computer playing in bauble there. I might get around to trying to
| figure out how the thing works, but the graphics you can make
| just fiddling with numbers is wild.
|
| Long life to Janet.
| zellyn wrote:
| For me, on a 2021 MacBook Pro M1 Max, on MacOs 15.1.1, it
| appears to work in Chrome but in Firefox shows this error.
| error: script:16:1: compile error: unknown symbol twist
| in evaluate [lib/evaluator.janet] on line 81, column 7
| in bauble-evaluator/evaluate [lib/init.janet] on line 8, column
| 12
| ianthehenry wrote:
| delete the contents of the script and then refresh -- you've
| loaded an old version of bauble before and have the old
| tutorial cached in localStorage :/
| subjectsigma wrote:
| I couldn't get into Janet, I'm not sure if this is a personal
| failing on my part. The only other Lisp I've spent any
| significant time in is Emacs Lisp, and everything in Janet seemed
| similar enough to that but just subtly different that I was
| always making silly mistakes. The PEG features were really
| compelling on paper but I found the syntax unwieldy and
| confusing. The documentation was complete in that it had
| descriptions of all the functions, but spartan in that it lacked
| examples or other helpful usage information. There didn't seem to
| be any basic batteries included such as JSON parsing; if I want
| to write a quick script in a language and I have to first write a
| JSON or XML parser, task is already failed.
|
| This was like four years ago, so maybe the ecosystem is better
| now. Or maybe scripting was the wrong ruler to measure Janet by.
| I don't know but this post is making me want to reinstall it.
| petee wrote:
| They put things like JSON and regex in the 'spork' module,
| which is kinda like libc; theres a strong internal drive to
| keep the core light. Many projects depend on spork, so it its
| likely to be installed on early.
|
| The docs are decent, though I agree there are still gaps in
| practical examples, this has been supplemented by
| https://janetdocs.com, which are linked as "community examples"
| per function
| jodrellblank wrote:
| > " _the turtles are metaphors_ "
|
| :( The turtles were real, not metaphorical:
| http://classicacorn.computinghistory.org.uk/8bit_focus/logo/...
|
| (it fits the definition of metaphor 'One thing conceived as
| representing another; a symbol' but it has the feel of people
| saying "my niece thought the floppy disk save icon is a
| refrigerator because that's where you save leftover food" not
| realising that it was a real piece of fun/cute hardware many
| moons ago).
| WJW wrote:
| I don't think that what's displayed on that page is a "real"
| turtle...
| nkrisc wrote:
| It is a real "turtle", however.
| mannykannot wrote:
| Ha! You never know when you are going to run into a point-
| of-view that would be on the fast track to 'closed as off-
| topic' if anyone asked a question about it on the
| philosophy stack exchange.
| nickpeterson wrote:
| The style and tone of this book (website) is quite funny, I
| really enjoy it.
| debo_ wrote:
| It's neat to compare Janet to GNU Guile. Guile's original pitch
| is that it's intended to be easily used side-by-side with C.
| However, because it's an older language, it hasn't (to my
| knowledge) picked up newer sensibilities like having a package
| manager shipped with the language toolchain.
|
| One thing I like about Guile is how much effort they've put into
| describing compatibility with the RNRS standards. Not sure how
| Schemey Janet actually is, but I'm curious to find out.
| packetlost wrote:
| Janet it not Scheme-like at all. It's more like if someone made
| Clojure on top of Lua.
| giraffe_lady wrote:
| Which is really funny because that's basically exactly what
| fennel is, which was made by the same guy. I don't think he's
| written about it but fennel compiles to lua while janet is
| its own thing.
| packetlost wrote:
| Correct. Syntactically it's more similar to Clojure while
| the runtime is, to my understanding, heavily inspired by
| the non-JIT versions of Lua.
|
| As a language, it's fine. I found the documentation pretty
| good and the language makes some very sensible decisions
| but I can't bring myself to use it for anything serious.
| The lack tooling makes it challenging.
| giraffe_lady wrote:
| I have used janet for embedding into another program as
| an alternative to lua and it was great for that case. Lua
| doesn't have good tooling either, and I didn't have
| anything to gain from a tiny runtime and I wanted more
| powerful tools for making a DSL in there. It worked out
| perfectly, I'd do it again.
| packetlost wrote:
| Yeah, I'm not saying there aren't usecases that it would
| excel at (sounds like you found one!), I just haven't
| really had a problem that I thought it would yet. I've
| come really close though
| actuallyalys wrote:
| I personally like Fennel a lot, but it's not at the point
| where I would build something large on top of it. The
| language itself is solid, but like you said, there's not
| a lot of tooling.
| sourcepluck wrote:
| This is funny, cos I saw this stated somewhere on HN the
| other day, was totally amazed he'd done both, went and
| checked, and found out it was untrue - I think! Someone
| correct me please if I'm confused.
|
| Calvin Rose made Janet https://github.com/bakpakin and
| https://bakpakin.com/
|
| Phil Hagelberg made Fennel
| https://git.sr.ht/~technomancy/fennel and
| https://technomancy.us/colophon
| ianthehenry wrote:
| It's complicated; Calvin Rose was the original creator of
| Fennel ("fnl"), but I understand it was just a little
| side project that he made over the course of a week or so
| in college. Phil Hagelberg found the project years later
| and thought it was cool, took over as its maintainer, and
| basically turned it into the Fennel you know today. So
| it's like, kind of, I dunno, both things are kinda true.
| sourcepluck wrote:
| That's even more funny in the end, I thought GP was
| referring to Phil Hagelberg as creator of both, but they
| were referring to Calvin Rose as creator of both. Oops.
| Mystery solved.
|
| Anyway - Fennel and Janet look very interesting, and a
| large thank you to everyone involved!
| debo_ wrote:
| This is very cool:
|
| > this book contains a repl, and you can summon it whenever you'd
| like by pressing the escape key on your keyboard. The book will
| then start downloading like a megabyte of JavaScript and
| WebAssembly, and once it's done you will be able to try out Janet
| right here in the comfort of your browser. No need to install
| anything; no need to leave the comfort of this book website if
| you'd like to test something out.
|
| > The repl is not just a repl, though. It is also a portal into
| conversation with me, the author. You can use the repl to report
| typos or factual errors, ask questions, or express confusion. I
| won't be able to respond in the repl, but if you include some
| kind of contact information in your reports I will make an effort
| to follow up with you.
| behnamoh wrote:
| I've read the book and I found it very fascinating and kind of
| playful, which actually makes learning the Janet program language
| much more fun. However, I found the documentation of the language
| lacking in many ways. Oftentimes there are functions or commands
| that are just there, but there's no example or explanation. or
| explanation as to what they do. In fact, there are a lot of those
| that I found in the book, but I couldn't find in the
| documentation. So this is one of the reasons I stopped learning
| Janet, even though I really like the idea of this language, and
| the fact that it has many sane defaults and similarities to
| mainstream languages instead of like adhering to archaic Lisp
| conventions. At the end of the day, it's not actually a LISP
| because it's not cons lists. And it is fine by me, but again, I
| found the language not fully documented.
| alectroem wrote:
| Do you remember any of the functions/commands that were not
| documented? I'm semi active in the Janet community and would be
| able to work on improving the docs where its lacking!
| Lyngbakr wrote:
| I had exactly the same experience (minus reading the book).
| Often, I'd just see the function signature and no further
| explanation. I do realise that it takes a lot of time and
| effort to build up extensive docs, but it happened enough that
| I put it down and started looking for another Lisp that
| compiles down to a binary.
| behnamoh wrote:
| I'm curious, which Lisp did you end up choosing?
| Lyngbakr wrote:
| I'm still looking around, but Owl is a frontrunner.
| cess11 wrote:
| If the bigger runtime isn't a deal breaker, maybe look at
| Racket.
| behnamoh wrote:
| Racket has great documentation but unfortunately even its
| creatures have moved in to Rhombus which is a non lisp.
| jerrygenser wrote:
| Off topic - a separate blog post by TFA got me into split
| mechanical keyboards. It helped me after years of shoulder and
| wrist pain. Highly recommend exploring other posts by Ian.
| bmitc wrote:
| This is a very "Internet" comment, but what struck me about the
| title and very many other titles in the software engineering
| world is that I'm not sure it's the best idea to belittle readers
| in the title. The implication of "<x> for normal people, mortals,
| dummies, etc." titles is that the reader is not on the level of
| the author of the book and the authors of the tool or topic that
| one is learning about. Specifically, "for mortals" implies the
| author and programming language author are immortals, or at least
| not mortal. I realize this is taking the title more seriously
| than probably intended, but this type of framing pops up a lot in
| the software and programming world.
| ianthehenry wrote:
| hi, i am the author of this book and i agree with you. it's not
| a good connotation. i chose it because: 1. it is kinda
| memorable (look there are so many programming books with
| exactly the same name) 2. the language is named after an
| immortal being who guides mortals through the afterlife in the
| fictional property _the good place_ , so there's some kinda
| connection. but i agree the implication that janet is somehow
| "hard" to learn or that the author is somehow "on a higher
| plane" is bad. i waffled on this a lot but never came up with
| another title i could stand and ultimately just pulled the
| trigger. (but note that i left myself some wiggle room with a
| neutral domain name.) i hope the tone of the book itself helps
| to counteract the title, but ya know who knows
| bmitc wrote:
| This isn't really a specific complaint about this book. Just
| triggered my thoughts on a general theme. Thanks for writing
| the book. I might look into it, as I'm generally interested
| in Lisp/Scheme-likes.
| julianeon wrote:
| I could see this is if the title was "for morons" (or something
| like it), something implying a class division. But 100% of
| humans are mortal. Everyone is mortal, including the author. So
| there's no real division here, no two tiered system: we are all
| on the mortal tier.
| johnfn wrote:
| I think a more charitable interpretation of the title is an
| implication that the other material written for Janet was
| written for supergeniuses (or whatever), so here's a book
| finally written for normal people.
___________________________________________________________________
(page generated 2024-11-27 23:00 UTC)