Skip to main content

function construction - How to get a unevaluted expression from a compressed string?


Of course we know


Defer[Range[20]]


Range[20]



But I try to compress my expression into a string



com = Compress;
SetAttributes[com, HoldAllComplete]
string = com[Range[10]]


1:eJxTTMoPSuNiYGAoZgESPpnFJZ6MQIYhmDQCk8Zg0gRMmoJJMzBpDiYtwKSlJxNIlwEApm8I6w==



I cannot get a unevaluted expression from it?


Defer /@ Uncompress[string]



{1,2,3,4,5,6,7,8,9,10}



Actually the Range[20] is the expected output.How to do this?



Answer



You need to wrap the expression Unevaluated before passing it to Compress, which means defining your own function instead of just assigning Compress to com:


ClearAll[com];

SetAttributes[com, HoldAllComplete];
com[expr_] := Compress[Unevaluated[expr]];


string = com[Range[10]]
(* "1:eJxTTMoPSmNkYGAoZgUSQYl56amZXEAWADzBBIQ=" *)

And then make sure to wrap it in Hold or Defer when you pull it back out, which you can do with the second argument of Uncompress:


Uncompress[string, Defer]    
(* Range[10] *)

Comments