News for hackers. Stuff that matters.

flavio81

>The end state of every garbage collected language is a suite of tools to prevent garbage collection at all costs. >I think we can learn something here.

You're making two mistakes here:

1. Confusing "no allocation" with "avoiding the garbage collector". In non-GC languages like Rust or C there are instances you want to avoid allocation too.

2. Being oblivious that in the past many GC'd languages also had mechanisms for circunventing the garbage collector. Since long, long, long ago. Common Lisp for example (1981-). This is not a modern "realization" or "revelation".

Re:Pharo 14 on Monday October 26, 2026 @11:30AM (#50245450)
>Intuitively it seems like a match made in heaven, since the agent can directly manipulate the running program

This should be a BIG benefit for agent-driven development, but sadly it seems that few people is taking advantage of it.

Re:Pharo 14 on Monday October 26, 2026 @11:29AM (#50245430)
This is exciting news, and I would like to say "hello" to Richard Kenneth Eng, the sole user of Pharo in the world.
A requirement for functional programming is that there's no action from a distance, thus, functions should not modify variables outside of their scope.

This doesn't exactly mean immutable data structures are mandatory, but it helps.

In any case, most of the functions that operate on data structures in Lisp (or Common Lisp) do it in an immutable way.

PSA: If you need a Lisp that talks to C++, Common Lisp has had seamless C++ interop in the few years thanks to the CLASP implementation. It should be fairly mature by now, I understand it was born to be used in serious projects.
Re:Liskell – Haskell Semantics with Lisp Syntax [pdf] on Tuesday December 16, 2025 @07:13PM (#46296576)
>Coalton strives to implement Haskell or ML-adjacent semantics (in the type system, for example) with Lisp syntax. "With" here meaning that it is both implemented in and written with Lisp syntax.

Not exactly. Coalton brings ML-style strong typing to Common Lisp. But Coalton code is also Lisp code.

The backend, thus, is Common Lisp, and it is available at all times, thus leveraging all its power.

Re:The Unix-Haters Handbook (1994) [pdf] on Monday August 25, 2025 @12:30PM (#45015638)
>No multithreading, I/O locks under GNUs/eww, glacial slow

All this would not happen if RMS had chosen Common Lisp to implement it...

Re:The Unix-Haters Handbook (1994) [pdf] on Monday August 25, 2025 @12:28PM (#45015618)
>It’s really interesting reading about LISP machines but no-one’s building a new one

There have been two open source Lisp Machine OS created in the last 15 or 10 years.

However a big part of the power of the Symbolics/LMI machines was in the software itself (applications), and this is still propietary code.

To reimplement the Lisp Machine applications would take quite a big effort.

Re:SmallJS: Smalltalk-80 that compiles to JavaScript on Monday August 25, 2025 @12:27PM (#45015605)
>SmallJS is file based, not image based, so you can develop in your favorite IDE

This project is nice, however if we don't have a specific, client-side IDE for interactive development, 70% of the power of Smalltalk is gone (one of the criticisms I give to Ruby)

How would one do to push changes to the web frontend (browser) without stopping the program ?

Re:Pseudo, a Common Lisp macro for pseudocode expressions on Thursday August 07, 2025 @06:49PM (#44831364)
One could easily implement an Emacs (SLIME) plugin to "macroexpand" the (pseudo) expresion to real (concrete) Lisp code, and even to try again until the implementation satisfies you.

Then it becomes a concrete Lisp implementation and thus not unpredictable anymore.

Re:Initialization in C++ is bonkers (2017) on Friday May 16, 2025 @07:22PM (#44010686)
>I want C++ do exactly and only what the programmer specifies

Good luck with that.

Re:Layered Design in Go on Tuesday April 22, 2025 @11:30AM (#43763347)
Add Common Lisp to the list. And even Scala has fast compile times today.
Re:Show HN: Lux – a luxurious package manager for Lua on Tuesday April 22, 2025 @11:14AM (#43763198)
>Lisp killer features were GC, good data representation, first class functions.

Lisp's killer feature is procedural macros that are extremely easy to write and debug.

Lua doesn't have such a thing, that's why Fennel was created.

Erlang also doesn't have such a thing, that's why LFE was created.

Re:Show HN: Lux – a luxurious package manager for Lua on Tuesday April 22, 2025 @11:13AM (#43763179)
>To whoever down-voted me, please do explain how HMRs are comparable to Erlang's true hot code swapping or even Lisp's live redefinition.

based

Re:Blacksmithing and Lisp on Thursday April 10, 2025 @09:08PM (#43649448)
Exactly. A post full of bollocks.
Re:Rsync replaced with openrsync on macOS Sequoia on Tuesday April 08, 2025 @10:59AM (#43622554)
>As one of the authors of the Unix Haters Handbook

One day, one remote day, mankind will attain Reason and will award you a Nobel Prize for speaking out loud against retrograde computing.

I salute you, hero, veteran.

Re:Rsync replaced with openrsync on macOS Sequoia on Tuesday April 08, 2025 @10:55AM (#43622515)
Correct. The Unix philosophy is based on hagiography.
Re:"Normal" engineers are the key to great teams on Friday March 14, 2025 @12:32PM (#43364258)
>Easy to prove, can you think of an engineer that adds negative value?

Yes, i have many examples. Two of them I personally fired. One of them, I should have fired much early. I let this engineer basically add negative value by trying to make his peers (other engineers) finish the work it was delegated to him, thus creating negative value by preventing the other, highly productive engineers, to do their tasks.

I warned him not to do this, but he didn't heed. Sadly due to Human Resources the firing process took way too long. I should've acted earlier.

Re:"Normal" engineers are the key to great teams on Friday March 14, 2025 @12:26PM (#43364186)
>When did IEEE become host to clickbait nonsense? This whole take feels like an editorial by a junior engineer going off vibes.

Exactly.

I think i'll never click on an IEEE Spectrum article again.

IEEE has jumped the shark.

Re:"Normal" engineers are the key to great teams on Friday March 14, 2025 @12:25PM (#43364175)
So, you think productivity or even quality can be measured in "amount of lines of code produced".

Which is completely wrong.

Re:"Normal" engineers are the key to great teams on Friday March 14, 2025 @12:22PM (#43364147)
100% based.

Indeed this is one of the hard problems for a manager.

+1, it is my go-to language whenever I have no idea how complex the task will get
You´d be surprised.

In the 1980s, complete workstations were written in Lisp down to the lowest level code. With garbage collection of course. Operating system written in Lisp, application software written in Lisp, etc.

Symbolics Lisp Machine

https://www.chai.uni-hamburg.de/~moeller/symbolics-info/fami...

LMI Lambda http://images.computerhistory.org/revonline/images/500004885...

We're talking about commercial, production-quality, expensive machines. These machines had important software like 3D design software, CAD/CAM software, etc. And very, very advanced OS. You could inspect (step into) a function, then into the standard library, and then you could keep stepping into and into until you ended up looking at the operating system code.

The OS code, being dynamically linked, could be changed at runtime.

>The concept of compile-time programming having the same appearance as runtime programming is very cool in my opinion.

You mean, something that Lisp does since the early 1980s?

Re:Why Clojure? on Monday February 24, 2025 @04:24PM (#43165105)
>That means that a field called "date" can be either a string, integer days since the epoch or a Java Date, and (because this codebase isn't great) there's no way of knowing without tracing the call stack.

But this is because JSON is an untyped data structure. (And btw, a flawed one...)

You would have this problem in any programming language.

Re:Why Clojure? on Monday February 24, 2025 @04:21PM (#43165071)
>How did they adapt to dynamic types?

You mean dynamic typing, I understand.

Clojure (and Common Lisp) is strongly typed, so if you expect type A and you give a value of type B, an error will be raised.

On Common Lisp, which is an interactive development language, you just inspect the stack frame where the error was raised, find the problem, correct the code, recompile your function (while the code is running), and "restart" the stack frame, so the execution continues (without having to restart or redeploy everything and try to replicate the bug). Thus, it is no big deal at all.

On Clojure i'm not so sure how extensive is the interactive support. But there is "spec", which can help.

Re:Why Clojure? on Monday February 24, 2025 @04:11PM (#43164982)
> runs on the JVM, access to any Java or Python library within Clojure without wrappers

If you already like Common Lisp, ABCL (Armed Bear Common Lisp) is a mature fully ANSI Common Lisp-compliant implementation, that runs on the JVM and can instance or load Java classes or call Java methods without wrappers and in only one line of code.

> the best out-of-the-box concurrency story of any language I know of

Lots of concurrency models also available on Common Lisp, including async, channel-based, etc.

> Only lists are actually functional, concurrency is YOLO-tier, etc.

I'm sad you had that experience, but there is tons of solid concurrency support in Lisp, for example lparallel is awesome.

Clojure is nice as a JVM language alternative, that is, better than Kotlin, Groovy, etc.

However the loss of the great interactive development facilities that Common Lisp has is a major, major downside. Interactive development is what makes CL (and also Smalltalk/Pharo) great.

Re:Racket Compiler and Runtime Status on Wednesday January 27, 2021 @04:58PM (#25934582)
> Clojure uses Leiningen which runs on top of Maven to automatically retrieve libraries, it works very well.

In the same way, Common Lisp uses Quicklisp, which runs on top of ASDF to automatically retrieve and compile libraries. It works very well.

Re:Ask HN: I want to start learning Lisp. Where do I begin? on Thursday December 17, 2020 @05:00PM (#25461086)
>Otherwise, Clojure is an excellent language which both modernises Lisp syntax significantly and implements a very well thought out standard library for doing functional programming. There are many great features, but the standout ones are probably the persistent data structures (which syntactically act both as data structures and functions) and parallelism/concurrency support. It's also very natural to do interop with the host platforms (Java

Absolutely everything mentioned above in this quote is available in Common Lisp as well by just loading the needed libraries.

>Another issue has to do with startup time. The Clojure application bootstrap process is relatively slow, i.e. start-up might take 1 second,

>The main issue with Clojure is probably its tight integration with the various host platforms. When you get a stack trace in Clojure/ClojureScript, you basically get a Java or JavaScript stack trace, so there is some expectation of familiarity with the host platform.

Correct. And there are no such problems in Common Lisp. Except if you want to execute CL in a JVM, in which case the available implementation, ABCL, does take a slow time to start. Otherwise it's a great implementation.

Re:Ask HN: I want to start learning Lisp. Where do I begin? on Thursday December 17, 2020 @04:57PM (#25461048)
>I do this all the time with Clojure at work. I will have my application running (web app) with two repls in emacs. One is connected to the ClojureScript repl and one to the Clojure repl. I am able to make changes to both front end code and back end code on the fly by changing a function and then evaluating the function into the repl

But since you can't arbitrarily inspect and restart any start frame, you don't really get the interactive programming experience.

On CL, for example, when you hit a runtime bug that is uncaught, you get the debugger window which shows not just the "stack trace" but the complete stack FRAMES that you can inspect. So let's say deep down you find where the error originated and the states of the variables.

You can then jump to the definition of the offending function, edit the function, recompile it, (optionally) change any variable on that stackframe, and then continue the execution by restarting specifically at that stack frame.

In this way, the feature of "modify a function while the code is running" becomes way more meaningful. The program evolves as it runs, as if it were a lifeform.

Older »