[HN Gopher] Janet: a lightweight, expressive and modern Lisp ___________________________________________________________________ Janet: a lightweight, expressive and modern Lisp Author : galfarragem Score : 367 points Date : 2020-05-13 08:02 UTC (14 hours ago) (HTM) web link (janet-lang.org) (TXT) w3m dump (janet-lang.org) | w0utert wrote: | Lisp languages should be great for embedding into games to | implement game logic, instead of more straightforward solutions | such as embedding Lua. I've always wanted to explore this for my | iOS side-project game, which now uses an event-based system | inspired by ReactiveX, implemented in Lua. This works pretty well | but is very hard to debug. | | The main thing holding me back to try to replace it with | something Lisp-like is that I have zero experience in Lisp | programming. I know some FP theory (in fact the Lua-based event | system lends some concepts from it), but when I try to reason | about common subproblems I really have no idea how to map them to | something like Lisp. For example how to efficiently implement a | message bus with observers that can register themselves, using | state-based functions to execute when certain events are | received, scheduling events, async/await to suspend processing | until some event is received, etc. | | Does anyone have pointers to books or websites to learn 'real- | world' LISP programming? In other words not yet another | introduction that shows the same old forced examples that just | show you how to evaluate an expression or use higher-order | functions to solve artificial toy problems, but resources that | teach you how to be productive in a Lisp language? | phoe-krk wrote: | > but when I try to reason about common subproblems I really | have no idea how to map them to something like Lisp. For | example how to efficiently implement a message bus with | observers that can register for certain events. | | I think that's a badly posed question. The main benefits of | using Lisp are its introspection and interactivity. You can use | the REPL to inspect your message bus at runtime, you can modify | parts of it as it runs, you can interactively debug errors as | they happen, but none of that is directly related to "how to | _implement_ a message bus ". | | I think that is more of an ADS question that it is a Lisp | question; an efficient message bus, no matter whether you | implement it in Lisp or in C or in Haskell, needs some | synchronization primitives from the programming language core | that are likely backed by OS primitives, as well as some data | structures that need to be cleverly designed to be fast. | Neither of these is language-specific - only means of | implementing and using those might be language-specific. | | In other words: Lisp makes it possible to be more productive by | means of dramatically reducing the time of feedback loop and by | means of providing in-depth language introspection, but it | doesn't solve the problem of actually needing to figure out how | to design programs and data structures. That's why e.g. SICP is | not a Scheme tutorial, despite using Scheme throughout the | whole book. | anonymoushn wrote: | If he's currently using a message bus in Lua, it's likely | everything is happening in a single-threaded interpreter. | pjc50 wrote: | This is a very classic Lisp answer in that "productivity" is | considered in the pure abstract, and that the specific | question of how to do a specific thing - the actual | productive result - is uninteresting. Who would expect the | classic book on Scheme to teach you how to write Scheme | programs? | phoe-krk wrote: | SICP isn't a book on Scheme. It is not a Scheme tutorial; | it uses Scheme to teach programming. One can learn Scheme | by following the book and inferring everything that is done | in there, but the topic of the book isn't teaching Scheme, | it's teaching programming. | phoe-krk wrote: | Regarding productivity, I don't consider it abstract. I | feel a concrete efficiency boost from the two things I | mentioned, which are interactive and incremental | development with a very short feedback loop (no time wasted | while waiting for the toolchain to do its work) and the | ability to introspect and debug the live system (since I do | not need to bother with external debugger and tooling). | | What exactly do you mean by "uninteresting"? | pjc50 wrote: | The original post complains of not knowing how to solve | their particular problem in Lisp, and gives an example: | | > how to efficiently implement a message bus with | observers | | You say: | | > I think that's a badly posed question | | But it isn't! It's the specific thing that person is | trying to do and is having trouble with, the act of | translating structures and designs they understand from | other languages into the Lisp language. | | This is the barrier to Lisp adoption. You can cite | iterative development and live debugging all you want, | but they only benefit after you've actually written a | program, which is the barrier the potential users are | struggling at. | phoe-krk wrote: | > but they only benefit after you've actually written a | program, which is the barrier the potential users are | struggling at | | No, you miss the point. There is little benefit in | interactive and incremental development once a program is | written. The very benefit that this such incrementality | provides is noticeable during the _process_ of writing | the program, not after it; when a program is written, it | 's written, and from some point it doesn't really matter | if you've done it by mutating an image-based programming | language or by linking together compiled C objects. | pjc50 wrote: | Programs are never finished. Most work is incremental | modification and debugging of existing systems. The | "getting started" bit of going from a blank editor to | something that starts to be useful is a small part of the | process. But it's the very beginning that is a | surprisingly hard barrier to cross. The starting to write | a program in the first place. Which is where the OP has | got stuck. And is dismissed as irrelevant? | w0utert wrote: | Maybe I phrased that incorrectly indeed. It's not so much | that I want to find a 'better way to implement a message | bus', but more 'if I want to re-implement the message bus I | already have, how can I use the features of a Lisp-like | languate to improve the implementation'. | | For the logic in my iOS game I started out with a | straighforward imperative system based on objects and | explicit state, which quickly devolved in a big mess of if- | then-else-but-only-if spaghetti code that was impossible to | maintain. I refactored that to a reactive system based on | what I call an 'event graph' where each node performs some | kind of filtering or processing. For example nodes like | 'filter on event type', 'take first 4 events', 'complete when | event X received', etc. Game logic is implemented by | branching off (subscribing) to nodes, synchronizing stuff by | means of attaching a temporary subgraph that waits for a | 'completion event' etc. Like I said it's quite similar to | ReactiveX but simpler. | | The basic concepts behind this are sound, but my feeling is | that I need way too much code in to implement something like | this in Lua, compared to what I would expect in something | like Lisp, which seems more naturally suited for this kind of | task. I just find it hard to get started trying to map the | solution I already have to a Lisp language, because most of | the 'introduction to Lisp'-like resources are so focused on | artificial examples that are mostly interesting from a | computation-theoretic point of view. | widdershins wrote: | In terms of the basic tools available to you, Lisp and Lua | are remarkably similar. In both you will rely heavily on | closures to get the job you mentioned done. Lua offers the | table as its primary data structure, though this can also | be used as an array. Lisp offers the list, though this can | also be used as a table (associative container, whatever). | | Where Lisp and Lua differ is that Lisps are infinitely more | malleable as languages. You can more-or-less invent new | syntax to assist in your problem domain. For example, if | you find that constructing your 'event nodes' requires | boilerplate in Lua, you can write Lisp macros that make | things clear again. Or you might write a little macro DSL | to make constructing your graphs easier. | | I enjoy Lua, but I constantly pine for the flexibility of a | Lisp when Lua's clunky syntax annoys me. I find Fennel is a | good compromise between the two - especially if you already | have Lua code that you want to port over. | junke wrote: | For your particular example, it seems you could use a | dataflow approach, like the one in Cells (K. Tilton) | | (see tutorial: http://stefano.dissegna.me/cells- | tutorial.html, and documentation: https://gitlab.common- | lisp.net/cells/cells/-/tree/master/doc) | (ql:quickload :cells) (defpackage :robot (:use :cl | :cells)) (in-package :robot) | | Define a robot model (class) where command in an input, and | velocity is defined by an update rule: | (defmodel robot () ((command :accessor command | :initform (c-in nil)) (velocity :initform (c? | (case (command self) | (:left -10) (:right 10) | (t 0)))))) | | Whenever command is modified, velocity is updated | accordingly. You can add observers for slot changes: | (defun log-change (what from to) (print `(:change | ,what :from ,from :to ,to) *debug-io*)) | (defobserver velocity ((model robot) new old boundp) | (when boundp (log-change `(velocity ,model) old | new))) | | Then, if you instanciate the model, and mutate the command | slot: (let ((w (make-instance 'robot))) | (setf (command w) :right) (setf (command w) | :left) (setf (command w) nil)) | | The following is logged: (:CHANGE | (VELOCITY #<ROBOT {1015D66783}>) :FROM 0 :TO 10) | (:CHANGE (VELOCITY #<ROBOT {1015D66783}>) :FROM 10 :TO -10) | (:CHANGE (VELOCITY #<ROBOT {1015D66783}>) :FROM -10 :TO 0) | | Anyway, the book Common Lisp Recipes (E. Weitz) is good for | solving actual, pratical problems with Lisp. | jonathanstrange wrote: | The real power of Lisp becomes apparent when you develop | programs top-down with very general data structures with their | own accessors and a liberal use of higher-order functions. | | I still think that Winston & Horn's classic _Lisp_ (3rd ed.) | conveys these ideas very well. SICP is also very good at it, | but it 's based on Scheme. | sahil-kang wrote: | If you're interested in Common Lisp, Practical Common Lisp is a | good overview of the language [1]. Since you've done game | programming, here's a simple snake game I wrote a while back; | you might find it useful to peruse the code [2]. You can find a | couple of bigger libraries I wrote on my github if you're | interested in seeing more substantial code. | | [1] http://www.gigamonkeys.com/book/ | | [2] https://github.com/SahilKang/cl-snake | johannesgoslar wrote: | There is Nu which runs on top of the Objective-C runtime: | https://programming-nu.github.io/ Relative easy to read code | and has actually been used with some iOS games. | mlatu wrote: | I liked the book Practical Common Lisp (PCL) very much, you can | read it online for free on the authors website: | http://www.gigamonkeys.com/book/ | | I suggest using portacle (a preconfigured emacs) as development | environment during that course as this is the easiest way to | get cracking in CL imho. | | Although Janet's core library is different from CL, I think | once you grok LISP, it's not hard to switch to another dialect: | After working through ~half of PCL I abandoned it in favour of | a learning-by-doing approach in ClojureCLR as I work mostly in | .NET or Mono atm. | w0utert wrote: | Great, I will check it out! | thosakwe wrote: | Learn GNU Guile, it's a dialect of Scheme. AFAIK, Scheme is | specifically intended for use in teaching programming. I spent | a late night reading the manual and hacking out some toy | programs, and the rest is history. | | TLDR: Guile is very easy to learn | pjc50 wrote: | 1) How is this different from other Lisps or Schemes? | | 2) When promoting a new programming language, _always_ provide a | nontrivial example. Couple of pages of code. Mandelbrot | generator, desk calculator, notekeeping app, that sort of thing. | augustk wrote: | And the motivation for designing the new language. What | problems does it solve better than existing languages? How does | it promote the creation of maintainable programs? Etc, etc. | phonebucket wrote: | > What problems does it solve better than existing languages? | How does it promote the creation of maintainable programs? | | I broadly agree that widespread adoption probably requires | answering some sort question like these. | | But sometimes people create languages just because they are | fun to create, and they think other people might enjoy using | them. | pjmlp wrote: | Just taking into consideration that most engineering | degrees have of some of compilers design course, there are | thousands of programming languages born every year across | the globe. | | So it needs more than just _" grammar + semantics + basic | library"_ to actually be relevant. | | However that is how many nowadays mainstream languages have | started, so luck also plays a big role. | cellularmitosis wrote: | 1) the startup time is fantastic https://github.com/janet- | lang/janet/issues/324#issuecomment-... | | Function call throughput is just behind the JIT'ed lisps, which | is understandable for a bytecode runtime. | frankpf wrote: | I don't use lisp languages, but one basic difference this has | from other lisps is that functions accept multiple expressions, | e.g.: (defn greet [firstname lastname] | (def fullname (string firstname " " lastname)) (string | "Hello, " fullname)) | | In other lisps, you'd have the last expression nested inside a | `let` block: (defn greet [firstname lastname] | (let [fullname (string firstname " " lastname)] | (string "Hello, " fullname))) | | which makes the code hard to read and edit IMO. Languages like | Haskell and OCaml suffer from a similar problem too. | lispm wrote: | Common Lisp: (defun greet (firstname lastname | &aux fullname) (setf fullname (format nil "~a ~a" | firstname lastname)) (format nil "Hello, ~a" | fullname)) | threatofrain wrote: | in Racket you can do it either way, and perhaps these sorts of | issues should just be solved with an auto code formatter? | thayne wrote: | In common lisp `defun` does not require using `let`. | junke wrote: | There are two things at play here (1) the implicit body and | (2) being able to add new bindings in an existing scope with | "def". | | CL has an implicit body, but does not allow defining new | bindings outside of some dedicated forms (let, etc.). I | really prefer having to write "let" forms instead of having | new variables added inside the body. | nathcd wrote: | > which makes the code hard to read and edit IMO. Languages | like Haskell and OCaml suffer from a similar problem too. | | That's interesting, I've always really loved the "return last | expression in a block" syntax. (Ruby and Rust can be added to | your list as well.) That syntax just reads really naturally to | me. | frankpf wrote: | I like that too, but both Rust and Ruby allow multiple | expressions/statements before the last expression. In Haskell | and OCaml IIUC you need to use things like `let x = ... in | <expr>` or `<expr> where x = ...`, so you still have a single | expression in function bodies. | pauljurczak wrote: | Call me when you modernize parenthesis out. ;-) | technoplato wrote: | Please tell me this was somehow inspired by "The Good Place"... | [deleted] | Witoso wrote: | Yep. | | > Janet is named after the almost omniscient and friendly | artificial being in The Good Place.[0] | | [0]https://github.com/janet-lang/janet#why-janet | shirian wrote: | Wow, this is exactly what I've been looking for. Also, I'm not a | C-programmer, but I think the source code is good-looking. | ristos wrote: | This looks so awesome! It's got the best parts of a lot of | languages. This is what sticks out to me: | | - Really simple lisp like scheme, but reminds me of lua (and not | bloated like CL) | | - Has resumable fibers, no callcc like scheme | | - Not missing the lack of lists tbh | | - A module system that doesn't feel awkward like CL | | - A built-in package manager (unlike CL) | | - Good lua and C support | | - Threads have a shared-nothing approach with message passing | (reminds me of Erlang actors) | | - Destructuring | | - Good PEG support, encourages it over regex | | - (Im)mutable versions of data structures (ie tuples vs arrays, | structs vs tables) for maximum flexibility | | - Prototypal inheritance | | - Docs are clean and easy to read | | I'll definitely have to try this out, it looks really cool. | | Some stuff I'd like to see: | | - Pattern matching support (could be a library I guess) | | - Multimethods | | - Full numeric tower with arbitrary precision types | | - Javascript compilation -- I could see this language being | really useful for web and game dev | | Does it have good debugging support? I'm thinking of something | like slime, swank, etc. Can I set up emacs and/or vim to work the | same way I can use CL with slime + swank? | | I'm also wondering about the stack traces -- one of the downsides | to CL is sometimes the stack traces are nasty to read | tomcam wrote: | Can someone explain why this comment was downvoted? | armitron wrote: | I never thought I'd see a Lisp without lists. Oh wait, I didn't | because this isn't a Lisp. | | I know naming is hard, but this is getting out of hand. Don't | say you're a Lisp when you're clearly not. Say Lisp-inspired. | Don't use the term 'modern Lisp', 9/10 it's signaling the wrong | thing. | MaysonL wrote: | From the examples: | | # A simple fizz buzz example | | (loop [i :range [1 101] :let [fizz (zero? (% i 3)) buzz | (zero? (% i 5))]] (print (cond (and fizz buzz) "fizzbuzz" | fizz "fizz" buzz "buzz" i))) | | Is this not lisp? | nonbirithm wrote: | I'm not clear on the exact reasons, but I think some people | see it as "Python with S-expressions" rather than "Lisp". I | think it's because Janet does not use lists implemented | with cons cells and historically that's just what Lisp | always used. (Janet uses arrays instead.) But by that logic | Clojure isn't a Lisp, if has no cons cells... | | Another criteria used is homoiconicity. | | I think the argument is about if a language satisfies the | historical definition of "Lisp" rathen than being a Lisp- | inspired language with parens. | zdragnar wrote: | Lisp comes from LISt Processing, and prefix notation with | enclosing parentheses alone doesn't mean processing lists. | | With that said, the underlying datastructures don't | actually deter from the fact that you can quote and unquote | what appear to be lists, and it walks and quacks more or | less like a lisp (like clojure, as a sibling pointed out), | so I don't actually mind. | | In fact, Janet just might be my favorite scripting | language, even if I haven't had occasion to use it for | anything impressive yet. | [deleted] | solaxun wrote: | I'm so tired of this whole "xyz lang isn't a REAL lisp". | First off, what's your definition of "real lisp", second off, | who cares? What point are you trying to make? Is the language | somehow less useful because it doesn't meet your arbitrary | definition of what it means to be a "real" lisp? I imagine | you sitting at home in a smoking jacket with some smug smirk | typing this out. | | Saying that a language isn't a "real lisp" because it doesn't | use cons cells is like saying a map implemented using a red- | black tree isn't a "real" map because it doesn't use an array | of nodes. | jonstaab wrote: | I wrote a tiny multimethod library for Janet: | https://github.com/staab/janet-multimethod | | The stack traces have so far been really clean and helpful. | ristos wrote: | Why was this downvoted? I don't get it :/ | carapace wrote: | Likely for bashing CL (however lightly). People get tetchy. | [deleted] | lispm wrote: | Category error maybe: CL is a language standard with several | very extremely different implementations and a diverse tool | landscape. Janet OTOH is a single language&implementation. | nromiun wrote: | See some previous HN threads on Common Lisp. | nathcd wrote: | > stuff I'd like to see [...] Pattern matching support | | It looks like it does have a match macro, and it does | destructuring and _: https://janet- | lang.org/api/index.html#match | augustk wrote: | How does this language compare to, say Scheme? | firepoet wrote: | So, I do a lot of string manipulation using regular expressions, | and Janet doesn't support that, in favor of PEGs, which I've | never heard of. Does anyone know of a "PEGs for RegEx addicts" | resource or something similar? :-) | | What an interesting project! I'm sorely tempted to examine it | more closely for one of my side projects I've been working on in | Clojure. | firepoet wrote: | While I'm asking for help.. does anyone know of any crypto | bindings? I've been working with libsodium lately, and there is | a Clojure library that binds to it. | gozzoo wrote: | Is it compiled or interpreted? If interpreted does it use | existing interpreter? The description mentions Lua, does it use | the Lua engine? Does it have JIT? If it is compiled is it based | on LLVM? | anonymoushn wrote: | I don't know much about Janet (all I've done is complain that | create-fiber did not work the way the docs say it did), but I'm | pretty sure it uses its own bytecode interpreter. | pull_my_finger wrote: | It doesn't "depend" on Lua at all, but you can definitely feel | inspiration from Lua in the language. Has coroutines, tables, | small and easy to embed as a design goal, has a LPEG-like PEG | built-in. Really lovely if you can appreciate those things in | Lua-land. | orwin wrote: | I'm beginning to create a lisp webserver using sbcl for a | personal project. | | I find this interesting but i'd like to know if a webserver | library exist for janet yet, and how does it perform compared to | sbcl performance-wise (x2 to x5 does not bother me, anything | beyond that would not be great). | | I'd like to know if a slime/swank can be used with janet | (although this is really not a requirement) | | [edit] i just thought that creating a webserver would be a nice | introduction to the language. | | Also can you compile janet into wasm? | srle wrote: | It's right on the bottom of the page my dude, just scroll down | or C-f circlet | orwin wrote: | wow i stopped at "try it". thank you. | pull_my_finger wrote: | I'd offer an alternative to the one linked on the main page in | Joy[1]. Quick and easy to get started with. | | 1: https://github.com/joy-framework/joy | mlatu wrote: | This sounds awesome! | | I was about to try and extend a software-product with graalvm to | extend it live in clojure. | | But Janet sounds like a couple less hoops to jump through. | | Also, I won't have to deal with Oracle at all :D which is really | the main reason I haven't begun work on this project yet. | lenkite wrote: | Can't find the tutorial or language manual. | hanche wrote: | I see no tutorial either, but did you try clicking the | prominent link near the top labeled "Documentation"? The | language manual seems to be all there. Once you're inside the | documentation, there is a hamburger menu exposing a | comprehensive table of contents. | lenkite wrote: | I am an idiot. Somehow I went to the API documentation and | examples instead on the github site. Thanks. | macleginn wrote: | I looked at the first two libraries listed on the landing page, | and they seem to be mostly implemented in C. (The same goes for | the 3rd lib, but it's SQLite bindings, which makes sense.) This | is a bit discouraging. | billfruit wrote: | How does this compare with Carp? | mapcars wrote: | 2020: a programming language is named Janet; a child is named X | AE A-12. How did we come to this. | Koshkin wrote: | Names starting with a 'j' should be reserved for languages | targeting JVM. | aasasd wrote: | In the fine tradition of Jcala, Jotlin, Jroovy and Jlojure. | soapdog wrote: | Damn, I almost spilled my coffee reading this :-) | iLemming wrote: | Little known fact: Rich Hickey initially planned to target | .Net CLR and JVM, so he wanted something that has "C", "L", | "R", and "J" in the name, that's how Clojure got its name. | aasasd wrote: | Well, I guess had he put JVM first to reflect reality, | 'Jocular' would evoke rather different feelings. | catalogia wrote: | I'm sure Oracle would love that, but fuck Oracle. | aasasd wrote: | You mean that the _language_ should 've been called 'XAEA-12' | instead? | qwerty456127 wrote: | No, it should've been called X AE A-12. At least one of the | normal letters (X or A) should be Cyrillic and at least one | of the spaces should be actually a tab. | Insanity wrote: | sounds like a diabolical 'password rule'. | aasasd wrote: | Eh, let me introduce you to U+2060 zero-width word joiner. | qwerty456127 wrote: | Thank you, I've never hear of it. Unicode is so much fun. | klyrs wrote: | I came here looking for "dammit, Janet" but only found that | sentiment. Culture is dead. | oblio wrote: | It's not really something new. Ada | (https://en.wikipedia.org/wiki/Ada_(programming_language) ) was | created 40 years ago. Kids with crazy names is a long standing | tradition, going back millenia :-) | mapcars wrote: | You are right, just the timing and example is so striking :) | mhd wrote: | Also Amos, Haskell, Idris, Joy, Miranda or Yorick. Arguably | Dylan or Pascal. | | I'm more confused by a name starting with a capital "J" not | being associated with Java, as once was custom. | | As for kid's names, definitely[1]. | | [1]: https://www.youtube.com/watch?v=Jg9w0YSMLHY | iLemming wrote: | And don't forget Swift, named after the biggest philosopher | of our time - Taylor Swift. | junke wrote: | Julia too | egl2020 wrote: | "associated with Java, as once was the custom". Like | JavaScript. Yeah, right. | oknoorap wrote: | Any tutorial about Janet? | thanatropism wrote: | Not mentioned here: Hy (hylang.org), a Lisp that | manipulates/converts to the Python AST and therefore is fully | interoperable with the whole vast Python ecosystem. | | Although the language is still somewhat short of 1.0, it has | stopped changing (after a fairly dramatic turn circa 18) and I've | been writing more Hy than straight Python for a while now. When I | started using Streamlit (and then you can't have a main.hy | function that it will recognize, although you can import | arbitrary Hy modules) I started writing straight Python again for | my weekend project and boy, do I regret it. I'm seriously | considering pausing everything to port to Hy. | mark_l_watson wrote: | I certainly agree that if you need the Python ecosystem, then | Hy makes development much more enjoyable, at least it does for | me. I look at Hy in the same way as Armed Bear Common Lisp: as | a great tool is I need the Java ecosystem. | natrys wrote: | +1 for Hy. I recently did a project where I needed to embed a | lisp. I actually considered Janet (since Schemes are a little | too threadbare), but there was no binding for a non-C language. | I might consider creating Rust or Nim binding myself later, but | Hy proved to be immensely easy and satisfying to work with. | kleiba wrote: | Okay, so when Clojure came along, it came with a strong | underlying philosophy of what the language was supposed to be/do. | Among them were design decisions such as, e.g.,: | - VMs, not OSes, are the platforms of the future, so target the | JVM - Object Orientation is overrated, but polymorphism is | a good thing - Multi-core is here to stay, so use immutable | data structures to greatly facilitate writing correct concurrent | programs - Leverage the strengths of LISP but give it a | modern overhaul (most notably, throw in different parenthesis) | | Now, you may or may not subscribe to any of these but my question | is just: how does Janet compete on that front? What is the | problem it is trying to address specifically? I looked at the web | page a bit but it's still not clear to me. | dan-robertson wrote: | I feel like a better description of how closure feels as a | language would be something like "a functional language where | everything is data and that data is flexible". In particular | the difference from a typical strongly typed functional | language where basically everything is data you can dig into is | that the data representation in closure is more extensible and | uniform (because the types are implicit and not enforced) | varjag wrote: | The first point clearly didn't pan out. In reality, | applications ended up bundling their own OSes along, so Clojure | is stuck with antiquated VM on its ankle for no good reason. | pron wrote: | That "antiquated" VM is head and shoulders above any other | extant runtime in compilation, GC and observability. Not only | that, most of the major innovations in recent years in those | areas seem to be happening there. Moving from the JVM to | almost anything else -- be it Python, Go, Erlang or Node -- | feels like being transported to medieval society. Don't get | me wrong, some find it liberating as in, huh, I turns out I | _can_ survive without my smartphone, but calling the state- | of-the-art technological leader "antiquated" is taking it | way too far. If you care about performance, productivity and | observability, there really aren't that many alternatives out | there, and whatever adequate alternatives there are, they are | even more "antiquated." And guess what? It turns out that a | great many people care about those things. | varjag wrote: | It is state of the art in the same sense that America is | the uncontested leader in WWE. | pron wrote: | Is it? I've looked hard and couldn't find any runtime | that isn't more than five years behind OpenJDK(+Graal) in | those areas, but maybe I missed something. I'm not saying | it's perfect, but there's nothing out there that's better | in those areas. | Scarbutt wrote: | You don't need Graal when you have Golang around the | corner. | pron wrote: | We're not talking about the same thing. The innovative | parts of Graal are not the AOT compiler. | pjmlp wrote: | Just to add to your point the only alternative that I | would consider is .NET, and even then I do acknowledge | that it is behind some JIT stuff, given that they have | been favoring AOT / and single JIT scenarios. | | Without Valhahla we will never get a Java variant of | Unity, jMonkey Engine is a good as it gets and it has | plenty of native code to overcome the areas where the JVM | is found lacking. | yrio wrote: | What do you think about .NET? | pron wrote: | It's probably the closest contender [1], but its non- | Windows story is still a handicap, as is Microsoft's | habit of making sweeping incompatible changes to their | development platforms every 5-6 years. | | [1]: A different philosophy that gives more control to | the user in exchange for explicitness puts it ahead in | some areas (structs) and behind in others (compilation | quality, GC), but as a runtime engineer it's | "technologically" behind (I work on OpenJDK so I'm | biased, but I came to work on OpenJDK because that's | where most interesting innovation in runtimes happens). | ohitsdom wrote: | .NET Core's cross-platform tools and ecosystem is | wonderful. I'm working on a small team and the devs are | using Windows, Mac, and Linux. CI builds are a mix of | Windows and Linux, deploying to Linux. | | I think their biggest weakness now is branding (.NET vs | .NET Core). This will be fixed with .NET 5, which merges | the two and will make all flavors of .NET cross-platform. | moron4hire wrote: | Microsoft doesn't make breaking changes. I have code that | has survived three or four of your supposed cycles that | still runs completely fine. | orthoxerox wrote: | Microsoft did kill off or sunset some parts of the | Framework. WCF, WWF, AppDomain, expression trees, | dynamic, VB. | | People who wrote WCF services in VB for a living are | probably extremely disappointed. | mr_custard wrote: | Disappointed? Not at all! I worked with it many years | ago. | | Whilst WCF made some notable improvements over what | existed within the ecosystem before it, it was still a | sprawling, complex PITA and full of developer friction. | Killing it off in this case was definitely the right | thing to do :-) | jbeam wrote: | Do you have anything to support that expression trees are | being sunset? I haven't seen anything of the sort, unless | you are talking about a deprecated library that has been | replaced. But System.Linq.Expressions is still around. | moron4hire wrote: | I've also seen nothing about DLR being removed | StreamBright wrote: | I guess this boils down the difference between what I call | "l'art pour l'art" software engineering vs production-ready | code providing a business functionality. The amount of | hello world computing on HN is out of the roof, it seems | nobody really cares about software lifetime or just never | run into a situation when observability is a must. I think | the reason for this that most businesses being ok with | software being ridiculously expensive and shitty quality. | The few places where software matters use Java/C++ because | that works at a massive scale and these languages bring | observability to the table that is required to maintain a | service. | nisa wrote: | > antiquated VM | | I'm always flabbergasted about the ignorance against the JVM | on this site. There is nothing out there that has seen | similiar research and optimisations and has so good | monitoring/debugging tools. | pjmlp wrote: | Add the various JVM implementations, ART and the .NET | variants into it as well. | Scarbutt wrote: | Java is antiquated though, I don't see many new big | libraries/frameworks being written in it. Java is too big | and too entrenched in the enterprise to go away any time | soon but in ten years the language will become legacy. For | what's being used, languages like Go and to some extent | Rust are eating Java's market share for new stuff being | built. More and more universities are moving away from Java | as teaching language too. | | Clojure is in a bad spot here, it was a good idea at the | time but not today. Clojure relies on Java for its | libraries cause Clojure has almost no ecosystem. 95% of | Clojure libs are Java wrappers. | anonymoushn wrote: | My position on the matter might be summarized as "No TCO, | no copyable stackful coroutines, no buy." Separately from | that a lot of my experience with the JVM involves things | like trusting the JVM's claim that it spent 0 microseconds | GCing a certain thread that was running code specifically | designed to produce no garbage, then running the code in | production for one day and losing tens of thousands of | dollars, then learning that even if the JVM pauses your | thread for 1ms for heap compaction it will still tell you | it spent 0 micros on GC. | synthc wrote: | Do you know of a production ready VM with these | properties that has a nice ecosystem? | yellowapple wrote: | I reckon part of the point is that a VM (in the JVM or | CLR sense) might be a poor fit for the given use case, as | might an automatic garbage collector, and thus that might | dictate the use of languages which rely on neither (like | C/C++ or Rust). | anonymoushn wrote: | If you do a trivial amount of up-front work, C and Luajit | have these properties, but Luajit often isn't a suitable | replacement for the JVM and C isn't a VM. So no. | HelloNurse wrote: | In other words, on the first day day of testing under | realistic load conditions you learned how to measure GC | pauses; then, presumably, you were able to improve | performance. | | It shouldn't have happened in a production environment, | but setting up a way to lose tens of thousands of dollars | if performance is bad, trusting unreasonable numbers, | trying to produce no garbage, and requiring no GC pauses | because margins are too tight are all your faults, not a | shortcoming of your JVM. | anonymoushn wrote: | Right, we improved the performance by moving the work out | of the JVM. | | It's my fault that if you trade US equities based on old | information you lose money? | | Edit: Actually, I'm still not sure how to correctly | measure GC pauses, other than from inside the | application. | HelloNurse wrote: | It's your fault if you trade equities, or you do anything | else in which milliseconds matter, with a software | platform that is aggressively optimized for _average_ | performance and for server stability at the expense of | hard real time guarantees and with a language that | privileges enforcing constraints (both to ensure | correctness and allow optimizations) over allowing the | user explicit control. ( "Your fault" at the | organizational level, not personally, of course.) | | Can you explain how Java was chosen for your trading | application? Also, why were you unable to test it | properly? | anonymoushn wrote: | The org chose Scala for the trading application in the | hope that developers and researchers could both use it, | when previously they had been using very different | languages. I thought this went mostly well. Scala enables | you to use some shenanigans to pretend that a byte-array | is an array of structs, and the 31 other threads of the | application ran acceptably on the JVM. As an aside, my | impression is that Java is somewhat common in the | industry. | | The application was tested in an environment that's a lot | like production, except that we had substantially fewer | cores than an exchange running the same number of | matching engines, so the incoming ticks were a bit less | bursty. That burstiness was important in this instance. A | big reason for the differences between the production | environment and the test environment was the cost of | hardware. | zentiggr wrote: | I'm not sure I've ever heard of the JVM being used in | trading level software before. I've gotten a broad but | vague impression that custom applications are the norm. | | No criticism, as I've only read others' accounts, but | that sounds out of character. | HelloNurse wrote: | Java or Clojure applications are "custom" too: custom | code running in some kind of application server is more | or less the same as custom code relying on libraries and | frameworks in C or C++ or other leaner languages. | | What's "out of character" (nice euphemism!) is adopting | state of the art automatic garbage collection technology, | writing in a language that makes actual garbage | collection practically unavoidable, and then expecting | that garbage collection doesn't happen or happens | accordingly to arbitrary expectations. The JVM is clearly | inappropriate technology if latency is important: it can | perform well in common cases and with a reasonable level | of tuning effort, but other options simply do not have | the threat of GC pauses. | masukomi wrote: | I gotta agree with HelloNurse here. When that kind of | money is on the line you set up a production version that | ingests real data at real speed, and produces the same | output / response but doesn't actually spend / affect any | money. You watch it for at least a week and see what | happens. | | I'm sorry to say it, but the loss of money here was not | the JVMs fault. It was putting code with insufficient | load testing in a production environment and crossing | your fingers despite the fact that serious money was on | the line. | anonymoushn wrote: | A complete-fidelity production-like environment would be | a couple orders of magnitude more expensive than the | 1-day loss, so I disagree. | HelloNurse wrote: | You don't need another complete set of servers: the new | production servers, before beginning actual service, are | available for brutal stress tests and all sorts of other | experiments while the old servers running the old | software are still in use and undisturbed. If the system | is completely new and there is no old software on old | servers, it's even easier. | | Considering that software mishaps in securities trading | can annihilate a company of any size, not only cost you | as much as a bunch of servers, lack of testing appears | very reckless. | varjag wrote: | I did a JVM targeting language as a research project, and | was involved into porting KVM to an obscure architecture. | It's been a while of course (early 00s) so maybe I | misremember something or there were huge strides of | progress in JVM. | | Can you jump over 64Kb in bytecode yet? Allocate a | lexically scoped variable? | | Of course, enormous amount of work has been put into making | this particular pig fly at reasonable speed. Doesn't change | the fact that most usability complaints about Clojure stem | from reliance on JVM piggybacking. | smt88 wrote: | From the narrow scope of web development, JVM is fine. | Kotlin is able to have every ergonomic feature you'd want | from a language, and it gets closer to the performance of | C in TechEmpower than many other languages (notably C#, | Node, and Python, three of the most popular languages). | | Tuning can be a pain, but scaling anything is hard. | varjag wrote: | It is clear that a lot of very important and practical | work had been delivered with Java/JVM. But the original | point was not about what is possible, but what is | optimal. | | Kotlin, from the little I've seen, appears to be largely | a syntactic variation of Java, so there is certainly good | impedance to JVM. Clojure is less so, and here lies the | reason everyone curses about its backtraces. | nisa wrote: | so what's better and out there and reasonable stable? | zelphirkalt wrote: | Probably BeamVM, giving you better options for scaling, | abstracting away machine borders and lightweight | processes. | ethelward wrote: | BeamVM is much worse than the JVM in the raw computing | performances department. | zelphirkalt wrote: | As far as I know, people in the Erlang world tend to use | NIFs for computation heavy tasks: | http://erlang.org/doc/tutorial/nif.html However, I have | not done that myself, so I cannot tell from experience | how that works. | varjag wrote: | x86-64 | fouc wrote: | market share is going to ARM | varjag wrote: | ARM is nice too, I concur | cageface wrote: | HN has a very large bro/cowboy coder constituency. I | suspect a large portion of the commenters here have not | built anything non-trivial. You learn to filter it out but | it's disappointing to learn that "engineers" are not much | more rational and objective than the average Joe. | kleiba wrote: | But that's besides the point, right? My question is about | what Janet's niche is -- or are you arguing that we need a | native Lisp because Clojure is only available on the JVM? | fnord77 wrote: | we'll see a renewed interest in VMs once diverse CPU | architecture becomes more common. ARM and risc-V servers and | laptops are coming. | | right now if you release binary software for linux, windows | and mac, you basically have 3 versions to distribute. | | that will turn into 9 versions per release. that's a build | and release nightmare. | galfarragem wrote: | What I like in Janet (I'm just a noob so take this comment with | a grain of salt as it will sound superficial): | | - Easy to get started: one click install, great website and | concise docs. No matter what some people say, getting started | in Clojure is a nightmare. | | - Lightweight and fresh. No JVM, no Node. | | - Freedom and expressivity. Mutable or immutable data | structures, ultimately is up to me. It might bite me down the | road but for now it feels great. | flaie wrote: | > No matter what some people say, getting started in Clojure | is a nightmare. | | You just need Java installed on your system, then you install | clojure (via brew, or sh install) and that's it, you're good | to go. | | I've written a guide to starting with Clojure covering | installation to REPL & IDE configuration: | https://grison.me/2020/04/04/starting-with-clojure/ | billfruit wrote: | A lot of tutorials assume the use of lein, which isn't part | of Clojure, and isn't properly packaged for windows. | cmiles74 wrote: | Running the batch file that comes with the project works | for me and has worked on a variety of versions of | Windows. I haven't had as much luck with the "clj" tool. | | I don't see who the "clj" shell script is somehow "part | of Clojure" any more than Leiningen or Boot. IMHO it's | just a shell script and it works similarly to the other | tools, except not in any way cross platform. | billfruit wrote: | Yes but Leiningen is not distributed with Clojure. And as | far as I remember there is no installer for Leiningen on | Windows. Right now I find it is available through | Chocolatey, but the main Leiningen page asks users to | download and run a batchfile. That's a very strange | instruction to ask a windows user to do: Running batch | files downloaded from the internet goes against so much | advice on computer security that is given to users. | cmiles74 wrote: | Neither is clj, for some reason, and it installs the same | way as Leiningen. ;-) From their website: | | "Then run: | | Invoke-Expression (New-Object System.Net.WebClient) .Down | loadString('https://download.clojure.org/install/win- | install-1.10.1.536.... | | There's also no clj installer for Windows although there | is a Scoop package. | | https://github.com/clojure/tools.deps.alpha/wiki/clj-on- | Wind... | AlchemistCamp wrote: | > you install clojure (via brew, or sh install) and that's | it, you're good to go | | The vast majority of PCs are Windows, not Mac or Linux. | Though WSL2 (available with Windows Insiders) makes working | with Linux software a breeze, it's _not_ the standard flow. | Java isn 't installed by default, either. | | Your guide suggests using WSL and IntelliJ. Does IntilliJ | actually work with Closure running in WSL? For that matter, | does the VS Code plugin? | | These are all headaches a new programmer won't have when | getting setup with PHP, Python, JavaScript or most popular | languages. | cmiles74 wrote: | The Windows story for Clojure is disappointingly weak, | especially if you are going by the "Getting Started" | section on their website.[0] They have reasonable | instructions for Linux and MacOS, but for Windows they | point you to an "alpha" level tool. | | I think this is especially disappointing because there | are mature, cross platform solutions available but | whoever manages the Clojure project seems hell bent on | pushing their "clj" tool which is, clearly, treating | cross-platform concerns as an after thought. The Clojure | organization conducts a survey every year and this is | hurting their adoption with developers on Windows. | | "One new question we asked this year was about the | primary developer operating system to give us better | guidance about tool-related work. As expected, MacOS was | the leader (55%), followed by Linux (35%) and Windows | (9%)" | | Getting started with Leiningen, in my opinion, is much | easier although, as has been pointed out, installing a | JDK is an extra step that other languages don't have. | | [0]: https://clojure.org/guides/getting_started | | [1]: https://clojure.org/news/2020/02/20/state-of- | clojure-2020 | | [2]: https://leiningen.org/ | e12e wrote: | At least lein and boot-clj is available for/via scoop.sh. | Seems a bit of a missed opportunity that "official" | clojure "clj" isn't just using scoop. | cmiles74 wrote: | Agreed, the Scoop instructions are simpler and many | developers will already have it installed. | flaie wrote: | I have both a MacBook Pro and a standard PC running | Windows, and yes on Windows I run Clojure both on Windows | and inside WSL, both IntelliJ and VSCode works pretty | well with WSL there's really no problem running it. | | I'm doing a lot of Clojure since years both on my MBP and | on Windows and there's no problem at all doing that way. | Besides VSCode even has a plugin for WSL which will let | you directly hook into it. | | So yeah there are some questions like which Java to | install, which IDE, .. but these questions are the same | for other programming languages. | | If you have any hint regarding how to improve my guide | don't hesitate to tell me if something is not clear in it | :) | AlchemistCamp wrote: | I'm not familiar enough with Clojure to help (ironically | because I myself was put off by the tooling). The reason | I asked about WSL and editor issues is because I | encountered them myself when working with Elixir on WSL | and VS Code and saw related issues on SO about Clojure. | This was almost 2 years ago, though. | | Probably the biggest thing would be to assume the person | reading the guide has a brand new computer and hasn't | installed anything yet (including Java and Homebrew). | | It's really hard to assume much about the background of | someone just trying a new programming language. Maybe | they've worked with other languages and you're familiar | with, maybe not. | neutronicus wrote: | This I think is a fundamental impedance mismatch between | Lispers and everyone else. | | A Lisper sees a REPL, and thinks they have "gotten | started." When I think most language learners don't think | they have "gotten started" until they, on the low end, have | printed something at a familiar terminal, or, on the high | end, pointed a web browser to localhost:8080 and seen some | text there. | xiaodai wrote: | tried to install Clojure on Windows. Just flat out gave up. | pjmlp wrote: | 1 - Download a JVM and make it available on the PATH | | 2 - Dowload clojure.jar | | 3 - Start command.com or PowerShell | | 4 - cd into clojure installation directory | | 5 - java -jar clojure.jar | AnIdiotOnTheNet wrote: | > 3 - Start command.com or PowerShell | | command.com? Is it 1995? | pjmlp wrote: | Unfortunately not all Windows shops got the message. | cygx wrote: | They're (probably) alluding to the fact that command.com | is spelled cmd.exe since Windows NT became the mainline. | pjc50 wrote: | Of course, that's not the official instructions. These | are the official instructions: | https://github.com/clojure/tools.deps.alpha/wiki/clj-on- | Wind... - they've managed to work out what the powershell | is for "run untrusted shell script directly from HTTPs". | | What there _should_ be is an exe or MSI installer like | every other Windows program. | pjmlp wrote: | The official instructions are here, https://clojure.org/g | uides/getting_started#_installation_on_... | | Not directly the link you provided. | | Yes, they require Java knowledge I guess, but then again | using guest languages without caring for the host | platform is a fallacy. | | Now I do agree that an installer would be the right | experience to provide. | jimbokun wrote: | So according to that page, there are 3 ways to install on | Windows. | | 1. Alpha version of "clj on Windows", which seems to be | the recommended approach, and requires going to another | page to get the instructions. | | 2. Homebrew on Linux or Windows with WSL, linked to under | "Installation on Linux". | | 3. Build from source, under "Other ways to run Clojure", | which assumes git, Java, and Maven installed, with no | instructions on how to install them. | | I would say it's pretty confusing from that what is the | optimal, recommended way to install Clojure on Windows. | It might be better to have subheadings under | "Installation on Windows" like "For Java developers" | (assuming Java tools already installed), "For WSL users" | (Homebrew), "For Powershell users" (clj on Windows). This | would consolidate the Windows installation strategies and | reflect the diversity in the Windows developer | population. Some are already full time Java developers, | some live in WSL as much as possible, and some fully | embrace Windows specific tools like Powershell. | cygx wrote: | Where can I get such a clojure.jar? What worked for me | was | | ... | | 2 - Download clojure-1.10.1.jar, spec.alpha-0.2.176.jar, | core.specs.alpha-0.2.44.jar from mvnrepository.com | | ... | | 5 - java -cp clojure-1.10.1.jar;spec.alpha-0.2.176.jar;co | re.specs.alpha-0.2.44.jar clojure.main | pjmlp wrote: | From here, https://clojure.org/guides/getting_started#_in | stallation_on_... | cygx wrote: | Maybe I'm blind, but I don't see any such download link. | Or did you use | | 2 - Dowload clojure.jar | | as a shorthand for | | 2.1 - Install Maven | | 2.2 - Install git | | 2.3 - Clone https://github.com/clojure/clojure.git | | 2.4 - Run mvn -Plocal -Dmaven.test.skip=true package | pjmlp wrote: | I wasn't aware of the page update, there has been like | two years since I used Clojure last time. | | It used to be so that they provided a zip to download. | | In any case as mentioned on a sibling comment, I assume | that anyone willing to use a guest language should get | comfortable with the host platform. | | So git, well for better or worse that is what most are | using nowadays. | | Maven, number one build tool on Java world, even if using | another one, most likely those jars are coming from Maven | Central. | | Just like, regardless of my opinion on C, I keep my C | knowledge up to date, because that is what I eventually | might need to reach to when on UNIX like platforms. | ngcc_hk wrote: | I still feel dreadful when doing all these integration | with leninigen. Work for whole month then get it. But | there is limit of my personal time budget. | | And how to work with vscode as it all fails, at least | windows. | | But love clojure syntax. In particular I found it hard to | see all () and the simple added some syntax sugars help | the eye a lot. | | Hence jump to janet. In fact the community is very | helpful. | | Not sure but the size is small enough to see whether one | can do embedded as I try picolisp but it is bounded to a | low end Env. | | Very promising. | | Btw the whole point I later schedule more time to try | clojurescript to ... May be that can wait a bit. | thih9 wrote: | This process might seem easy for you, but maybe not for | people installing Clojure for the first time. | | In an extreme case, someone who doesn't know Java ecosystem | might want to stop to research: what is JVM, why is it | necessary, which version would be the best, what's the | difference between Oracle's Java and OpenJDK, etc... | NotPhysicsPhd wrote: | One could say the same for a plethora of programming | languages some research is needed and we don't have to | resort to extreme cases. | | Out of the top of my head: | | - There is the Python 2.7/3.X situation still going on, | then there are the several distributions of python. | | - GNU's R has a similar problem | | - Installing gcc on windows was (perhaps still is) a | confusing mess for a newcomer. | | IMO I did not find installing clojure any harder than | installing Scala for instance, and yet I have never heard | (anecdotal, I know) complaining about Scala. | ptato wrote: | the comparison was to Janet, not Python, R, C or Scala | fluffything wrote: | The user above mentioned that for _them_ the installation | experience of a programming language matters a lot, and | that they found the installation experience of Janet | superior to Clojure. | | You might not share that users preference of caring about | the installation experience of a PL, but arguing that | this user's preference is somehow unfair because many | other languages also have bad installation experiences | makes absolutely no sense. | 7thaccount wrote: | Isn't GCC on Windows just unzipping a zip file and adding | that location to path? | jimbokun wrote: | If you don't know what Java is, you are not in the | Clojure target market. | adamkl wrote: | I've posted this quote before, but it might help explain why | making Clojure easier to get into maybe hasn't been a | priority for Hickey et al. | | _So we need players. I would rant here, but I won 't. But | look at this guitar player with blisters. A harpist has | blisters, a base player with blisters. There's this barrier | to overcome for every musician. Imagine if you downloaded | something from GitHub and it gave you blisters._ - Rich | Hickey (Design, Composition and Performance) | | Clojure seems more concerned with power, expressiveness, and | reach, rather than ease of use. Does this alienate new users, | sure, but the Clojure community seems OK with that as a | trade-off. | alharith wrote: | False choice. Guitar Center sells out of the box integrated | guitar + amp combos with a getting started booklet. | | You can also use 9 gauge strings. Those _might_ give you a | slight callus, but certainly no blisters. | rfrey wrote: | I am full to my neckline with Clojure kool-aid: I love the | language and programming experience. But the "getting | started" your parent is referring to, IMO, is getting the | tooling set up, getting the repls connected, figuring out | what a full-stack app looks like with its 2 distinct repls | and toolchains and lein config mashups, hooking up an | editor... and then having it break the next day. After 5 | years of Clojure I still get frustrated if I'm away for | more than a month. | | It's like you were getting blisters from _stringing_ your | guitar. You buy a guitar, get home, and it takes three days | to open the case. Then another week to figure out which | strings go where. God help you when you realize you have to | _tune_ the thing. | | Two, five, seven days pass and you haven't played a note. I | don't think that's what Hickey meant. | | That said, it's worth it. | tartoran wrote: | Spot on with your amusing guitar analogy. Getting to play | notes seems like an afterthought, but when it does it | plays for you as if it reads your mind to do so. The | problem is the setup and that's the part that I dislike | these days, the patience to to configure the tools is not | there, a lot of the tools are like black boxes, something | goes wrong and it isn't visible or or it is too complex | to enjoy the process. | nickbauman wrote: | If you're not familiar with the JVM, I think this is a big | ask for most people as far as ease is concerned. I have | created a template on my github to use clojurescript with | your typical NPM setup that would allow you to get started | right away. I know of no equivalent in the JVM world mostly | because of how tightly Oracle controls the download | experience of the JDK. | satya71 wrote: | Well, Oracle JDK is a non-starter outside enterprise | settings these days. You should be using Zulu or | Corretto, and both are much easier to download. | james-mcelwain wrote: | No, you should almost certainly be using openjdk, which | oracle jdk is based off, unless you have a compelling | reason an alternative implementation is better. | TJSomething wrote: | Zulu and Corretto are both distributions of OpenJDK. | octetta wrote: | Thanks for sharing this... I'd never seen it before. It | does make me wonder how many languages we use that could be | compared to bag-pipes... in that even when you learn how to | play them expertly, they still sound like an animal being | killed. | gfxgirl wrote: | That assumes it is a tradeoff. Maybe you can have both. I | see nothing obviously preventing having power, | expressiveness, and reach, and ease of use | adamkl wrote: | I agree that it doesn't have to be a trade-off, but that | mindset might explain why there is less focus on creating | one-click installers. | | An example would be Clojure's newish approach to managing | projects via the CLI and deps.edn. It's very powerful, | and expressive, but definitely not a one-click approach. | roenxi wrote: | Clojure is an inspirational language that has some | insightful opinions about how things should be done. A | month spent learning Clojure is a great investment. A | lifetime programming in Clojure would be a joy. | | But as I recall the original Rich Hickey talks on "Why | Clojure?" he was explicit that dependency/project | management were very hard problems that Clojure didn't | really attempt to solve. | | I'm not aware of any Clojure tools that are best-of-breed | for project management. Java has a better model for | locking everything down (or maybe how the Linux Distros | manage their repositories) and Python has a better model | for just keeping up with the current state of things. I'm | not aware of any half-and-half model that gives | satisfying results. | | Clojure is inferior to Java in that aspect because the | number of things to keep track of roughly doubles (for | every concept there seems to be a Clojure version and a | Java version) and library management is bizarre and warty | - see also the horrible import/require/use/some other one | I can't even remember mess. And then there is unpicking | the syntax differences between using things in the (ns) | macro vs calling direct. I dunno; maybe something changed | but that part of the experience is a mess. Unusually | poorly done in Clojure too, everything else was so | lovely. | | I never got on top of it and I tried for months; as | evidenced I can't even remember how to load a library | after putting it down for a little while. Even assuming | the classpath is correctly set. What would have to happen | for a C programmer to forget #include "name.h" ? | didibus wrote: | > I'm not aware of any Clojure tools that are best-of- | breed for project management. Java has a better model for | locking everything down (or maybe how the Linux Distros | manage their repositories) | | Uh? Clojure locks everything down as a well. In fact, | deps.edn solves many issues experienced with Maven. | | Personally, I've found Clojure dependency management to | be the best I've ever used in any language. It's simple, | explicit, gets out of your way, and lets you just do your | work. | | > and Python has a better model for just keeping up with | the current state of things. | | I'd like to hear about this? Pip doesn't even have a | command to update all dependencies in one go. And | figuring what even are the dependencies of any given | project is a mess. | microcolonel wrote: | > _he was explicit that dependency /project management | where very hard problems that Clojure didn't really | attempt to solve._ | | For what it's worth, having used Clojure for work for a | couple years now, and ditching leiningen for deps.edn | (built in package and dependency management that hooks | into maven), I've not had an issue with it. You just add | the dependencies to your deps.edn, and run your program. | If your namespace needs something from a package, you add | it to the (:require ...) section of your ns declaration. | | Here's an example ns from one of our messiest modules: | (ns profusion.core (:require | [clojure.core.match :refer [match]] | [clojure.set :as set] [clojure.string :as | string] [clojure.walk :as walk] | [clojure.zip :as z] [instaparse.core :as | insta] [profusion.infix :refer [infix-to- | prefix]] [profusion.standard-library :refer | [comparison]] [profusion.utils :refer :all] | ) (:import (org.jgrapht Graph) | (org.jgrapht.traverse TopologicalOrderIterator) | (org.jgrapht.graph DefaultEdge | SimpleDirectedGraph) )) | | To be clear, projects like this can be run with the base | Clojure distribution, no additional tools required. | | > _I 'm not aware of any Clojure tools that are best-of- | breed for project management. Java has a better model for | locking everything down (or maybe how the Linux Distros | manage their repositories) and Python has a better model | for just keeping up with the current state of things. I'm | not aware of any half-and-half model that gives | satisfying results._ | | deps.edn generally asks you for specific versions if | you're getting things from maven, so you don't risk not | "locking everything down". If you _really_ want to _lock | everything down_ however, you should check all your | dependencies into your source tree, this is an option | that deps.edn supports well, through the :local keyword | instead of :mvn /version for maven dependencies. That | namespace declaration I showed you is from a subproject | that we import into one of our other subprojects using | the :local keyword, and the deps.edn for it just declares | the source directories and and the dependencies, | everything else is handled automatically. | roenxi wrote: | That is a perfectly reasonable way of doing things. | However, the official reference [0] recommends: | | (1) Your way (but also throw in an :only and doesn't | mention :refer) | | (2) (require 'clojure.contrib.def 'clojure.contrib.except | 'clojure.contrib.sql) | | (3) (require '(clojure.contrib def except sql)) | | And leaves open a lot of room for someone to try to use | (use) which is probably a mistake since you don't use it. | | And sometimes your way has [] and sometimes it doesn't. | Pretty much at random considering '[profusion.utils | :refer :all]'. And the official docs add in a dizzying | number of combinations of quoting requirements to recall. | | It isn't the end of the world but that is a far cry from | how good all the other parts of the language are. It is | really sloppy and confusing to learn. There is no | recommended approach and I personally can't remember | which easy way I used last time so my personal projects | cycle randomly. I think Clojure has the worst library | loading mechanism of any language I think is good. Even | your way has two completely different code paths (import | vs require) to bring in dependencies. | | [0] https://clojure.org/reference/libs | microcolonel wrote: | > _Even your way has two completely different code paths | (import vs require) to bring in dependencies._ | | import and require have different purposes though, it | makes perfect sense to me that they are separate. Import, | here, is used to import Java classes, which don't hook | into Clojure's namespaces directly; require is for | bringing in symbols from Clojure namespaces. In general, | a beginner or intermediate Clojure user will not touch | the :import feature at all, nor the :use feature. | | > _It is really sloppy and confusing to learn._ | | That's one opinion of it I guess; though in my | experience, the way that I do it is very common in | publicly-visible Clojure modules. I've been doing it the | same way since day one, without issue. There may be other | ways, but you don't really need to care about them. | | With this you'll understand most modules you come across, | and you'll be able to accomplish basically anything | you'll want to. | | Given the average completeness of documentation on | publicly-visible packages (though to be fair most big | ones have what most would consider _adequate_ | documentation) including the core, you 're going to have | lots of opportunities to read other people's modules, and | these minutiae will fade into obscurity and be | overshadowed by your own program's problem space. | roenxi wrote: | > For what it's worth, having used Clojure for work for a | couple years now... | | > ...it makes perfect sense to me that they are | separate... | | > A lib's container is a Java resource whose classpath- | relative path is derived from the lib name [0] | | > No matter what some people say, getting started in | Clojure is a nightmare. ~ galfarragem (earlier in the | thread). | | I'm hoping this smorgasbord of quotes is making my point | for me - the fact that there is an easy way is good, but | the problem is that the easy way is very well hidden and | Clojure is competing with systems like 'pip install foo', | 'import foo' in _every single_ piece of documentation on | Python there is on the internet. | | I'm not budging from Clojure's import system being | byzantine. I don't care that the people who stuck with | Clojure figured out something that works for them, it is | stupid and it is a very effective filter on keeping | people out of the language. The lesson 'ignore half the | reference manual page' is not an appropriate lesson to be | learning while working out how to load dependencies. | | _EDIT_ If all the other parts of the project build were | easy then obviously this wouldn 't be an effective | filter; but this combined with a misconfigured classpath | issue for someone who doesn't know Java well would be the | end of it. | | [0] https://clojure.org/reference/libs | 7thaccount wrote: | Yep..I've found Clojure to be pretty difficult as I have | very little Java experience. The language itself is fine, | but needing to install and configure so many tools to get | anything done is a major turn off. In my opinion, | Clojure/Scala/Kotlin on the JVM and F# on .NET all have | the same problem of assuming you're a Java or C# | developer. I have zero interest in either and asking | someone to spend a large amount of time learning them so | that I can hop to a language I do like is a stretch. | That's why they'll never beat Python in adoption which | doesn't require 20 years of knowledge of an entire | ecosystem. | microcolonel wrote: | No, these are not making your point for you. You bring up | :import and :use, but in truth, a beginner or | intermediate Clojure user is not going to use either of | them at all; and when they choose to, it'll be because | they have some deeper knowledge which will make the | documentation appropriate to them. :import is primarily | for people who understand Java and the JVM. If you know | what you're importing, you will understand :import | quickly; if you don't know what you're importing, you | have no use for :import anyway. In the case of :use, | nobody needs :use; it is useful primarily to the people | who know why it is useful, and the documentation for it | is suitable for that audience. | | Getting started in Clojure is not _a nightmare_ , | ordinary people do it all the time, the fact that | somebody said it was a nightmare says very little. | | Clojure's mechanism for requiring packages is far from | byzantine, whether you "budge" on that or not; many | Clojure libraries have the snippet for including the | current stable release of that library at the top of | their README on GitHub. It isn't matter of "sticking with | it" or "figuring out something that works for you", it is | literally one relatively simple piece of knowledge that | is learned once and works forever. | | In short, if you find namespaces and importing byzantine | in Clojure, you are probably at the level of struggling | to write fizzbuzz in any language. The fact that there | are features other than :require in ns does not indicate | that :require is complicated, it just indicates that ns | has features. | doteka wrote: | And people wondered why Clojure is dying... | | Somehow a language designed from scratch with all the | purported wisdom of Lisp ended up with a nastier import | solution than JavaScript, which had none out of the box | for its first two decades of life, and then had to | reconcile as many as 5 different module systems. | microcolonel wrote: | Am I missing something here? The experience is basically | the same as the best available in JavaScript/TypeScript, | how is it "nastier" or even "nasty" at all? | | Also Clojure is doing just fine, not sure what you mean | by "dying". The core and the tooling continue to improve, | there are lots of libraries, more people writing than | ever. I just don't see this death you're describing. | | The comments here just strike me as ignorant and | incoherent as a whole. Why do people who clearly have no | experience actually trying to do something in Clojure | have so much to say about it? | | Clojure may support things that look daunting to you, but | if you actually had any goal other than critiquing the | variety of things you actually have no use for, you would | not have the difficulties you describe. | | Maybe I'm spoiled, I remember JDK setup being a pain on | Windows a decade ago when I used it last, if that's the | problem then I get it. My spoiled experience on a system | with a functioning package manager is basically install- | and-go, and zero configuration required to get CIDER | going after that. | | I just don't get what's so bad about it, it's basically | the same experience as Rust with Cargo; is _that_ another | "nasty" experience? What language with package manager | has a better experience? | [deleted] | [deleted] | tmountain wrote: | I like lightweight and fresh too, but the JVM and Node both | provide a tremendous amount of "batteries included" ecosystem | value. | doteka wrote: | See I get why you'd say that about the JVM, but as someone | working in Node daily I don't find the server side | JavaScript ecosystem particularly useful. As soon as you | need to do anything else than database CRUD, you're | basically on your own. | microcolonel wrote: | > _Easy to get started: one click install, great website and | concise docs._ | | Idunno, I read the whole homepage and I don't really know | where to go to download it. Is "clone and run Meson" what you | meant by "one click install"? | | > _No matter what some people say, getting started in Clojure | is a nightmare._ | | On my distro I just do pacman -S clojure and I have a working | clojure environment, on everything else it's usually | available as one package. Not much of a "nightmare" to my | eyes, at least when compared to Janet, which doesn't tell you | how to install it anywhere on the website. | [deleted] | pjmlp wrote: | Yet Clojure supports a subset of CLOS, so not so much overrated | after all. | dkersten wrote: | Clojure was never against any of the ideas in OO, just that | they should be accessible individually if or when they make | sense. Traditional OO is very "all in", while Clojure is very | a-la-carte use the bits that make sense for the problem you | are trying to solve. Clojure also encourages a data-over- | objects and a functional-first approach, but when you need | the OO features, they're there and you should use them. | junke wrote: | Just to clarify, CLOS is very a-la-carte too. | pjmlp wrote: | Even Smalltalk supports the other way around, although very | few are aware of it, because they never bother to learn it. | | You can do LINQ style coding in Smalltalk-80, and modern | Smalltalks like Pharo do support traits as well. | | So the point being that all major languages embrace both | paradigms. | | "Traditional OOP" basically boils down to Java until | version 8 or C# until version 3, and very little else, but | unfortunately most teachers fail at giving overviews of | programming languages thorough computing history, and many | just learn what they can reach out for. | dkersten wrote: | Well, yes, I should have said "popular OO" instead of | traditional. I did mean the Java's and C#'s, Ruby's and | Python's of the world, not the Smalltalks. | | > So the point being that all major languages embrace | both paradigms. | | Sure, nowadays, most languages are very much multi- | paradigm, but typically there is a dominant paradigm and | the others are somewhat second-class. For example, in | recent years, Java has gained a lot of functional | programming feature too, but its not in the same ballpark | as Haskell. | Stratoscope wrote: | Mobile-readable version of your list of Clojure design | decisions: | | - VMs, not OSes, are the platforms of the future, so target the | JVM | | - Object Orientation is overrated, but polymorphism is a good | thing | | - Multi-core is here to stay, so use immutable data structures | to greatly facilitate writing correct concurrent programs | | - Leverage the strengths of LISP but give it a modern overhaul | (most notably, throw in different parenthesis) | kleiba wrote: | My apologies, it was too late to correct my post when the | complaints started coming in. | | ...but then again, who reads on a mobile device anyway (j/k) | ;-) | aasasd wrote: | 'Starts up faster than Clojure' and 'doesn't need the | setup+compilation voodoo of ClojureScript' are pretty good | value propositions for lightweight runtimes. | blandflakes wrote: | On the VM front, I love the JVM, but a vast majority of | languages gaining popularity are generating static binaries. | GraalVM may help close the gap here. | | OO is overrated but most apps have some state and I found the | entity-component systems solid but not still unwieldy. | | Clojure has really great concurrency primitives; all the | semantics I could want built right in. Except my concurrency | often occurs in the persistence layer, and unless I'm also | writing that layer, Clojure can't help me. Persistent/immutable | data structures are amazing. | | The delimiters IMO are a vast improvement over most other lisps | (especially for creating specific data types). | | Clojure's startup time is pretty brutal for a lot of things I'd | like to use it for, and no amount of REPL-driven development | can make Clojure appropriate for CLI tools. | capableweb wrote: | > Clojure's startup time is pretty brutal for a lot of things | I'd like to use it for, and no amount of REPL-driven | development can make Clojure appropriate for CLI tools. | | If you got the repl-driven development down, you wouldn't | test your CLI by launching it, you would just evaluate the | same functions as the CLI uses. Only time when you'd want to | launch the CLI would be before releasing a build or for E2E | tests. Once you got the code down for your repl and the | startup time becomes a hassle, you compile down your Clojure | program to a binary with GraalVM and now it starts up fast. | | Otherwise, give babashka a try. Basically single-binary | Clojure environment. https://github.com/borkdude/babashka | blandflakes wrote: | It's not about testing, it's about using it. I know how to | use a REPL :) | | GraalVM simply is not production-ready, though I follow its | progress with great interest. That said, it's hard to | compare the process of integrating with GraalVM against a | language that actually just has fast startup. | | Babashka is pretty cool, but it's another example of | something that isn't quite Clojure. Nice if you can | tolerate various "almost the same" languages, but Clojure | itself is still weak in these domains. | slifin wrote: | Maybe check out https://github.com/borkdude/babashka if you | have bash script esque workloads | fnord77 wrote: | I think we'll see a flip back to VMs once we start seeing a | variety of architectures in production - ARM, intel, risc-v. | | Managing distributions for a bunch of different architectures | is difficult. | blandflakes wrote: | That would be interesting, though I wonder whether | containers will (sadly) be the answer there. | winter_blue wrote: | It's hard to read the bullet points on mobile -- can you remove | the indentation so it is formatted normally. | | Other than that, good points. | didibus wrote: | In that respect, Janet doesn't really bring anything very new. | Its just an alternative to Lua. Truth is, Lua had pretty few | alternative as it stands. When you need something small, fast, | to embedd. So Janet is a competitor there. | notRobot wrote: | Please don't use code blocks for quotes. It makes it very hard | to read text on mobile, narrow viewports or via screen readers. | kleiba wrote: | Sorry, I didn't even realize that it was a code block when I | wrote the post. | jonstaab wrote: | Janet's purported focus is that it's easy to embed in a larger | C program. I haven't really seen that in practice, but I have | used the C api to write some language extensions, and it is a | joy. In comparison with Clojure, I much prefer using either C | or janet to using Java and lisp side by side; with Clojure | running on multiple hosts now the differences in language | semantics between clj and cljs are just annoying. | | As far as language features, I miss a lot from clojure: | immutable/persistent data structures, protocols, not to mention | concurrency primitives. But Janet's approach to performance and | design is "do less". With the C api you can easily add bindings | to some C library that provides a desired feature. But even | without that stuff, Janet is for me a python-killer, if not a | clojure killer. | | Edit: at any rate, I think it's not meant to be a competitor to | Clojure, its similar syntax just often invites the comparison. | It's much more fair to compare it to Lua. | playing_colours wrote: | > _Janet 's purported focus is that it's easy to embed in a | larger C program._ | | There is Guile https://www.gnu.org/software/guile/ that is an | implementation of Schema with the focus on being an extension | language that integrates with C and C++. Wouldn't it more | practical to adopt and contribute to it, rather than invent | an own wheel? | justin66 wrote: | Janet uses an MIT license, so you've got a pretty big | divergence right there. | kerkeslager wrote: | I'm in no way associated with Janet, so I can't answer for | them. But as someone who is implementing their own language | which shares a lot of goals with Guile, the reason I didn't | contribute to Guile is that Guile is an implementation of | the Scheme Standard, and it bound at least loosely to that. | Certain modern features just aren't compatible and might | not be accepted if you go through the effort of | implementing them. There are real benefits to implementing | a standard, and I'm not criticizing Guile for doing that--I | use Guile. But if your goals aren't compatible with the | standard you have no choice but to go a different way. | desiderantes wrote: | Guile is more than a Scheme implementation. You can | implement a completely new language for it (somebody | recently did Python) and reuse their embedding | capabilities. Guile comes with an Ecmascript | implementation, just to show that it can be done. | kerkeslager wrote: | You can do that in most (all?) Scheme implementations. | Macros are powerful, yo. | | This goes back to another discussion here: just because | you've implemented a language doesn't mean you've | implemented it _well_. Sure, I can implement all the | syntax of what I want. But is it fast? Does it report | errors well? Am I enforcing my type system, or can I | accidentally drop back into normal Scheme? | | I think a lot of times new Lispers learn macros and, | drunk with their newfound power, start writing 20% | implementations that get them 80% to mature languages. | And if you don't need or want the other 20% of a mature | language, then that's fine. But if you _do_ need or want | the other 20% of a mature language, then you 'll quickly | discover that the Pareto Principle[1] applies. Lisp | metaprogramming can be super powerful, but it's not a | magic bullet: not only does it not kill werewolves but | you can shoot yourself in the foot with it. | | [1] https://en.wikipedia.org/wiki/Pareto_principle#In_com | puting | bakpakin wrote: | Author here. | | Firstly, this is a rather silly argument in general. One | could say that Embeddable Common Lisp and Guile address the | same niche and all developers from one project should | consolidate in the other. | | I have not used Guile to any extent, nor was Janet really | influenced by it, but the comparison has been brought to my | attention several times in the past. Janet is not scheme | nor common lisp, so there are of course many differences | that I cannot address here. However, as an extension | languages, there are several things that I believe Janet | does better than Guile. | | Guile is not an ideal extension language for C projects | (this is distinct from an extension language for GNU | projects). Firstly, they address garbage collection with | the Boehm GC, which takes some control over your runtime | and is not known for great performance (the runtime/non | standard C is the bigger issue). This was of course a | decision made by Guile devs to make it easier to write | correct bindings to C libraries in Guile, but it is not | without it's downsides. Secondly, the project is not easy | to embed in foreign build systems. Janet is more like Lua - | built in tracing GC that is not conservative nor platform | specific, no external dependencies beyond libc, and can be | added to a project as an amalgamation (a single C file and | 2 header files). This has enabled people to get Janet | running more easily on a variety of platforms like mobile | phones and even recently someone has been doing some work | on getting Janet running on the Nintendo Switch. I believe | Janet is also significantly smaller than even the smallest | build of guile. Basically, Guile is not simple, which is | (IMO) antithetical to an ideal extension language. | | At the same time, Janet should feel like a much less | minimal language compared to Lua. While core Lua limits | itself to pretty much only standard C, Janet goes a little | further to provide some abstractions over different | platforms (that can be turned off via compile time | options). | playing_colours wrote: | Thank you for elaborating on the reasons to create Janet! | | My argument can sound silly, particularly considering the | fact that you do not have any obligations to justify your | project that you opened for others. I am very thankful to | open source contributors, but I have a feeling that many | open source languages, frameworks, libraries, and desktop | environments would be more popular, polished, and | maintained, if we could compromise, tolerate, and control | our ego or creativity, and contribute to existing | projects. | | I think, we can see the benefits of focus and discipline | by comparing Rails and its gem ecosystem with "blossoming | thousand flowers" of Node.js web frameworks. | acrispino wrote: | It's not just silly. Sometimes this concern comes across | as scolding people for how they spend their free time. | jshevek wrote: | It looks like you may have inadvertently used the "block quot" | ML in your whitespace. It renders terribly on mobile. | mr_custard wrote: | Many people seem to be comparing Janet and Clojure here as if one | had to choose to use only one or the other. | | Most of my daily work is done in Clojure or ClojureScript and | that will continue to be true. However, I am excited by what I've | seen in Janet and I'm already thinking that I'd love to call this | from bash scripts to do system tasks (devops for example) that | don't need the JVM cranked up. | | I'm choosing both :-) | Koshkin wrote: | For those who would prefer a more traditional albeit possibly | less "lightweight" alternative there's always Embeddable Common | Lisp. | Sawamara wrote: | For what it's worth, the win x64 installer died on me at | "creating desktop icons", not exactly the most confidence- | inspiring start, but lets see again. | phoe-krk wrote: | janet:1:> (cons 1 2) compile error: unknown symbol cons | on line 1, column 1 while compiling repl janet:2:> (list | 1 2) compile error: unknown symbol list on line 2, column | 1 while compiling repl janet:3:> (vector 1 2) | compile error: unknown symbol vector on line 3, column 1 while | compiling repl | | I certainly need to learn the basic idioms of this dialect; it | looks nothing like Common Lisp under the hood. | pjc50 wrote: | Is it really Lisp without cons? | pull_my_finger wrote: | I can understand it's a traditional name, but maybe we can | appreciate that it's a new/stand-alone language and that | modern/expressive function names are an improvement and a | breath of fresh air. | phoe-krk wrote: | Yes, it seems so. Try the REPL available at the website. | oblio wrote: | I wonder if his question was not rhetorical, as in: It is | _really_ Lisp if it doesn 't have cons? | lispm wrote: | Is it really Lisp without 'lists'? | | https://janet-lang.org/api/index.html | | that does not mention list in meaningful ways. It seems | to prefer to work with other data structures (like | arrays) - which is okay, but then I won't call it a List | Processor dialect. | dleslie wrote: | I would say no: without list processing it's not really a | lisp. It's something that looks like a lisp, but isn't. | jonathanstrange wrote: | I don't understand why somebody downvoted you, I've seen | a number of languages that look like Lisp, but are based | on vectors or arrays, and that changes the language | drastically. So I'm wondering, too. I was trying to find | out whether Janet programs are lists or something else | like arrays, but didn't find it in the docs. | bakpakin wrote: | This does change the language drastically - source code | is represented as tuples usually, although all of the | core data structures have literal forms. This means | writing macros is still easy, although certain idioms | like consing are usually replaced by splicing, which is | like unquote-splicing in Common Lisp but more general. | hexmiles wrote: | as someone who dosen't know the theory what is the | difference between list and array? consing and splicing? | | is there a pratical difference in the way you write | programs or is more of theory/implemetation detail? | andrewflnr wrote: | What are the most prominent examples? I tend to think | that vectors are a better basis for a practical language. | phoe-krk wrote: | That question has been a source of multiple flamewars in | the past that have only made the world worse as a result. | I prefer not to go down that hole again. | alexkowalenko wrote: | Is it a lisp without car cdr and | cadaaaadmycateatsmiceadaddddr? | | Just in case - | | )))))))))))))))))))))))))))))))))))))) | [deleted] | dmos62 wrote: | I found this interesting so looked it up: | Janet 1.9.1-4ae3722 Copyright (C) 2017-2019 Calvin Rose | janet:1:> (array 1 2 3) @[1 2 3] janet:2:> | (tuple 1 2 3) (1 2 3) janet:3:> (rest (tuple 1 | 2 3)) compile error: unknown symbol rest on line 3, | column 1 while compiling repl janet:5:> (tail (tuple 1 | 2 3)) compile error: unknown symbol tail on line 5, | column 1 while compiling repl janet:6:> (car (tuple 1 2 | 3)) compile error: unknown symbol car on line 6, column | 1 while compiling repl janet:7:> (cdr (tuple 1 2 3)) | compile error: unknown symbol cdr on line 7, column 1 while | compiling repl janet:8:> (def t (tuple 1 2 3)) | (1 2 3) janet:9:> (def a (array 1 2 3)) @[1 2 | 3] janet:11:> (drop 1 t) (2 3) | janet:12:> (drop 1 a) (2 3) janet:13:> (first | t) 1 janet:14:> (first a) 1 | rcarmo wrote: | Janet is quite nice, and I was playing with it only the other | day: | | https://taoofmac.com/space/blog/2020/05/10/1300 | | However, nobody here seems to have mentioned Joker, which is a Go | interpreter/linter for Clojure: | | https://joker-lang.org/ | | I'm rather torn between Janet and Joker, but am considering using | Joker instead (even though it is single-threaded and lacks SQLite | support) because it's closer to Clojure syntax. | dleslie wrote: | I'm not really clear why I would use this and not one of the | small embedded Schemes that have srfi-18 support. | | Chibi and S7 are both "drop some C into your project" levels of | trivial to get running, and reasonably zippy. | | And there's an upgrade path by using the standard: you can move | to Chicken, Gambit, Guile, Racket or Chez and keep your code. | emmanueloga_ wrote: | I'd love to hear more from the author (can someone interview him | for a podcast please? :-). He also has another programming | language called Fennel [1] which compiles a lisp like language to | Lua. | | Both Fennel and Janet seem to orbit around Clojure ideas.... | interestingly one of Fennel's main contributors [2] is also the | author of Clojure's most popular build system, Leiningen. | | 1: https://fennel-lang.org/ | | 2: https://technomancy.us/186 | aasasd wrote: | I kept thinking that in the 'small scripting Lisp' category, a | startup-time/performance comparison with Fennel would be | apropos, as the latter is blazingly fast and thus well suited | for scripting in interactive contexts. | eggy wrote: | I like it, and I am considering using it as a scripting language. | | It was clear and easy how to build it for my Windows 10 box, and | it is relatively small. | | I have always like the small Lisps like PicoLisp, but PicoLisp is | not Windows friendly; it's very POSIX-dependent. I haven't had | great experiences with Cygwin. PicoLisp works on WSL/WSL2 though. | OmegaBlight wrote: | Did you find the transition to be relatively easy on you? I am | considering building a few W10 Box with it. ___________________________________________________________________ (page generated 2020-05-13 23:01 UTC)