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