Mr.*_*ard 3 string wolfram-mathematica
有了Mathematica,我总觉得字符串是"二等公民".与诸如PERL之类的语言相比,必须兼顾大量代码才能完成相同的任务.
可用的功能还不错,但语法不舒服.虽然有一些简写形式,如<>对StringJoin和~~的StringExpression,大部分的字符串功能缺乏这样的语法,并使用笨拙的名称,如:StringReplace,StringDrop,StringReverse,Characters,CharacterRange,FromCharacterCode,和RegularExpression.
在Mathematica中,字符串像数学对象一样处理,允许5 "a" + "b"在哪里"a"并"b"充当符号.这是一个我不会改变的功能,即使这不会破坏代码堆栈.然而,它排除了某些简洁的字符串语法,其中例如5 "a" + "b"将呈现表达式"aaaaab".
想到的想法,无论是单独的还是组合的,都是:
超载现有的功能来处理字符串,例如Take,Replace,Reverse.
使用缩写名称作为字符串函数,例如StringReplace>> StrRpl,Characters>> Chrs,RegularExpression>>"RegEx"
为字符串函数创建新的中缀语法,并可能创建新的字符串操作.
为字符串创建一个新容器,例如str["string"],然后为各种函数定义.(这是由Leonid Shifrin提出的.)
的变量(4)中,展开字符串(自动?)的字符,例如"string">> str["s","t","r","i","n","g"]使得字符可以由可以看出Part,Take等
从Mathematica中调用另一种语言,如PERL来处理字符串处理.
创建新的字符串函数,集合常用的操作序列.
我认为这些操作具有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[];
Run Code Online (Sandbox Code Playgroud)
您可以使用Getor 加载内容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 "
Run Code Online (Sandbox Code Playgroud)
不过,我不认为这样做是正确的方法.您可以考虑在某些上下文中引入较短的符号,这些符号会自动评估为String*符号
| 归档时间: |
|
| 查看次数: |
644 次 |
| 最近记录: |