Do you have some example code you’ve written that you feel uneasy about?
Do you have some example code you’ve written that you feel uneasy about?
The development of a program is very incremental, immediate, and interactive. The idea of the editor and the program begin to blend. The cycle type between observing program behavior and changing program source is trivialized and almost not even noticeable. In the end it allows you to converge on ideas very, very rapidly. Programming in other languages/environments feels like having asthma.
The problem is that describing this never really makes sense.
You won’t get “the Lisp experience”, which is the killer feature to many, but yes you can.
You’ll be able to essentially replace it with DEFMACRO, but it’s not 100% equivalent to do EVAL+APPLY. But the core idea is all the same: write code that creates valid S-expression forms.
INTERNED-GENSYM is there just to make code easier to read and type, because using uninterned symbols #:LIKE-THIS are moderately tricky to get the hang of. It is not advised to ever actually use INTERNED-GENSYM because every macro expansion is going permanently allocate memory for new symbols, and these will never get garbage collected.
At a higher level, the EVAL+APPLY way of doing things means that the lexical context (like previously bound variables) can’t be used, and all invocations of EVAL happen at run-time (not compile-time) so it would be excruciatingly slow.
lisp has been just about to die for longer than many programming languages have existed.
it’s a very robust language with great documentation and implementations, and there are still lisp jobs out there paying money to write cool software.
We’ve done a couple rounds of hacking on Maxima and running Lisp from Lisp at HRL for some scientific studies… haven’t been able to converge on something we want to maintain yet though.
Due to its age and conservatism, Maxima is pretty gross to wrangle. Lots of patchwork loading logic, lots of global state, casual hijacking of the debugger, extreme sensitivity to the order in which this global state is mutated, fragile tests, casual use of CL-USER for critical functionality, single global package, auto-loading system, etc. All of these things are surmountable, but you get a Maxima that you can no longer track with upstream changes easily. And Maxima upstream’s maintainers don’t want to touch any part of Maxima that ain’t broke for their application users.
Uncertainty != quantum.