(* 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}]