We are currently working on new rules for what content should and shouldn't be allowed on this website, and are looking for feedback! See Esolang:2026 topicality proposal to view and give feedback on the current draft.
NANDlang+
NANDlang+ is a version of NANDlang made by the same guy who is absolutely nuts, loves Huggbees and Kasane Teto, and tortured himself making a Hello World program in NANDlang. It's ya boi User:A random guy.
What in the world is different about NANDlang+ than NANDlang?!
I might hear you yelling at my ears at 100 decibels. Which ow why did you do that?
Anyway the thing is, this version of NANDlang is actually Turing Complete! Which it almost was except for it not having unbounded memory. Now how the hell did I fix it to be Turing Complete?
Well, I made Superwires, Cross-Iteration Wires, and Cross-Pointer Wires (Cross pointers are formatted exactly like wires)! Which are also put in a modified NAND gates!:
Things about Superwires
A table explaining some stuff about them
| Attribute of Superwire shown visually | What it means |
|---|---|
| NAND(Input1 (Cross-Iteration or Normal), Input2 (Cross_Iteration or Normal), Superwire Input 1, Superwire Input 2,... Superwire Input N, 1st Output Connection (Optional);2nd Output Connection (Optional)… nth Output Connection (Optional) (To make it simpler, Output Connections can be Superwires, so there is no special version of output connections needed unlike Inputs), Force Print (True/False), Force Suppress (Not Print) (True?False_)_(Order of Printing if there is no Output Connection) | This is the updated version of the monstrosity I have shown earlier, Superwires behave almost like normal wires in how they can connet, as they can only come from 1 output, but unlike wires, you cannot just have it connect to as many inputs as you want, it can only connect to 1. |
| (Letter)[I/O (I means Input, O means Output), Force Shut Off (True/False)] (Ex, A[I]1, A[O]1) | The formatting for Superwires, the brackets are there to differentiate it. Force shut off means that if it is true, then it becomes disabled permanently and cannot be reactivated by another Superwire. |
How Superwires work
Superwires are basically what a loop is (one that only loops once), but they have 2 differences.
They actually can reset other Superwires contained inside of the region that they loop (If it sees the output or input of s a Superwire)!
And also something... a bit unique.
Now, this allows for infinite loops. But how? You may ask. Well, this abstracted and simplified line of code can help! (Though it wont work unless you add all the other crap).
A[I]1 B[I]1 . . . A[O]1 B[O]1
How is this a infinite loop? Well, when the program sees A[I]1, it actively looks for it's output connection, so it keeps going down, it then sees B[I]1, and looks for it's output connection too, so it keeps going down, it sees A[O]1, loops to A[I]1, as A[(O/I)]1 is disabled now, then after it loops, it sees B[O]1, realizes it saw B[I]1, and loops to where B[I]1 was, and once it sees A[O]1 again though it is before B[O]1, and due to that, it reactivates A[(O/I)], loops to A[I]1, and it reactivates B[I]1, thus making a infinite loop.
Time to address the other thing. They split pointers. You know how a program usually runs line by line? And how they can only run things one at a time? Well, this breaks that. If the program realizes it is in a infinite loop, by seeing if it is in that exact situation I made, it makes a new pointer that skips that process and goes to the line of code after (letter)[O](number). But if there isn't anything after that though, it doesn't do such a action.
Things about Cross-Iteration Wires
They are formatted like this:
(Letter){(Number)} (Ex: A{1})
Basically, you can make the output of a NAND gate go into the input of either that same NAND gate in the next iteration of a loop, or go into the input of a different NAND gate in the next iteration of a loop. Effectively allowing past iterations to affect future ones.
Things about Cross-Pointer Wires
One, I couldn't literally give them a better name, but 2, they allow you to make wires that go inside a loop, which makes the two pointers affect each other. BUT, the non-looping pointer only enters the loop just to put it's value into the input of a NAND gate before exiting out of the loop area. This just makes it so that the two pointers don't conflict with each other.
And that's about it! It really only needed 3 changes to be Turing Complete. So go ahead, make a Brainfuck Interpreter out of pure, modified NAND gates! Except you might go insane trying to handle potentially doing millions of lines of code to do it.
Listen man doing "Hello World!!!!!!" took 756 lines of code to do, with 754 NAND gates total, do you think doing a Brainfuck Interpreter in NANDlang+ is possible?! Yeah not if you are mortal, probably. Which we all are mortal, except for the Immortal Jellyfish but they cannot even code.