シンプルな数学トークナイザを書き、新しいC#pattern matching
機能を使用しようとします。私はif-else if
チェーンを使用せずに、条件によって一致させたいので、私はcase var _
を使用していパターン一致の場合
public IEnumerable<IToken> Tokenize(string input)
{
const char decimalSeparator = '.';
string inputWithoutSpaces = input.Replace(" ", string.Empty);
var numberBuffer = new StringBuilder();
var letterBuffer = new StringBuilder();
foreach (char c in inputWithoutSpaces)
{
switch (c)
{
case var _ when IsTerm(c, letterBuffer):
if (numberBuffer.Length > 0)
{
yield return EmptyNumberBufferAsLiteral(numberBuffer);
yield return new Operator('*');
}
letterBuffer.Append(c);
break;
case decimalSeparator:
case var _ when IsDigit(c):
numberBuffer.Append(c);
break;
case var _ when IsOperator(c):
if (numberBuffer.Length > 0)
{
yield return EmptyNumberBufferAsLiteral(numberBuffer);
}
if (letterBuffer.Length > 0)
{
yield return EmptyLetterBufferAsTerm(letterBuffer);
}
yield return new Operator(c);
break;
}
}
if (numberBuffer.Length > 0)
{
yield return EmptyNumberBufferAsLiteral(numberBuffer);
}
if (letterBuffer.Length > 0)
{
yield return EmptyLetterBufferAsTerm(letterBuffer);
}
}
が、私はvar variableName
を指定せずにcase when
を書き込むことができませんでしだ:
トークナイザは非常に簡単です。
このような操作を行うための方法はありますか?あるいは、これらのことを行うための推奨される方法ですか?
まあ、スイッチ文で定数を使用するという要件を回避するために、パターンマッチングを悪用しているので、実際に回避する方法はありません。さらに、私はあなたのロジックがおそらくは/ if文と同じように良く適合していると思います。 – DavidG
@DavidG逆に、アクティブパターンのように見えます。これはトークナイザとパーサの実装をもっと簡単にします。 C#7のパターンマッチングにはいくつかの重要な機能がありません。アクティブパターンはその1つです。 –
@PanagiotisKanavosはい、でも私は今すぐ利用できる言語について話しています。私はかなり多くのパターン一致するものが将来C#に入ってくるのを確かめるでしょう。(主にF#と思っています) – DavidG