My quick-n-dirty take on this:
mergef = Module[{ds = Symbol /@ ("s" <> ToString@# & /@ Range@100), fs = ##, rf}, rf = Plus@Through[fs[Sequence @@ ds]]; Function @@ {Take[ds, Max[Position[ds, #] & /@ Cases[rf, Alternatives @@ ds, Infinity]]], rf}] &; (* do some stuff *) f = # &; g = Function[{a}, a^2]; h = (-2 #1 + #3) &; k = #6*10 &; resfn = mergef[f, g, h, f, g, h, k] resfn[2, 3, 4, 5, 6, 7] (* Function[{s1, s2, s3, s4, s5, s6}, -2 s1 + 2 s1^2 + 2 s3 + 10 s6] 82 *) mergef[resfn, resfn][2, 3, 4, 5, 6, 7] (* 164 *) (* using *belisarius*' functions *) mergef[f1, f2, f3][5, 6, 7, 8] (* 35 *)