Burlesque, 40 bytes
ri#Q2 SH ~- "ri#Q" \/ .+ j "<-" ps if sh
Explanation:
Burlesque has advanced stack and code manipulation built-ins. In fact, you can't access the source code of the program but you can access the remaining
code that is to be executed in the future. This means #Q will return all the code that follows it which is why we have to add everything up to #Q to that code which is what we're doing with ri#Q.
blsq ) #Q1 2++
12 -- this is the result of 1 2++
{1 2 ++} -- this is the result of #Q
++1 2 is technically illegal code since it's stack based. But we can manipulate the code to make it execute as 1 2++:
blsq ) #Q<-#q++1 2
12
Working with these built-ins is incredibly tricky and nobody has yet used them for anything productive except for quine related things. If you reverse ++1 2 you get 2 1++ which would produce 21 and not 12. The reason the code above produces 12 is because #Q also includes the <- so in the end we end up executing a lot more than just 2 1++ :p. We end up executing 2 1++#q<- which produces 12.
We can actually replace things in our code for example this code replaces all occurences of ?+ in itself with ?*
blsq ) #Q(?+)(?*)r~5.-#q5 5?+
25
Usage:
$ echo "1" | blsq --stdin 'ri#Q2 SH ~- "ri#Q" \/ .+ j "<-" ps if sh'
hs fi sp "-<" j +. /\ "Q#ir" -~ HS 2Q#ir
$ echo "0" | blsq --stdin 'ri#Q2 SH ~- "ri#Q" \/ .+ j "<-" ps if sh'
ri#Q2 SH ~- "ri#Q" \/ .+ j "<-" ps if sh
6So... if my language doesn't have booleans. But 0 is falsy and positive integers are truthy. Can I assume that the input will be only 0 or 1 (as stand-ins for booleans - the language will in fact always yield one of those two as the result of a conditional operator)? Or do I have to support any integers, since I can't use "actual" booleans? – Martin Ender – 10 years ago