I revisited my old brainfuck to test rep_cin command I did. Seems that I had to add wait to make it behave as expected.
rep_cin is the closest one could have to input() in Python or std::cin in C++. There’s almost no use case for this except for building G’MIC applications outside of image processing, but this allows this option.
C:\Users\User\Documents\G'MIC\Brainfuck Interpreter>gmic "brainfuck_interpreter.gmic" run_brainfuck \">,>,<<++++++[>-------->--------<<-]>[>[>+>+<<-]>[<+>-]<<-]>[-]>+>>++++++++++<[->-[>>>]++++++++++<<+[<<<]>>>>]<-<++++++++++>>>[-<<<->>>]<<<<++++++[>++++++++>[++++++++>]<[<]>-]>>[.<<]<[<<]>>.\",1
[gmic]./ Start G'MIC interpreter (v.3.3.3).
[gmic]./ Input custom command file 'brainfuck_interpreter.gmic' (4 new, total: 4806).
[gmic]./ Brainfuck Interpreter Inserted Argument#1: 31
[gmic]./ Brainfuck Interpreter Inserted Argument#2: 3
[gmic]./ Brainfuck Output: 93
[gmic]./ End G'MIC interpreter.
#@cli run_brainfuck_it: brainfuck_file,'_enforce_numbers_input={ 0=false | 1=true },_size_of_array>0
#@cli : Interprets Brainfuck code file within G'MIC brainfuck_interpreter.
#@cli : Default values: ,'_enforce_numbers_input=0','_size_of_array=512'
run_brainfuck_it:
skip ${2=0},${3=512}
it $1
_brainfuck_interpreter $2,$3
um run_brainfuck_it,run_brainfuck,_brainfuck_interpreter,_brainfuck_interpreter_byte_input
#@cli run_brainfuck: brainfuck_code,'_enforce_numbers_input={ 0=false | 1=true },_size_of_array>0
#@cli : Interprets Brainfuck code within G'MIC brainfuck_interpreter.
#@cli : Default values: ,'_enforce_numbers_input=0','_size_of_array=512'
run_brainfuck:
skip ${2=0},${3=512}
('$1')
_brainfuck_interpreter $2,$3
um run_brainfuck_it,run_brainfuck,_brainfuck_interpreter,_brainfuck_interpreter_byte_input
_brainfuck_interpreter:
# 1. Convert image into dynamic image
resize 1,{whd#-1},1,1,-1 ({h}) append y # Convert string images into dynamic image
name[-1] brainfuck_code # Name image into brainfuck_code
# 2. Remove unused characters
eval "
for(p=h#-1-2,p>-1,--p,
char=i[#-1,p];
if(!(inrange(char,_'+',_'.',1,1)||(find('<>[]',char,0,1)!=-1)),
da_remove(#-1,p);
);
);
if(!da_size(#-1),
run('error inval_code');
);
da_freeze(#-1);
"
# 3. Evaluate brackets
eval[brainfuck_code] >"
begin(level=0;);
i==_'['?++level:
i==_']'?--level;
if(level<0,run('error inv_bracks'););
end(if(level,run('error inv_bracks');););"
1x2 # Create 2 images of 1x1x1x1. One image is for storing print out characters, and the other is to allow inputs.
_arg_level=1
# 4. Create JIT code for executing brainfuck code.
repeat h#$brainfuck_code {
idx:=i[#0,$>]
if $idx==_'+' code_str.=ind_list[ind]++;ind_list[ind]%=256; continue fi
if $idx==_',' code_str.=run('$0_byte_input[-2]\ $1');ind_list[ind]=i(#-2,0,0,0,0)%256; continue fi
if $idx==_'-' code_str.=ind_list[ind]--;ind_list[ind]%=256; continue fi
if $idx==_'.' code_str.=da_push(#-1,ind_list[ind]); continue fi
if $idx==_'<' code_str.=if(!inrange(--ind,0,$2,1,0),run("'error out_of_bound'");); continue fi
if $idx==_'>' code_str.=if(!inrange(++ind,0,$2,1,0),run("'error out_of_bound'");); continue fi
if $idx==_'[' code_str.=repeat(inf,if(!ind_list[ind],break();); continue fi
if $idx==_']' code_str.=if(!inrange(ind,0,$2,1,0),run("'error out_of_bound'"););); fi
}
# 5. Execute created JIT code. v + and v - is used to change verbosity level, not part of JIT execution. e[] is used to print into console.
v +
eval >begin(ind=0;ind_list=vector(#$2,0););if(!inrange(ind,0,$2,1,1),run("'error out_of_bound'"););$code_str;end(da_freeze(#-1););
v -
# 6. Print out executed code result
v + e[$^] "Brainfuck Output: "{t} v -
remove
_brainfuck_interpreter_byte_input:
repeat inf {
wait # For some reason, I had to add this to make this code work!
if $> rep_cin "Brainfuck Interpreter - Wrong Input! Insert Integer for Argument#"$_arg_level": "
else rep_cin "Brainfuck Interpreter - Enter Argument#"$_arg_level" (Integers Only): "
fi
if $1 input:=${}+_'0'
else input=${}" :: "{`${}`}
fi
if isint($input) break fi
}
if $1 v + e[$^] "Brainfuck Interpreter Inserted Argument#"$_arg_level": "{$input-_'0'} v -
else v + e[$^] "Brainfuck Interpreter Inserted Argument#"$_arg_level": "$input v -
fi
_arg_level+=1
f[-1] $input