ops2 = {{"+", Plus}, {"-", Subtract}, {"*", Times}, {"^", Power}, Mod};
ops1 = {Prime, Minus, Floor, Exp, Re, Im, Arg, Abs, Sin, Cos, Tan,
Conjugate, {"Rationalize", Rationalize[#, 0] &}, {"ToReal", N[#, 100] &},
{"isPrime", If[AtomQ@#, If[#, true, false], false] &@PrimeQ@# &},
{"toBinary", If[#2 == {}, #1, #0[10*#1 + First@#2, Rest@#2]] &[0, IntegerDigits[#, 2]] &},
{"1/x", 1/# &}, Log, {"Log10", Log[10, #] &}};
consts = Join[ToString /@ Range[0, 9], {" I ", " Pi ", " E "}];
s = {None, {0, 0}}; a := s[[1]]; b := s[[2]]; bb := ss[[2]]; op = ImageSize -> {130, 30}; true = 1; false = I;
ss := {#[[1]], PadLeft[#[[2]], Max[Length@#[[2]], 2]]} &@If[StringQ@a, {None, Append[b, ToExpression@a]}, s]
Column@{Flatten[{ Button[#, s = If[StringQ@a, {a <> #, b}, {#, b}], op] & /@ consts,
Button[#[[1]], s = {None, Append[bb[[;; -2]], #[[2]]@Last@bb]}, op] & /@ (If[ListQ@#, #, {ToString@#, #}] & /@ ops1),
Button[#[[1]], s = {None, Append[bb[[;; -3]], #[[2]] @@ bb[[-2 ;;]]]}, op] & /@ (If[ListQ@#, #, {ToString@#, #}] & /@ ops2),
Button["Enter", s = {None, If[StringQ@a, Append[b, ToExpression@a], Append[b, Last@b]]}, op],
Button["C", s = {None, Append[Most@b, 0]}, op], Button["AC", s = {None, {0, 0}}, op],
Button["x<>y", s = {None, Join[bb[[;; -3]], bb[[{-1, -2}]]]}, op]}, 1],Dynamic[Framed /@ ss[[2]]]}