Я думаю, причина того, что эти операции имеют имена String *, заключается в том, что они имеют крошечные различия по сравнению со своими аналогами в списке. В частности, сравнить Cases
с StringCases
.
Теперь способ достичь того, чего вы хотите, это сделать так:
Begin["StringOverload`"];
{Drop, Cases, Take, Reverse};
Unprotect[String];
ToStringHead[Drop] = StringDrop;
ToStringHead[Take] = StringTake;
ToStringHead[Cases] = StringCases;
ToStringHead[Reverse] = StringReverse;
String /:
HoldPattern[(h : Drop | Cases | Take | Reverse)[s_String, rest__]] :=
With[{head = ToStringHead[h]}, head[s, rest]]
RemoveOverloading[] :=
UpValues[String] =
DeleteCases[UpValues[String],
x_ /; ! FreeQ[Unevaluated[x], (Drop | Cases | Take | Reverse)]]
End[];
Вы можете загрузить вещи с помощью Get
или Need
, а снять перегрузку с помощью RemoveOverloading[]
, вызываемой в правильном контексте.
In[21]:= Cases["this is a sentence", RegularExpression["\\s\\w\\w\\s"]]
Out[21]= {" is "}
In[22]:= Take["This is dangerous", -9]
Out[22]= "dangerous"
In[23]:= Drop["This is dangerous", -9]
Out[23]= "This is "
Хотя я не думаю, что это правильный путь. Вы можете рассмотреть возможность введения более коротких символов в некотором контексте, который автоматически оценивается как String*
символов