WOLFRAM NOTEBOOK

In[๏]:=
(* hold attribute helpers *)โ€‹โ€‹โ€‹โ€‹HoldPosition[sym_Symbol[args___]] := With[{attrs = Attributes[sym], len = Length @ Unevaluated @ {args}},โ€‹โ€‹ Which[โ€‹โ€‹ MemberQ[attrs, HoldFirst],โ€‹โ€‹ {1},โ€‹โ€‹ MemberQ[attrs, HoldRest],โ€‹โ€‹ Range[2, len],โ€‹โ€‹ MemberQ[attrs, HoldAll | HoldAllComplete],โ€‹โ€‹ Range @ len,โ€‹โ€‹ True,โ€‹โ€‹ {}โ€‹โ€‹ ]โ€‹โ€‹]โ€‹โ€‹โ€‹โ€‹HoldPosition[_] := Missing["Position"]โ€‹โ€‹โ€‹โ€‹HoldPositionQ[expr_, i_] := With[{pos = HoldPosition[Unevaluated[expr]]}, MissingQ[pos] || MemberQ[pos, i]]โ€‹โ€‹โ€‹โ€‹SequenceHoldQ[sym_Symbol[___]] := MemberQ[Attributes[sym], SequenceHold]โ€‹โ€‹SequenceHoldQ[_] := Falseโ€‹โ€‹โ€‹โ€‹โ€‹โ€‹(* Icemelt *)โ€‹โ€‹โ€‹โ€‹(* always melt with StackComplete *)โ€‹โ€‹Icemelt // ClearAllโ€‹โ€‹โ€‹โ€‹Icemelt[Verbatim[Iceberg][data___]] /; MemberQ[Stack[], StackComplete] := dataโ€‹โ€‹Icemelt[iceberg_Iceberg] := StackComplete[Icemelt[iceberg]]โ€‹โ€‹Icemelt[expr___] := $Failedโ€‹โ€‹โ€‹โ€‹(* Iceberg *)โ€‹โ€‹โ€‹โ€‹Iceberg // ClearAllโ€‹โ€‹โ€‹โ€‹Iceberg::unbrk = "can't be evaluated with ``";โ€‹โ€‹Iceberg::symbol = "data can't be evaluated";โ€‹โ€‹โ€‹โ€‹(* run this if anything except Icemelt is executed with Iceberg in it *)โ€‹โ€‹Iceberg /: expr : (f : Except[Icemelt])[left___, iceberg_Iceberg, right___] /; ! SequenceHoldQ[Unevaluated[expr]] && ValueQ[Unevaluated[expr]] :=โ€‹โ€‹With[{โ€‹โ€‹ i = Length[HoldComplete[left]] + 1โ€‹โ€‹},โ€‹โ€‹ ๏€€โ€‹โ€‹ Message[Iceberg::unbrk, HoldForm[f[left, iceberg, right]]];โ€‹โ€‹ $Failedโ€‹โ€‹ ๏€† /; ! HoldPositionQ[Unevaluated[expr], i]โ€‹โ€‹]โ€‹โ€‹โ€‹โ€‹(* formatting *)โ€‹โ€‹Iceberg /: MakeBoxes[iceberg_Iceberg, fmt___] := With[{data = Icemelt[iceberg]},โ€‹โ€‹ BoxForm`ArrangeSummaryBox["Iceberg", "Iceberg"["โ€ฆ"], Style["๐ŸงŠ", 24], {{}}, ๏€œ๏€œโ€‹โ€‹ Replace[data, ๏€œโ€‹โ€‹ HoldComplete[Sequence[seq___]] :> HoldForm[HoldForm[Sequence][seq]],โ€‹โ€‹ HoldComplete[] :> Nothing,โ€‹โ€‹ HoldComplete[expr_] :> HoldForm[expr],โ€‹โ€‹ HoldComplete[seq___] :> HoldForm[HoldForm[Sequence][seq]]๏€ง]โ€‹โ€‹ ๏€ง๏€ง, fmt]โ€‹โ€‹โ€‹โ€‹]โ€‹โ€‹โ€‹โ€‹(* make Iceberg atomic *)โ€‹โ€‹Iceberg /: iceberg_Iceberg /; System`Private`HoldEntryQ[iceberg] := System`Private`HoldSetNoEntry[iceberg]โ€‹โ€‹โ€‹โ€‹(* make an Iceberg with protected symbol that only returns its data inside Icemelt *)โ€‹โ€‹iceberg : Iceberg[data___] /; System`Private`HoldNotValidQ[iceberg] := Module[{var},โ€‹โ€‹ var := If[MemberQ[Stack[], Icemelt], HoldComplete[data], Message[Iceberg::symbol]; $Failed];โ€‹โ€‹ SetAttributes[var, {Protected, ReadProtected, Locked}];โ€‹โ€‹ System`Private`HoldSetValid[Iceberg[var]]โ€‹โ€‹]โ€‹โ€‹โ€‹โ€‹(* protect and lock it *)โ€‹โ€‹SetAttributes[Iceberg, {ReadProtected, Protected, Locked, HoldAllComplete}]
Make an Iceberg with data (it can be any expression, including a sequence):
In[๏]:=
iceberg=Iceberg[{1,2,3}]
Out[๏]=
Iceberg๏€
๐ŸงŠ
โ€‹
๏€–
Making inert expressions with icebergs is allowed:
In[๏]:=
{iceberg,f[iceberg],g[iceberg,h[iceberg]]}
Out[๏]=
๏€Iceberg๏€
๐ŸงŠ
โ€‹
๏€–,f๏€Iceberg๏€
๐ŸงŠ
โ€‹
๏€–๏€–,g๏€Iceberg๏€
๐ŸงŠ
โ€‹
๏€–,h๏€Iceberg๏€
๐ŸงŠ
โ€‹
๏€–๏€–๏€–๏€จ
But nothing is allowed to evaluate with iceberg inside and extract its contents:
In[๏]:=
iceberg[[1]]โ€‹โ€‹Hold[Evaluate@iceberg][[1,1]]โ€‹โ€‹Replace[Hold@Evaluate@iceberg,Hold[Iceberg[data_]]:>data]โ€‹โ€‹ToString[iceberg]
Iceberg
::unbrk
:can't be evaluated with Iceberg๏€
๐ŸงŠ
โ€‹
๏€–๏‚จ1๏‚ฎ
Out[๏]=
$Failed
Part
:Part specification Hold๏€Iceberg๏€
๐ŸงŠ
โ€‹
๏€–๏€–๏‚จ1,1๏‚ฎ is longer than depth of object.
Out[๏]=
Hold๏€Iceberg๏€
๐ŸงŠ
โ€‹
๏€–๏€–๏‚จ1,1๏‚ฎ
Iceberg
::symbol
:data can't be evaluated
Out[๏]=
$Failed
Iceberg
::unbrk
:can't be evaluated with ToString๏€Iceberg๏€
๐ŸงŠ
โ€‹
๏€–๏€–
Out[๏]=
$Failed
Except Icemelt (it always returns HoldComplete):
In[๏]:=
Icemelt[iceberg]
Out[๏]=
HoldComplete[{1,2,3}]
Looking at its InputForm only reveals a symbol:
In[๏]:=
Hold[Evaluate@iceberg]//InputForm
Out[๏]//InputForm=
Hold[Iceberg[var$7367]]
Any attempt to evaluate it results in $Failed:
In[๏]:=
var$7367
Iceberg
::symbol
:data can't be evaluated
Out[๏]=
$Failed
Its definition is also hidden with ReadProtected:
In[๏]:=
OwnValues[var$7367]
General
:Symbol var$7367 is read-protected.
Out[๏]=
$Failed
One can do this trick where iceberg technically is not inside Icemelt, but it still requires it to be around its data:
In[๏]:=
Catch@Replace[Hold@Evaluate@iceberg,Hold[Iceberg[data_]]:>Icemelt[Throw[data]]]
Out[๏]=
HoldComplete[{1,2,3}]
Wolfram Cloud

You are using a browser not supported by the Wolfram Cloud

Supported browsers include recent versions of Chrome, Edge, Firefox and Safari.


I understand and wish to continue anyway ยป

You are using a browser not supported by the Wolfram Cloud. Supported browsers include recent versions of Chrome, Edge, Firefox and Safari.