Top
Best
New

Posted by yacin 9 hours ago

Why Janet? (2023)(ianthehenry.com)
373 points | 187 commentspage 3
6LLvveMx2koXfwn 9 hours ago|
Maybe needs a (2023) in the title?
hlude 5 hours ago||
The shell DSL is what made me want to try Janet
veqq 3 hours ago|
We recently migrated to a standard library version: https://janet-lang.org/1.41.2/spork/api/sh-dsl.html
gspr 9 hours ago||
The embeddability sounds very appealing. Does anyone have experience with using this somewhere one might traditionally reach for Lua?
xigoi 8 hours ago|
I have built a markup language with embedded scripting in Janet. I originally tried to use Lua, but found the verbosity extremely frustrating.
boltzmann64 5 hours ago||
if those are the reason why you love janet, then you will love tcl because you will be able to do all the same things without drowning in parenthesis and weird syntax.
sph 2 hours ago||
There are three languages worth learning that expand your mind: Lisp, Forth and Tcl. Despite all exhibiting homoiconicity, they couldn't be more different from one another.

(I'd include Rebol but it's as mind-blowing as it's dead technology from a lost timeline)

WalterBright 4 hours ago||
Dammit, Janet, I love you!
IshKebab 9 hours ago||
Pretty compelling, especially "Janet does not adhere to the ancient customs. CAR is called first. PROGN is called do. LAMBDA is fn, and SETQ is def." - a sign of good sense for sure!

How fast is it?

Also my main objection to Lisps is still the horrible bracket syntax. Yes it's unambiguous and easy to parse, but it's HORRIBLE to read and edit. I wish this project had been a success (or something similar to it): https://readable.sourceforge.io/

Also I don't think static typing is really optional for me at this point.

adrian_b 7 hours ago||
Actually not all those are ancient customs, and not all that Janet uses is newer.

In the first description of the language LISP, from March 1959 (AIM-008), John McCarthy had used the names "first" and "rest", instead of what later will be called "CAR" and "CDR".

The names of "CAR" and "CDR" appear to have come from the students who worked at the practical implementation of the LISP interpreter on an IBM 704, and unfortunately we have remained stuck with them, like also with other features that were intended only for a temporary use, until being replaced in the "final version" (which was abandoned).

setopt 9 hours ago|||
> Pretty compelling, especially "Janet does not adhere to the ancient customs. CAR is called first. PROGN is called do. LAMBDA is fn, and SETQ is def." - a sign of good sense for sure!

Just FYI, many of these are also done in Scheme and its derivative Racket. They kept lambda (but even Python did that), but progn -> begin, setq -> set!, car -> first, and so on.

> Also my main objection to Lisps is still the horrible bracket syntax. Yes it's unambiguous and easy to parse, but it's HORRIBLE to read and edit.

I have pretty mixed feelings at this point. I don’t mind it for normal programming, but when I do numerical programming (physics models, etc.) you often get extremely long and verbose expressions that are IMO difficult to parse compared to the math-like infix operator notation used in other languages.

aeonik 9 hours ago|||
I'm starting to prefer the s expression syntax when dealing with tree structures like json.

I wonder if we were raised on tree based algebra if math would be easier to do, or harder.

Like, solve for x.

   (= (+ (* 2 x) 3) 11)
   (= (* 2 x) (- 11 3))
   (= (* 2 x) 8)
   (= x (/ 8 2))
   (= x 4)
Though this isn't too bad.

    (= (+ (pow x 2)
          (pow y 2))
       (pow r 2))
setopt 6 hours ago|||
I think also a lot of my objections could be worked around if one simply had a "math" macro that evaluates infix math notation as a DSL, similarly to how the CL "loop" macro does a DSL for iteration.

Perhaps this exists already somewhere?

veqq 1 hour ago||
> exists already

The helloworld of macros lets you do `(infix 1 + 2)`:

    (defmacro infix [a op b]
      ~(,op ,a ,b))
A useful one with precedence letting you to `(infix 2 + 4 * 5)`:

    (defmacro infix  [& toks]
      (def prec {'+ 1 '- 1 '* 2 '/ 2 '% 2})
      (var pos 0)
      (defn climb [min-p]
        (var left (toks pos))
        (++ pos)
        (while (>= (get prec (get toks pos) -1) min-p) # nil/operand -> -1, stops the loop
          (def op (toks pos))
          (++ pos)
          (set left ~(,op ,left ,(climb (inc (prec op)))))) # inc => left-associative
        left)
      (climb 0))
But ultimately, APL notation is best: https://git.sr.ht/~subsetpark/jnj
setopt 6 hours ago||||
I definitely prefer s-exps over both xml and json myself too!

Interesting question. Much of the difficulty does stem from mentally translating back and forth between conventional notation and s-exps too, since you can’t really avoid the standard notation when reading and writing math and physics papers. And current-day math and physics notation has been optimized to some extent for the infix notation; perhaps one would have invented more expressive higher-order functions or macros to denote s-exp math if that was what everyone used for centuries.

krupan 5 hours ago|||
If you ever used an RPN calculator then this is very familiar
tmtvl 4 hours ago|||
All programming languages have horrible syntax (except maybe Forth). Some examples:

Statements are terminated by either a dedicated graphical character, in which case it's easy to forget the character and have a problem, or by a newline (or maybe a different white space character, but I haven't encountered that yet) in which case decent formatting of code may require a dedicated graphical character to indicate that the newline DOESN'T terminate the statement, in which case we have the same problem. Having newline-terminated statements without continuation character would be consistent, but would hamper readability because identifiers would need to be strictly limited in length to keep certain lines from exceeding available screen space (or alternatively readability would suffer from lines only being partially readable).

And that's before getting into the weeds of how mathematical notation is tricky (most people have learned infix notation at maths class in school, so they mightn't appreciate how horrible it is), how different types of brackets (round, square, curly) can have inconsistent semantics, the downsides to the various ways of indicating lexical blocks (brackets, white space, keywords,...), et cetera.

The ideal programming language would probably be one which allows switching between different syntaxes based on what works best for the user (for example, someone could write code in S-expressions, another person could have that code automatically translated into SRFI-119 Wisp expressions and work with it like that, a third person could then have it rendered into something more Lua-like,...). Which is something I think the Racket people are working on, but I may be mistaken.

graemep 9 hours ago|||
Syntax is not that important to me. I prefer Python style indentation, but its really not that important - its just something to get used to for me.

Is static typing that important for a scripting language? From the intro to the book:

> And to be clear, I’m not going to try to convince you to bet your next startup on Janet, or even to use it in any sort of production setting. But I think it’s an excellent language for exploratory programming, scripting, and fun side projects.

packetlost 4 hours ago|||
It's a scripting language, so it's not going to compete with anything compiled or JITed, but it has a pretty efficient threaded bytecode interpreter (that is almost more interesting than the language itself!). It's certainly good enough for most situations where you would reach for a scripting language.
IshKebab 1 hour ago||
AoT/JIT compilation is a property of the implementation, not the language.

It would be good to know order of magnitude anyway. Like, are we talking Ruby/Python level, etc.

veqq 1 hour ago||
In my tests, it's 5-10x Python for long running things (about 30% slower than Fennel on LuaJit) but for small things, because you can easily shift work to compile time, it beats normal Go: https://codeberg.org/veqq/verse-reader#performance
xigoi 8 hours ago|||
> Also my main objection to Lisps is still the horrible bracket syntax. Yes it's unambiguous and easy to parse, but it's HORRIBLE to read and edit.

I use Parinfer, which allows me to edit Janet as if it was an indentation-based language.

IshKebab 7 hours ago||
Yeah I mean I guess if you have to use that syntax, it's nice to have a better editor for it. But IMO the existence of that tool clearly demonstrates that the syntax is pretty bad.
adrian_b 6 hours ago|||
All C-derived languages (e.g. Java and Rust) have a bad syntax, with tons of superfluous parentheses and many other superfluous tokens, like semicolons or commas.

This normally matters very little, because a good editor will always insert a complete template whenever you type something like "if", "for", "while" etc.

Most programmers are blind to the syntax defects with which they are accustomed and they notice only the syntax defects with which they are unfamiliar.

I would prefer a language with a good syntax, but unfortunately which programming languages have survived in widespread use has a poor correlation with the technical qualities of a language and especially a really negligible correlation with how good its syntax was.

imtringued 6 hours ago|||
Most editors manage your indentation, parentheses and braces for you. Not sure how that is a unique marker for lisp style languages.
zelphirkalt 7 hours ago|||
Out of those renames, I agree with car->first and progn->do. setq is ugly, but I think using def is maybe questionable. lambda I would have just kept the same.
ux266478 5 hours ago|||
> How fast is it?

Roughly as fast as puc-rio Lua. It won't blow your socks off, but it's more than respectable.

e12e 8 hours ago||
Are you aware of:

https://docs.racket-lang.org/sweet/index.html

netbioserror 6 hours ago||
Janet is ALMOST an incredible tool...but what I want is a very clear bifurcation between the standard library's stateful mutating procedures, and stateless value-returning functions. I ran into that wall hard trying to make something non-trivial.

It also turns out that the mix is due to the standard library leaning on raw C loop iterations underneath whenever it can. Which is great! But it confuses the library's interface paradigms.

anthk 8 hours ago||
Luxferre.top has some Janet based softwrae.
makach 8 hours ago|
Excellent. Although I suspect the author of the programming language invented this Janet for all the perfect puns. Yes, Janet. No. Janet.
More comments...