Hacker Newsnew | past | comments | ask | show | jobs | submitlogin

How about monkey patching in languages like Javascript and Python?

I'd also say "homoiconic" is a less important concept than people would think. A while back I was writing a lodash-like library for Java because I don't like the Streams API (though in the end I just used the collectors from the Stream API because they were easy to fit into my system) One thing I found frustrating about that was that I didn't want to write 8 different functions for the 8 primitive types (never mind 64 functions for the direct product of the primitive types) and conceived of a code generator that would let you write Java-in-Java with a somewhat Lispy looking API that builds up something like S-expressions with typed static imports, here is some sample code

https://github.com/paulhoule/ferocity/blob/main/ferocity0/sr...

The plan was to write a ferocity0 sufficient to write a code generator that could generate stubs for the standard library plus a persistent collection library, then write most of ferocity1 in ferocity0 and maybe write a ferocity2 in ferocity1 and ferocity2 would be the master tool for code generation in Java. Look how nice the stub generator is

https://github.com/paulhoule/ferocity/blob/main/ferocity0/sr...

Now many people would think this combines all the drawbacks of Common Lisp and Java and they might be right. On the other hand, I think if you're aggressive in organizing your code and using code generation you might cut your code volume enough to make up for the bulking that happens when you write Java-in-Java. The stubs to write Java-in-Java are a huge amount of code but they're 99% generated and once you have Java-in-Java you can keep recursing and messing around with quote and eval and do all the stuff you'd do in a homoiconic language except you are having to write code in a DSL.



I glanced at your code examples and it looks quite similar to ByteBuddy[0], a Java library for manipulating JVM bytecode.

[0]: https://github.com/raphw/byte-buddy


Now suppose three of you are working on the same project, and each brings their own code generator like this.

You can take Common Lisp macros from multiple sources and use them in the same expression, in any pattern of nesting.


In principle. Most people find somebody else's metaprogramming-heavy Common Lisp difficult to work with. When you look at classic programs from the golden age of AI you find they either rewrote their Lisp prototype in C++ for speed or the Lisp program (like an expert system shell) is much smaller than you imagine possible but it looks like the engine of a UFO.


Though I've only seen other people's Lisp projects online and in books, I haven't seen metaprogramming that made it less readable - usually, it makes the program more readable. At most, it defines a DSL, e.g. COMFY 6502, which is a thin wrapper over 6502 assembly implemented as a DSL in Emacs Lisp. But most of the time, macros provide a readable interface over a bunch of hard-to-understand boilerplate generated code.

[0]: https://dl.acm.org/doi/pdf/10.1145/270941.270947


Right. The reliable reference point for comparing the program with macros is the same program in which the macros have been expanded.

Comparing it to some completely different, nonexistent program which solves the same problem without macros is fallacious.


> Most people find somebody else's metaprogramming-heavy Common Lisp difficult to work with.

Citation needed. Org names, projects, numbers.

Also, how easy do people find someone's Java metaprogramming? Where the whole metaprogramming system is locally invented, not just its application to the problem?


Do you have a link to one of these UFO engines that I can study up on?



That code looks readable to me. It is well formatted and the functions are small, with simple control paths. No variable assignments or loops to unravel.

It defines no macros, but refers to some defined elsewhere; the instructions say you are supposed to use a certain other source file related to Chapter 14 of a book.

I could probably ramp up on this in a day, if I had reason to.




Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: