DoubleFuck

DoubleFuck is a modification of BF that operates on two tapes, rather than one. In addition to the normal BF commands, there is a second set of commands for working with this second tape and pointer. The accepted abbreviation for Doublefuck is DBF.

Language overview
DBF works with two data arrays, each with an independent pointer. Both pointers are initialized to the first cell in their respective array. The commands are:

History
Currently, little information regarding DoubleFuck is available on the web- a failing this article hopes to rectify. If the original language author finds this page, it is hoped that more historical information can be added.

Hello, World!
v++++++++++[-///////v//////////v////v///v////////^^^^>+++++++++++<]//:v/:///////::///:v////:v//: v///////:>+.+++.--..^/:

First line is printing 'Hello, ', second line 'World!'

Computational class
DoubleFuck is Turing-complete by a trivial reduction from Brainfuck.

Implementations

 * 1) include
 * 2) include
 * 3) include

using namespace std;

int bf_index = 0, dbf_index = 0; char bf_array[5000], dbf_array[5000], f[5000], b, *s=f;

void interpret(char *c) {	char *d;

while( *c ) { switch(*c++) { //bf operations case '<': bf_index--;       break; case '>': bf_index++;       break; case '+': bf_array[bf_index]++;    break; case '-': bf_array[bf_index]--;    break; case '.': cout<>bf_array[bf_index]; break; case '[': for( b=1,d=c; b && *c; c++ ) b+=*c=='[', b-=*c==']'; if(!b) { c[-1]=0; while( bf_array[bf_index] ) interpret(d); c[-1]=']'; break; }		case ']': cout<<"UNBALANCED BF BRACKETS", exit(0); //dbf operations case '^': dbf_index--;       break; case 'v': dbf_index++;       break; case '/': dbf_array[dbf_index]++;    break; case '\\': dbf_array[dbf_index]--;    break; case ':': cout<>dbf_array[dbf_index]; break; case '{': for( b=1,d=c; b && *c; c++ ) b+=*c=='{', b-=*c=='}'; if(!b) { c[-1]=0; while( dbf_array[dbf_index] ) interpret(d); c[-1]='}'; break; }		case '}': cout<<"UNBALANCED DBF BRACKETS", exit(0); //debug case '#': for(int i =0; i < 6; i++) cout<5000) cout<<"BF RANGE ERROR", exit(0);

if( dbf_index<0 || dbf_index>5000) cout<<"DBF RANGE ERROR", exit(0); } }

int main(int argc,char *argv[]) {	FILE *z;

if(z=fopen(argv[1],"r")) { while( (b=getc(z))>0 ) *s++=b; *s=0; interpret(f); }

return 0; }