[HN Gopher] Janet for Mortals ___________________________________________________________________ Janet for Mortals Author : ianthehenry Score : 262 points Date : 2023-03-31 12:55 UTC (10 hours ago) (HTM) web link (janet.guide) (TXT) w3m dump (janet.guide) | billfruit wrote: | How does this compare with Carp, which is often featured here. | ianthehenry wrote: | The only thing they have in common are parentheses. Carp is a | statically typed language that compiles to native code without | a GC. Janet is a dynamically-typed language that compiles to | bytecode and runs in a virtual machine with a GC. Janet's | closest relative is probably Lua, despite appearances. | jamesgill wrote: | I'm not in the audience for Janet, but I really appreciate | efforts like this--to write about software in a creative and | interesting way. I wish there were more. | oleganza wrote: | As a wise programmer once said: "Lisps are created by those who | are lazy to write proper parsers" | | Homoiconicity does not mean your syntax should be backwards. Look | at Io language: it is basically a Lisp, but it has parens in the | familiar places. | | Same with Forth: it is a small and powerful language, but it's | good for implementing low-level stuff. You will quickly run into | desire to have normal(language(with, familiar, syntax)) for | writing non-trivial programs. | weatherlight wrote: | syntax < semantics | tmtvl wrote: | Allow me to disagree, I personally am very fond of the | regularity and structure of plain old S-expressions. They suit | the way my brain works. If I weren't as fond of them as I am I | would still be using Raku, which is the most pleasant non | S-expression based language I've ever used. | kazinator wrote: | The programmer may have been wise, but their remark doesn't | testify to that. | [deleted] | stefncb wrote: | How would you write the let macro in Io syntax? I can't think | of a good way. | | Lisp is just less familiar, not necessarily wrong. | shaicoleman wrote: | There are no code examples on the home page, so here's one: | (defn bottles [n] (match n 0 "No more | bottles" 1 "1 bottle" _ (string n " | bottles"))) (loop [i :down [99 0]] | (print (bottles i) " of beer on the wall\n" | (bottles i) " of beer\nTake one down, pass it around\n" | (bottles (- i 1)) " of beer on the wall\n\n")) | | https://rosettacode.org/wiki/99_bottles_of_beer#Janet | [deleted] | cmiles74 wrote: | I had some time a while back to work on a project of my own, I | coded up a bencode parser in Janet. It was a fun project, I | liked Janet alot. :-) | | https://github.com/cmiles74/bencode/blob/master/src/bencode.... | mdgrech23 wrote: | bottles 99 of beer on the wall? That's not the lyrics or am I | just not understanding janet? | bombastry wrote: | The prefix notation may be throwing you off or perhaps you | have mistaken the function `bottles` for the string | "bottles". | | The code `(bottles i)` in the loop is calling the function | `bottles` (defined at the top) with the argument `i`. The | value of `(bottles 99)` is `(string 99 " bottles")` which | evaluates to "99 bottles", as expected. | colonCapitalDee wrote: | You aren't understanding Janet. (bottles i) invokes the | bottles function with parameter i, so the lyric is "99 | bottles of beer on the wall". | Cyphase wrote: | I was about to comment on the "Chapter Fibe" typo, but I decided | to check the chapter contents first. So in case anyone else is | thinking about doing the same thing, it's intentional. | harryvederci wrote: | The author is super helpful in the Janet community, I'm sure this | is absolute gold. I encourage Ian to put a donate button on the | website. | | What I like about Janet is that anything seems possible with it, | and that code from others is very approachable and understandable | to me. In no other language do I ever find myself hacking on | someone else's library to add a feature that I need. In Janet, it | always seems easy. | | Some stuff I created that I wouldn't quickly find myself doing in | other languages: | | - a wrapper around my web app that runs it like a CGI script (for | ultra-cheap deploying on shared web hosts) | | - a logging function (macro) that logs the input (both the | unevaluated way it was called and what it evaluated to) + line | number of the code that called it | | - a framework for creating web apps (not public yet, but used in | production on my website) | | - (with Ian's help) a macro that I can use to create functions | that require explicitly specified parameters | sph wrote: | Thanks, I was looking forward to this, after you sent me a draft | months ago. I completely forgot about Janet as I've been very | busy lately, but this is a good opportunity to get back into it. | | -- | | See also, from the same author: https://bauble.studio/ -- | interactive 3d sandbox in Janet | | Previously discussed at: | https://news.ycombinator.com/item?id=32738654 | kelipso wrote: | Is cutesy language like this as offputting for anyone else? I | couldn't get past the second paragraph due to the overly cutesy | ridiculously simplified language. Who is the audience here? | replwoacause wrote: | Nope, I like the writing style. It's approachable and enjoyable | to me. | cfiggers wrote: | I really like the writing style. I wouldn't describe it as | "cutesy" at all, just informal. | munificent wrote: | No, I love it. | | I don't need sesquipedalian nomenclature in order to respect | the content of a written work. | vamega wrote: | I'm reading your book, and have previously read Ian's | adventures on Nix. | | I love the writing style in both of them! It may not be for | everyone, but I can appreciate works that use language to | make topics less intimidating. | | Thanks to both you and Ian for your writings. | sgentle wrote: | Fun Janet feature that I don't see in many languages: you can | pause a fiber (coroutine), serialise it, deserialise it somewhere | else and resume it again. | | A bunch of caveats to using it in practise, but it's still a | little bit magical. | thih9 wrote: | > this book contains a repl, and you can summon it whenever you'd | like by pressing the escape key on your keyboard. | | Is there an alternative shortcut for people without an esc key? | | I'm on iOS and my keyboard doesn't have one. | ianthehenry wrote: | You can click the REPL icon in the bottom left corner, but the | experience is pretty bad on mobile. | Graziano_M wrote: | I'm a fan of janet. I did 2021 Advent of Code using it. I am not | a fan of Lua, since it's ugly and too barebones (no string | split?), but I understand its ubiquity due to its small size and | ease of embedding in programs. I wish/hope for Janet to fill this | niche. | keb_ wrote: | Surprised to hear someone call Lua ugly, as I find it pretty | and simple. The barebones-ness is part of the appeal for me as | well. | catketch wrote: | Take a look at fennel. Same author as Janet, but it transpiles | to Lua. https://fennel-lang.org/ | Graziano_M wrote: | Yeah I actually opt to use fennel over Lua at every chance, | including my Neovim config. | bongobingo1 wrote: | Fennels cool. I use it a lot, but it inherits all the ugly | bits of lua still. | munificent wrote: | The writing style of this is so good I accidentally got halfway | through the first chapter despite not really needing a Lisp or | scripting language in my life. I love it. | throwaquestion5 wrote: | The site has a Janet repl (downloads pressing Esc) with | autocomplete. That's enough, now I have to give the book a spin. | | The fact the author points out, being able to distribute the | program without requirements, is a big plus. Multiple times I | have been doing some bash script that later I can't share with my | non-techy friends until I translate it in some google sheets or | something they can use. If Janet can let me do simple script | stuff and let me share it just sending the binary as a file on | some chat app, then I'm more than interested | djha-skin wrote: | My question for why Janet was answered: | | > My favorite feature of Janet, though, is something that sounds | really dumb when I say it out loud: you can actually distribute | Janet programs to other people. You can compile Janet programs | into statically-linked native binaries and give them to people | who have never even heard of Janet before. And they can run them | without having to install any gems or set up any virtual | environments or download any runtimes or anything else like that. | | The space is ripe for a lisp that is easily distributable. Yes, | common lisp can be statically compiled, but their binaries (at | least with sbcl) can get pretty big [1], even with compression. | Making a lisp specifically good at using to make CLI or desktop | tools with good c ffi support is compelling. | | 1: https://blog.djha.skin/blog/50mb-for-hello-world/ | medo-bear wrote: | 50mb for a hello world in common lisp is a bit misleading. its | 50mbs for a hello world + an entire interactive common lisp | runtime you can use to further extend the application. if you | write 2x hello world it aint gonna be 100mb lol | | on the other hand, i hear that commercial versions of common | lisp can achieve better results. but seriously, is this such an | issue for todays computers ? i have pdfs that are hundreds of | mb | zdragnar wrote: | Why would I want a 50mb hello world? | thechao wrote: | Why do you want hello world, at all? Yes, the nearly-null | program is 50MB; also, yes, a fairly nontrivial program is | ... 60MB? The core for a computer algebra system is 100MB? | | You're paying a higher initial capital cost for lower per- | unit costs. | thomascgalvin wrote: | Why would you want a hello world at all? That isn't a | realistic distribution scenario. | HelloNurse wrote: | A simple "Hello World" is a realistic test scenario, | representative of a large class of plain command line | tools and approximately reduced to pure overhead. | | If you can distribute and run a trivial hello world | program, you can expect to be able to distribute and run | something like tail or uniq, and that it will be larger | (more standard library portions linked) and slower (more | actual work executed). | [deleted] | EggsAndOil wrote: | On the contrary, 50 milli bits is quite small for Hello | World. | tpoacher wrote: | > you can actually distribute Janet programs to other people. | You can compile Janet programs into statically-linked native | binaries and give them to people who have never even heard of | Janet before | | In theory you "can" do that with python too. | | "Can" is a very different kettle of fish from "most people are | inclined to". | djha-skin wrote: | Nah, you really can't. | | Before you start screaming "cxFreeze/pyOxidizer/pyInstaller", | NO. I have gone this route. It is incredibly painful. Python | was built with the thought in mind that it would be | interpreted. It wasn't engineered well for compilation. A | _significant_ amount of effort, often a significant | percentage of the total effort, is spent shoehorning things | into this as an escape hatch because requirements have | changed. This is not the route to choose from the start. Same | goes for Clojure and `native-image`. I 'm glad the native | image project exists, and we all hail babashka as a success | story, but it doesn't mean its author didn't have to spend a | ton of time with native-image. If you go this route, prepare | to spend half your time with the build tool itself, and be | prepared for "oh the language _technically_ works with this, | but not if I use library _x_ " type disappointments right and | left. | | The best, most painless route is to go with a language which | has thought about the end result of the build pipeline | _beforehand_. Rust and Go are gold standard for this. If I | want a Python that is statically compiled, I reach for Go. | | So to hear that the language made a bunch of tiny little | design decisions up and down the line with the idea of making | static executables _from the start_ is, from this DevOps | engineer, incredibly compelling. | cjohnson318 wrote: | Go for the win. It's not too hard to pick up, it builds | fast, it runs fast, and cross-compilation is easy. | actuallyalys wrote: | Native image has been getting better, with the Graal | project recently making it much easier to get builds | working on Windows. So it's getting to be quite painless, | so that I think it's already worth it for people already | familiar with Clojure. | | But if you're looking specifically to write small tools | distributed as native binaries, Janet sounds like a much | better choice. | djha-skin wrote: | I will be most interested when this gets easier, in | particular if it works with sqlite and the unzip | libraries. Those libraries are the major snags. I could | _not_ get it running on windows (the repo in | question[1]). | | 1: https://github.com/djhaskin987/zic | _a_a_a_ wrote: | My Python isn't very good so I'm not familiar with your | cxFreeze/pyOxidizer/pyInstaller list, but couldn't you just | develop your python using one of these tools from the | start? | progre wrote: | Sure you can, but last I tried (admitedly a good long | while ago) the exe included everything _except that | fucking Visual Studio DLL_ that everything requires. | cjohnson318 wrote: | For a script with a few dependencies, pyInstaller isn't | too bad. I love Python, but it's an interpreted language | first and foremost. Distributing Python code is never | easy, no matter what you throw at it. Things that are | supposed to "just work" almost never work when you need | them to on someone else's machine. | crabbone wrote: | Bare Python is mostly useless. People use Python because | of the libraries. The kinds of projects that are | developed in Python all, save the most trivial ones, rely | on stuff that's not written in Python. | | For instance, if you do ML, then you use NumPy, Scikit- | Learn etc. It's all C / C++ code, which you will have to | link with somehow. And even if you figure out how to link | with it, your program will still suck because of the | unnecessary (as I call it) PyObject layer, i.e. the | Python interpreter interface that is used for | communicating between Python libraries. Eg. say you | wanted to pass a pointer from one library to another. If | you were writing in C -- no big deal, just have some | externally visible function in one library and call it in | another, and you are done. But if you want to connect two | Python libraries, at best, you'll have to use a special | struct PyCapsule, with two dozens or so of fields, which | is allocated by Python's allocator and also needs to be | deallocated... The overhead will be tremendous. | | Similarly, if you do Web development, you need some HTTP | server that can run fast. I haven't touched this part of | Python in a long time, but the last thing I came to use | was Tornado, which was a C library with Python bindings. | | When it comes to infra, there are plenty of tools that | are also written in C, various database drivers, Kafka | client, encryption library... and so on. | | --- | | Bottom line, even if you defeat the system and manage to | make it all compile together... it won't work well, not | as well as it could have if only you could ditch Python | entirely from this equation. And if you could, then... | well... you'd be just writing in C... | _a_a_a_ wrote: | That's a very strange post that doesn't sound like it's | coming from a professional programmer. "Do everything in | C" really misses the value of using a glue language. | Furthermore you overlook the cost of python as glue, | which can be relatively quite low under the right | circumstances. Everything is a trade-off. | vindarel wrote: | > common lisp can be statically compiled, but their binaries | (at least with sbcl) can get pretty big [1], even with | compression. | | My SBCL binaries are +-28MB, with the complete Lisp runtime and | debugger (cool, I can eval and load configuration files or | connect to a remote app) and dozens of dependencies, including | a web server. | djha-skin wrote: | I could get it down to 10 with the `:compression` option | on[1] for hello world. Perhaps this is the option you use? | The compression didn't hurt the run time much as I recall. | It's the reason why I'm still okay with common lisp for this | use case. | | 1: http://www.sbcl.org/manual/#Function-sb_002dext- | save_002dlis... | vindarel wrote: | absolutely, I use SBCL compression (following this recipe: | https://lispcookbook.github.io/cl- | cookbook/scripting.html#bu... that boils down to save-lisp- | and-die ultimately). Start-up times are still below the | 50ms for me. | freilanzer wrote: | Who cares about these sizes though? I know I don't and nobody I | know would either. 100Mb are downloaded in roughly 6 seconds | with my connection at home. | tmtvl wrote: | Exactly, and loading stuff into memory is free, everyone has | an SSD, and RAM and L1 cache are exactly as fast as each | other \s. | | But on a more serious note, I actually do care because I have | around 4,500 packages installed on my system. If all of those | were 100MB in size I'd have a problem. | Malcx wrote: | You forgot the /s right? Most of the world doesn't have that | kind of connection. | freilanzer wrote: | I don't see how this is a huge problem. You don't need to | download the executable once per minute. | eru wrote: | Yes, some of us have faster internet. (Assuming freilanzer | talked about megabits, not megabytes.) | sebstefan wrote: | I used to do that in Lua | | https://github.com/LuaDist/srlua | | The Lua runtime is 340kB on Windows and there's plenty of | projects including the one above (srlua is made by the Lua | maintainers) to produce statically linked and dynamically | linked binaries. | | But it's Lua, so while I loved the language, you have to put up | with the tiny list of standard features which can make it a | grind. | brabel wrote: | The project you linked to has been archived. Are you sure | they are still maintaining it? | | As someone who's playing with Lua to run an incredibly | lightweight HTTP server[1] which requires just a few MB on | disk and 1MB of RAM (while supporting stuff like JSON, HTTPS, | Sqlite DB, Email, MQTT and a lot more), I would be curious | what you think are the problems with Lua. | | [1] http://barracudaserver.com/ba/doc/ | ianthehenry wrote: | I think Janet is an excellent choice for making redistributable | CLI apps. Chapter 12 covers a bit of this, including the | implementation of an extremely simple fzf-powered todo list: | https://janet.guide/scripting/ | eimrine wrote: | But not if a support of Windows 7 in a CLI app is important. | dylan604 wrote: | in 2023, why would it be? we're talking creating something | new in a newish language. we're not talking about | supporting legacy code on a deprecated OS | pnathan wrote: | - a helm 3 distro is 45M | | - a terraform distro is 59M | | - a kubectl distro is 44M | | getting rust installed on a windows machine required not just a | rust distro, but a visual c++ library set over 1G. | | at a certain employer, the size of the teams golang tool was | well over 100MB. | | So - 50MB to start with a full Lisp image? yeah, sure, no | worries. | nerdponx wrote: | Plenty of Scheme implementations produce portable-ish | binaries too. | pnathan wrote: | I've never really schemed, only Lisp'd in a common sort of | way. | | I've heard that some scheme things will compile out to C | even. | leoc wrote: | I think it's fair to say that that sentence almost screams | "this is my adoption strategy". And fair enough, of course. | ianthehenry wrote: | I am not the author of the Janet programming language, just a | user who likes it enough to write a book about it. That is my | real favorite feature, not a strategy of any kind :) | psychphysic wrote: | Maybe I'm being too simplistic but this should be a | characteristic of the implementation and not the language? | | Then again I don't know much about the technical details here | (when do you or don't you need your own runtime). It seems | baffling to me with all the cruft and bloat in a modern windows | install do you still have to install so many microsoft | runtimes. | crabbone wrote: | I really struggle to think about a language that doesn't | _usually_ need a runtime. _Some_ can produce binaries that | don 't need a runtime, but usually you need to jump through | hoops to make that happen. | | We just don't notice that typical C programs need libc and | pthreads. Or that C++ programs on Windows require that cursed | Microsoft Visual C++ Runime DLL which is always missing, but | has few dozens of copies all over the system of the miserable | Microsoft slave. | | Go doesn't produce fully statically linked binaries by | default. I used to make "from scratch" Go containers and, in | general case, you need libc in them, unless you are willing | to go through pain of statically linking with it. | | Typical / practical Rust programs will also depend on libc | and pthreads (but, sure, you can do w/o). | weavie wrote: | The difficulty with a lot of dynamic languages is that it is | very difficult to determine at compile time what parts of the | runtime are not going to be invoked so you largely end up | having to include the entire platform in the executable. | JohnMakin wrote: | can't you compile C into statically linked binaries? | iansinnott wrote: | I wonder if Jank [1] could be such a Lisp? I haven't played | around with it, but I really like the idea and would love to | see it get more traction. | | [1]: https://jank-lang.org/ | miroljub wrote: | Unless jank rebrands itself as NativeClojure retaining 100% | Clojure compatibility with a few more native related goodies, | I don't see it offering more than Janet, which is also | inspired by Clojure. | | Given that they have similar goals, why not merge and join | efforts? Would help in softening the rough edges and reducing | the bus factor. | cellularmitosis wrote: | Looks like the key difference is that jank is based on | persistent data structures, while Janet embraces | mutability. | smegsicle wrote: | 'jank' is a good name then- janky immutable structures | sounds flexible and fast, while janky mutable structures | sounds like a big mucky headache | andrewflnr wrote: | Racket can supposedly compile standalone packages with the raco | compile command (IIRC). Does anyone have experience with this? | butt____hugger wrote: | They aren't standalone executables, they need to be | distributed along with the lib folder that includes the | racket runtime. | sebstefan wrote: | Surely the lib can be included statically no like Lua does | no? | nsm wrote: | Sorry, I meant to respond to this but went to the parent | https://news.ycombinator.com/item?id=35392704 | dunham wrote: | I haven't used it beyond just trying it out once or twice. | But a "hello world" application in the Idris2 language | compiles to a 17kb racket file (the default backend is chez, | but it also does racket and javascript). | | If I run `raco exe` on this, I get a 57MB file. On mac, it's | only linking system libraries. (For Idris2 programs, there is | an Idris support library that is dynamically loaded.) | | I haven't tested transporting it to another system (my test | was on an arm mac, so I don't have another system to test | that on). | nsm wrote: | Doesn't raco make followed by raco exe produce fully | standalone (except libc) executables? I believe some | platforms need an additional raco distribute step. | andrewflnr wrote: | Oh, raco exe is probably what I was thinking of. | zem wrote: | chicken scheme can do this too, for what it's worth | muyuu wrote: | chicken scheme comes to mind | | anyone around knows how does it compare to Chicken? | koito17 wrote: | The binaries are big because it's shipping a preprended lisp | kernel together with the _entire_ programming language in a | heap image. It 's also largely dependent on the Common Lisp | implementation. SBCL is very inline happy and consequently | consumes more memory than other Lisp implementations. A fresh | CCL image consumes at most 8 MB on my Mac. | | If you want small binaries, then you'd want tree-shaking, not | an entirely new language. LispWorks is already capable of | producing small, graphical hello world examples. Even then, a | hello world is a rather silly benchmark for binary size, | especially since it totally ignores the fixed cost of a | language runtime and no serious person is distributing a hello | world. | Koshkin wrote: | It's a LISP | kunley wrote: | It's alive^Wa lisp!!;) | _benj wrote: | I'm quite excited about this! | | Janet looks like a nice small, embeddable, fun language with a | lively community! | | The documentation and site felt like a close-knit community of | insiders, which I wanted to become one of them :) hopefully this | book shows the path! | [deleted] | progre wrote: | > 4. Pegular expressions | | Good one. PEGs feels like having a parsing superpower compared to | regexes. | giraffe_lady wrote: | Oh cool I love janet, I've been using it everywhere I can | recently. There definitely weren't many good resources on it last | year, though it wasn't too hard to learn despite that. | | This language also completely converted me to PEGs for entire | classes of problems, and I'm now often annoyed in other languages | that don't have them. Libraries exist, but having it built in is | so nice, and the s-exp syntax works much much better for them | than almost anything else you could come up with. | | A moderate issue I had was finding functions for what I wanted, | since the docs were set up more tutorial style, then there was | just a huge list of every function. Spent a lot of time skimming | through that guessing what I could be looking for. | | Another thing I ran into is the concurrency/fiber system still | feels like a work in progress. There are several different ways | to handle concurrency depending on how you want to combine the | abstractions, and some parts of the (otherwise excellent) | standard lib don't work well with it. It also combines nastily | with a lot of C libraries, which is rough in a language that | seems to expect you to use C bindings often. Understandable | limitation and there's probably not a good clean solution. | | Anyway this book looks great, I really hope it brings more people | into janet. It's an excellent language for a lot of applications | where people reach for the imo extremely overrated lua. | whydoineedthis wrote: | I wish Ian Henry (the author) wrote all of my technical books. He | is both whimsical, but also to the point. | | I don't think i'm the biggest fan of Janet, but I really | appreciate his writing and may just read the whole book anyways. | superb-owl wrote: | Here I was hoping for an introduction to the work of Pierre | Janet. | BillinghamJ wrote: | I thought it might be about this JANET: | https://en.wikipedia.org/wiki/JANET | mentos wrote: | Is the 'for mortals' thing a Steve Jobs-ism? | sph wrote: | Given that it is a Lisp, it should be "for mortals seeking | divine beauty and purity". | ianthehenry wrote: | The Janet language is named after a fictional immortal being | from the television show The Good Place, who exists to help | mortals in the afterlife -- that was the inspiration for the | title. | cnasc wrote: | I think a reference to Q For Mortals https://code.kx.com/q4m3/ | eimrine wrote: | Any sufficiently complicated C or Fortran program contains an ad | hoc, informally-specified, bug-ridden, slow implementation of | half of Common Lisp [1] . Maybe Janet is a human version of C, | and that half of Lisp which is implemented here is the part of | Lisp which is relatively easy to learn. | | [1] Greenspoon's tenth rule | Uehreka wrote: | So the word LISP does not appear in the entire introduction. If | you're introducing a language thats a LISP, that's really the | kind of thing you've got to state up front. | | You can define the term for those unfamiliar, and you don't have | to dwell on it, but people who are turned off by LISPs will feel | a little swindled if they get 3 book-pages in before finding out. | And people who specifically like LISPs might pass this over | without realizing what it is and miss out. | wodenokoto wrote: | Chapter 1 deals with your frustration: | | > And now you're just wondering when I'm going to use the | L-word. You want me to use it so you can go write a long screed | about how Janet isn't a real one. But I'm not going to give you | the satisfaction. I'm not going to use that word until Chapter | Fourteen. | philsnow wrote: | also | | > Note that Janet's `nil` is not the empty list. If you don't | understand why I'm calling that out here, you can safely | ignore this paragraph. | | beautiful, succinct, and not a jab at lisp-y languages | weatherlight wrote: | this guy is a hero, i love it. | fallat wrote: | I really argue the opposite: it's really something you dont. A | ton of people see LISP and get scared away. | tgv wrote: | The first (defun will take care of it if you don't. If they | stay, and can stomach ))))), I doubt they'd be scared off by | mentioning LISP. Hell, you can even mention it after the | first examples. | giraffe_lady wrote: | If you call it a lisp you summon the lisp lawyer demons who | will litigate your namespace & symbol semantics and start a big | beef among themselves about what a lisp is and what makes lisp | lisp and how much this is lisp and whether lisp even exists | it's just a whole huge headache. | | It uses parens and prefix notation. Not every language that | uses parens and prefix notation is a lisp, I guess, maybe, I | don't care. But not wanting to have that argument is an | excellent reason to never make this assertion about a language | imo. | YuukiRey wrote: | So someone might be 3 pages in and really like what they're | seeing but upon hearing the word LISP they turn around and | decide they suddenly dislike it? | | Considering that people can't even really decide on what | constitutes LISP (Is Clojure a LISP?) I don't think there's any | merit in this kind of resource to mention a term that's more | likely to give people a false impression of what this really is | or isn't. | superdisk wrote: | He pokes fun at this type of comment in chapter 1. | cpufry wrote: | this is neat and all, idk why i feel so exhausted every time i | see a new language these days | nerdponx wrote: | If you're anything like me, it's because you're getting older | and have increasingly limited free time and energy that you can | no longer dedicate to learning new programming languages. | weatherlight wrote: | Because learning new things is hard and hard things tire us | out. we should endeavor to learn new things everyday. | smegsicle wrote: | some people have reported aspirin providing relief from long | covid | replwoacause wrote: | huh? | afry1 wrote: | It's the "sadness of mortal men" as Tolkien put it. So many | awesome languages in this world, so little time to learn and | use them. | nerdponx wrote: | One obvious point I'm missing here, and that I've been missing | from Janet discussion in general: why Janet and not Scheme? | | Gauche for example implements the latest (and IMO greatest) R7RS, | its standard library is huge and "batteries-included" including a | wide array of RFCs to the point of rivaling Python, and has a | package manager in the form of Akku. Chicken has a similar story. | Racket is arguably more useful "out of the box", but its | community seems so heavily focused on using it for PL research | that it's harder to justify using it for day-to-day programming. | And there's Clojure as well, which I know comparatively less | about, but is well-loved by its users. | | Heck, even Common Lisp has a lot going for it, but the Standard | and the conventional Lisp dev tools are kind of chaotic and | idiosyncratic enough that it's understandable if people don't | want to use it. | | To be clear, Janet seems like a great little language. But as | someone with limited time and energy who is interested in using | it, I want to know why I should spend the time learning it, | compared to Scheme | dri_ft wrote: | Scheme feels really verbose to me. I get that it's 'minimal' | and 'elegant' and everything, but then why are all the | identifiers so long? I feel like I have to do a lot of typing | to get anything done. Maybe it's better if you're using emacs | and have good lispy autocomplete, I don't know. But broadly, it | makes me feel like the people who developed scheme were working | from a very specific definition of 'elegant', and it doesn't | align with mine. Janet feels better for that. | ianthehenry wrote: | I don't think Janet and Scheme have very much in common. If | you're looking for a huge, batteries-included language, you | will not have a good time with Janet :) | | Janet is much closer to Lua, in scope and applications, than it | is to any Scheme or Common Lisp or Clojure implementations. | pull_my_finger wrote: | Janet has a lot in common with Lua: tables, coroutines, easy | embedding, lots of API similarities. Compared to a language | like Lua, Janet is _bursting_ with "batteries". Almost to a | Ruby level where whenever you think to do something, you | check the docs and find yourself saying "of course there's a | function for that". I have to disagree completely with your | assessment. | headhasthoughts wrote: | r5rs is significantly smaller than Janet. | Koshkin wrote: | This was the last good Scheme. | medo-bear wrote: | it seems to me that gebril scheme fits janet's use cases | | https://cons.io/ | imwithstoopid wrote: | Janet users are not encumbered with the historical cruft of | scheme like hiding libraries behind unmenorable srfi numbers, | or the ancient an un-portable oop implementations etc etc | agumonkey wrote: | This should be studied a bit. At what point a partial reboot | benefits the community/language before. | giraffe_lady wrote: | Janet has close integration with C going both ways. It has | built in C ffi and you can easily build and distribute a janet | binary that uses C libraries. | | It's also easily embeddable in C programs the same way lua is, | making it possible to use it as a config, extension, or | scripting language in a larger program. | | Aside from that having used it a fair bit I think it's got a | very "practical" orientation. It provides immutable structures, | but doesn't enforce immutability semantics the way clojure | does. It has a good concurrency system but is cleanly single- | threaded and performant by default. And imo the standard lib is | a really good balance, neither forcing you to build EVERYTHING | yourself (lua) or having the whole last 50 years of CS research | in it (racket). | crabbone wrote: | > is cleanly single-threaded | | And here I immediately lost my interest. Anything that cannot | do real concurrency is a toy in my book. There's no excuse | for a language developed for practical computers in 21'st | century to not be able to utilize concurrency which is | practically built into every existing computer. | tmtvl wrote: | Then it's a good thing those words were preceded by: | | > _It has a good concurrency system_ | giraffe_lady wrote: | Maybe you should reread that sentence bc I don't think it | says what you think it says. | galaxyLogic wrote: | This would seem like a good tool for creating small binaries | which are meant to be combined by shell-pipelines later (?) ___________________________________________________________________ (page generated 2023-03-31 23:00 UTC)