This article gives three examples of alleged antimemes: Lisp, entrepreneurship, and "stream entry". What it doesn't give is any good reason to think that they are antimemes. (I take it "antimeme" here means something stronger than "thing whose advantages aren't very obvious" or "thing that's unusual".)
I think Lisp is widely ignored not (only?) because it's an antimeme but because
One other thing that maybe helps Lisp stay relatively obscure, its unusual syntax, does have something of the antimeme about it. At first glance the syntax looks horrible, and that makes it hard to see much else about the language until you've put in a little effort.
I don't think entrepreneurship is widely ignored at all; I think it's very widely admired. Still, most people aren't entrepreneurs; I think that's just plain ordinary risk aversion. (And maybe recognition that successful entrepreneurship requires skills and personality traits that not everyone has.) In any case, entrepreneurship is very far from being invisible in our culture.
(I don't know enough about Buddhism, meditation, altered states of consciousness, etc., to have any useful opinion about whether "stream entry" is an antimeme.)
So what allegedly makes these things antimemes, in lsusr's view? I'll hazard a guess: they are things whose merits seem clear to lsusr but that are widely neglected by others. I suggest, though, that this characteristic doesn't pick out something special about those things. People are just really bad at seeing the merits of things they aren't already in favour of. I'll give a few examples.
You are correct that I don't give "any good reason to think that they [Lisp, stream entry and entrepreneurship] are antimemes". Thank you for your thoughtful response. This kind of quality feedback is why I post on Less Wrong.
So what allegedly makes these things antimemes, in lsusr's view? I'll hazard a guess: they are things whose merits seem clear to lsusr but that are widely neglected by others.
Good guess, but that's not quite what I mean by the word "antimeme". An antimeme is a meme whose information content provokes a self-suppressing response. In Lisp, this comes not from its nicheness (though nicheness is often a prerequisite) nor its syntax (though this helps keep Lisp unpopular) but rather from the defmacro
operator.
Programming languages are distinguished from each other by their syntax. A programming language's syntax is defined by its macros. Macros are the parts of a programming language you can't write your own of. For example, Python's if
and not
are macros. You can't write your own ifnot
macro to abbreviate if
and not
because you're not allowed to write your own macros. You're only allowed to write functions and variables.
In non-Lisp programming languages, macros are set in stone like a processor's instruction set. Lisp is unique because it lets you define new macros with defmacro
. Comprehending Lisp equals unlearning all the antipatterns you acquired from working from a tiny set of immutable macros. Defmacro is an antimeme due to an extreme case of the Blub paradox. The more rigid your understanding of computer science is, the harder it is to understand why Lisp matters because a conventional computer science education assumes macros are immutable. It's this mountain of unlearning that makes Lisp an antimeme.
Stream entry is about unlearning self, attachment and object permanence.
Entrepreneurship means unlearning subservience.
To comprehend an antimeme you must unlearn information. The brain's resistance to unlearning things suppresses the antimeme. But this a different kind of unlearning than replacing false facts with true facts. Error correction replaces facts with facts. Antimemetic unlearning is about replacing a fact with an equation. But not just any equation. Antimemes force you to generalize in a direction orthogonal to everything you know. It's about replacing a specific equation with a general equation.
If all your experience belongs to a specific case then your specific model of the world is the best model according to Occam's razor. The antimeme's model of the world adds complexity without improving your model for the data collected so far. The antimeme would describe your data better if you had data outside your special case but you won't collect that data until after you absorb the antimeme. This circular reasoning creates a chicken-and-egg problem.
I don't think entrepreneurship is widely ignored at all; I think it's very widely admired.
Once again, that's an excellent point. I should have been more specific. The idea of startups as something "someone else" could do is not an antimeme. The idea of startups as something YOU (assuming you're a programmer) could do is an antimeme. Many people could found profitable startups but have dismissed the idea without having performing a careful analysis.
I remain unconvinced that Lisp's macro facilities are antimemetic. I am not sure exactly how to divide up my disagreement between "it's not antimemetic, it's something more mundane" and "I don't think you should use the exotic-sounding term 'antimeme' for something so mundane" because I am not exactly certain where you draw the boundaries of the term "antimeme".
At any rate, I think the main reasons why Lisp isn't more popular are fairly mundane and don't need an exotic-sounding term to describe them. I think (though I confess I don't have solid evidence) that:
So if Lisp is tragically underused then some of the tragic underuse will be the result of defmacro (and also, I suggest, set-macro-character and set-dispatch-macro-character) being underappreciated, but I find it very hard to believe that it's a large fraction. And even that doesn't all qualify as antimemetic in the sense of "provoking a self-suppressing response", again unless you're meaning that so broadly that it covers everything whose merits are easy to underestimate. If someone is (say) used to C-preprocessor-style macros, and hears that expert Lisp programming makes a lot of use of macros, and imagines a codebase full of #defines, are you calling that antimemetic? Or if they don't jump to that conclusion but do think something like "hmm, macros aren't really all that powerful, so a language where macros provide a lot of the power must be pretty weak", are you calling that antimemetic?
I think the mental process you have in mind is different from both of those, because you're taking "macro" to include e.g. C's "if" and "for", even though those aren't implemented with any sort of macrology in C, so the reaction you're describing is more like "these people say that in Lisp you can redefine the language itself, but that doesn't make any sense". Again I have no concrete evidence, but I don't think that's a common reaction. After all, C does have macros (of a sort) and you can use them to extend the language (kinda), and users of Ruby, which is at least mainstream-ish, are used to using and making what they call "domain-specific languages" within Ruby even though what you can do there is fairly restrictive compared with Lisp's macros.
I think you're overdramatizing how people react to Lisp. "Lisp is an antimeme!" makes a great story, but I don't think it fits the evidence as well as "Lisp is unfamiliar in various ways, and people are bad at seeing the merits of unfamiliar things".
... Again, unless that or something like it is actually all you mean by "antimeme".
It seems, at least some of the time, as if you're using the term to describe anything whose widespread appreciation is limited by the fact that widespread beliefs or habits of mind get in the way. (Assuming that programming languages can't have adjustable syntax; seeing a clear boundary between one's self and the rest of the universe; being willing to have a boss and do what they say.) With that definition, I'm still not sure Lisp counts (as I said above, I think there are other reasons why many programmers don't use Lisp, and they aren't all antimemetic even in this very broad sense), but there's certainly a case to be made that it does -- but to me, "antimeme" doesn't seem like an appropriate term, for two reasons.
For example, Python’s if and not are macros. You can’t write your own ifnot macro to abbreviate if and not because you’re not allowed to write your own macros.
Here's how you do it with the C preprocessor.
#define ifnot(x) if(!x)
You can apply this trick to any language with a textual representation, since preprocessing is a separate stage.
Pedantic note: you should do
#define ifnot(x) if (!(x))
(with extra parens around the second instance of "x") because otherwise you will get probably-unexpected results if x is something like a==b.
I considered putting in a footnote acknowledging the existence of this kind of textual macro in languages like C and Bash. Demonstrating the uniqueness of defmacro
requires a more sophisticated example, like embedding Haskell.
Edit: I replied to the wrong comment. This was supposed to be a reply to TAG's parent comment.
I considered putting in a footnote acknowledging the existence of this kind of textual macro in languages like C and Bash. Demonstrating the uniqueness of defmacro
requires a more sophisticated example, like embedding Haskell. Even if you can do this in C, you shouldn't.
You shouldn't do this in C.
I was being a bit tongue in cheek about the macro thing. You can apply macros, in the sense of a preprocessor expanding text, to anything.
Defmacro isn't unique,but not just because of preprocessors. Less vaunted languages such as Forth can also define fundamental new keywords.
The uniqueness claim, apart from being false, is an unnecessary restriction. There are ways of achieving the things that lisp can achieve that dont have its downsides.
I think a relevant difference between Lisp macros and textual macros of other languages is that in Lisp, the program is in the form of a datastructure (a list) that has relevant structure. So the macro is manipulating data at a level that is more relevant than text.
Thinking that there is not such a relevant difference might contribute to antimeminess of Lisp imo.
Aside:
I think what would be even better would be macros in a language where not only is the program in the form of a datastructure with relevant structure, but the language is also statically typed (with a suitably complex type system) with any program or subprogram having a type. The compiler could then provide protection against mistakes, allowing more complex stuff to be done in practice. Haskell partially does this by defining types for functions and allowing you to make functions that spit out other functions, but (afaik) doesn't apply this to other aspects of Haskell programs which seems to me a huge wasted opportunity.
I think both Template Haskell and MetaOCaml have some typechecking of macros.
Though I haven't found macros very useful or exciting. To me the most fun way to program is with simple code, but relying on a lot of implicit understanding. Something like what Kragen describes here:
Also, sometime around 1993, I read Robert Sedgewick's textbook, "Algorithms in C", which I borrowed from my father, Greg Sittler. It opened a whole new world to me. The programs in the book are all concise crystals of beauty, showing how a few lines of code can transform a pile of structs of integers and pointers into a binary search tree, or a hash table, or the minimal spanning tree of a set of points. It used only the basics of C, and did not rely on any libraries.
This was a revelation to me; there was beauty and magic in these programs, and it wasn't because they were calling on powerful libraries hidden, Wizard-of-Oz-style, behind curtains. They were just plain C code, and not very much of it, that "developed a set of operations that were not obviously implicit in the original set," to borrow Bruce Mills's phrase.
Yes. There's nothing magic about a list as a data structure that allows you to do implement type-safe macros. In fact, since any code can be represented as an abstact syntax tree, a tree-like data structure would be more general. I beleive the Nim language works that way.
People are just really bad at seeing the merits of things they aren't already in favour of.
I'd consider that an important factor in whether something ends up being an antimeme in a given culture.
In my understanding of the term, the most straightforward definition of antimemecy is "very low cultural infection rate".
(And implicit in the discussion so far seems to have been a certain expected usefulness of mentioned examples. Maybe we should focus the conversation on things with high expected value and low cultural infection rate / overall prevalence in western culture.)
I’ll hazard a guess: they are things whose merits seem clear to lsusr but that are widely neglected by others. I suggest, though, that this characteristic doesn’t pick out something special about those things. People are just really bad at seeing the merits of things they aren’t already in favour of.
There's a flipside to that where people can get super enthusiastic about things they are in favour of. In other words, while it is possible for people to ignore the merits of things that aren't widely known, it's possible for people to imagine the merits of minority-interest things that maybe aren't all that good. Things that have a cult following, like Austrian economics, Modern Monetary theory, Objectivism, general semantics...
I'd love to read more on the topic.
A longer list of what LW folk consider to be antimemes would be pretty interesting, too. I like to think I gained some insight from the mention of Lisp and entrepreneurship.
Thanks! I've written some more on the topic just for you. You can find a few more specific antimemes in my article The Technique Taboo. You might also enjoy the science fiction stories that inspired this whole sequence of posts.
Any sane person could write up a list of antimemes, but no sane person would post it.
It would tend to have the effect of making most people give up on the idea of antimeme, concluding that it's something that only insane people think about.
It would tend to have the effect of making most people give up on the idea of antimeme
Yes, that effect on most people is kinda in the nature of antimemes.
In a LW context I wouldn't paint the picture too black though. The average poster's epistemic standards are high. High enough to warrant a mindful reader's second look at the antimemes they're proposing.
The corresponding discussions would certainly not be frictionless. That doesn't mean they couldn't provide some high-value insight to a few people, though.
To me this looks like the stuff LW is all about. I mean, aren't we looking at low-hanging fruit hidden from vantage points of naive epistemology?
I think you're right. I write about this topic precisely because it could "provide some high-value insight to a few people". I trust we can figure out a special set of rules for discussing antimemes to make it work. The tiny amount of progress in this field so far suggests there could be lots of low-hanging fruit.
Any sane person could write up a list of antimemes, but no sane person would post it.
I really like this sentence. Writing about this antimemetic subjects is difficult because readers will often fixate on a particular example instead of refuting the central thesis. I'm growing to appreciate why Paul Graham wrote How to Disagree. He must get this kind of criticism all the time.
Interesting post, it reminds me a lot of this post on Algorithms of Deception, which in one sense is the study of how to find antimemes.
What's the difference between antimeme and just knowledge which is hard to attain? Why do we need a new definition "Antimemecy" when we already have "Complexity"? To prove it wrong it should be a meme that is complex and difficult to understand.
And for any useful knowledge when you start to use it you tend to remember it
To prove it wrong it should be a meme that is complex and difficult to understand.
I'd propose as examples "most stuff taught at university". Even outside of teaching institutions, complex ideas commonly spread memetically if the incentives for acquiring them are sufficiently visible from the outset. Think Evolutionary Theory, Object-Oriented Programming, or Quantum Physics.
An antimeme is a meme that's hard to find for reasons beyond its complexity. For example, Lisp isn't complicated. Informatically-speaking, it's simpler than popular programming languages.
So lots of people are taking up LISP, and abandoning it as soon as they hit the dreaded defmacro? But are lots of people aren't taking up LISP. There are lot of reasons for not studying old, little-used languages. And it's not as if programmers are low-openness people who hate fundamentally new paradigms -- OO would never have spread if they were. For me, LISP pattern matches to "cult following" rather than "great thing that the sheeple can't understand".
Different cultures have different antimemes. The more different two cultures are from each other the less their antimemes overlap. You can sweep up a mountain of antimemes just by reading a Chinese or Arabic history of civilization and comparing it to Western world history. You can snag a different set by learning what it was like to live in a hunter-gatherer or pastoralist society.
Anti-memes as shibboleths? If I see that you share the same weird belief/cultural practice/whatever that provokes such a strong self-suppressing response that nobody would acquire it unless they (a) are already immersed in that anti-meme's culture or (b) make some substantial deliberate effort to become a part of that culture.
Antimemes are self-keeping secrets. You can only perceive an antimeme if you already know it's there. Antimemes don't need a conspiracy to stay hidden because you can't comprehend an antimeme just by being told it exists. You can shout them to the heavens and nobody will listen. I'll try to explain with a fictitious example.
Suppose we all had an invisible organ behind our ears and our brains kept it secret from our consciousness. If I told you "you have an invisible organ behind your ear" you wouldn't believe me. You'd only believe it exists if you deduced its existence from a trail of evidence.
You can deduce the existence of an antimeme from the outline of the hole it cuts in reality. If you find an old photo with a gap where a person has been painted out then you can be confident that someone has been disappeared. You can then figure out who it is with conventional investigative methods. The challenge is noticing the gap in the first place and then not dismissing it as noise.
Different cultures have different antimemes. The more different two cultures are from each other the less their antimemes overlap. You can sweep up a mountain of antimemes just by reading a Chinese or Arabic history of civilization and comparing it to Western world history. You can snag a different set by learning what it was like to live in a hunter-gatherer or pastoralist society.
You can do the same thing with technology. Developing a proficiency in Lisp will shatter your tolerance of inferior programming languages. Once you've internalized
defmacro
you can never go back.As for jobs: once an entrepreneur, always an entrepreneur[1].
Comprehending an antimeme takes work. You slog toward it for a long time and then eventually something clicks like a ratchet. Until then everything you've learned is reversible. After it clicks you've permanently unlocked a new level of experience, like stream entry.
Stream entry is another antimeme, by the way.
Antimemes are easily dismissed as pseudoscience. Pseudoscience is a meme, not an antimeme. You can distinguish antimemes from pseudoscience at a glance by examining why they're suppressed. Pseudoscience is dismissed as fraudulent. Antimemes are dismissed as inapposite.
There are two different kinds of entrepreneurship. The more common form of entrepreneurship is self-employment where you sell your labor. I'm not talking about this common entrepreneurship. Entrepreneurship where you exploit an overlooked market opportunity is an antimeme. ↩︎