,.
+[,.]
+[,.>+]
+[,-------------[-------------------.[-]>+<]>]
First, we increment our initial pointer to kickstart our loop. We take keyboard input using the (,) and immediately subtract 13. ASCII 13 is the carriage return. If the user hit enter, the next command, a loop declaration (]) will not run because we effectively set our pointer ref to zero! We will deal with the pointer increment after this loop soon, but let's examine what happened if the user didn't hit enter, and pressed a valid lowercase letter: So the internal code block is run--first, it decrements the pointer reference by 19. This is because we have already decremented our value by 13. 13 + 19 equals 32. We have changed our value to uppercase.
Next we output it. Now we have the curious code ([-]). This is a loop that simply runs our value down to zero without having to know ahead of time what it already was. Bear with me, this becomes important. Now we increment the pointer, add 1 to the value, and decrement the pointer back again, effectively writing a 1 to the location ahead of the pointer location. Now we jump back to our corresponding open bracket, the second one from the left. the code block is now ignored, because we set the value to zero.
Now we go to the next command, the pointer increment. recall that we incremented this value to 1 (making it a nonzero), so when the return bracket jumps back to the beginning code block, it is repeated.
Right now this program has a kind of memory leak. Every time the outer loop runs, the pointer is incremented one time from the last. Eventually, it can run out of memory. Maybe I'll fix this later, but it's only an example!