2008-09-01から1ヶ月間の記事一覧

None がキーのときに

キー要素が None のときには、特別な配慮が必要です。 if (kv.Key == nullObject) buf.Append("None"); else buf.Append(Ops.StringRepr(kv.Key));キー要素が None のときには、そのリテラル表現として "None" を追加します。それ以外なら、作業領域 buf の…

要素対を区切るときに

要素対を含まないか、1つだけ含むときには、カンマ「,」で区切る必要はありません。そのため、foreach ループでは、少し工夫が必要です。すると、次のような構造が見えてきます。 bool first = true; foreach (...) { if (first) first = false; else buf.A…

ソースコードの歩き方《IronPython》dict.__str__ 3/3

Previous〈3/3〉Next Python.use(better, src=”IronPython”) # ソースコードを散策する《記事一覧》

ソースコード:DictOps.ToString()

《関連記事》__str__ 内部クラス DictOps では、クラス Dict で規定するメソッドに対して、実質的な処理群(Ops)を実現します。これらのメソッドは static 宣言してあり、メソッド呼び出しの対象となるインスタンス自身(実引数 this)が、仮引数 self にな…

メソッド:ToString

メソッド ToString では、次のように、 return DictOps.ToString(this);実引数に、this を指定しています。これは、内部クラス DictOps ですべての操作を実現しているので、それに自身 this の処理を委ねるためです。このとき(Dict のインスタンス)this は…

ソースコード:Dict.ToString()

(メソッド dict.__str__ に相当する)メソッド ToString の定義を含む、ソースコードの断片を次に示します。# IronPython-1.1.2/Src/IronPython/Runtime/Dict.cs namespace IronPython.Runtime { [PythonType("dict")] public class Dict : ... IDictionary…

イディオム:StringBuilder

静的メソッド ToString では、リターン値を得るために、変数 buf が作業領域 StringBuilder を保持します。StringBuilder を使うと(可変型の)文字列を編集(追加/削除/置換/挿入)したいときに便利です。すると、次のような構造が見えてきます。 StringBui…

ソースコードの歩き方《IronPython》dict.__str__ 2/3

Previous〈2/3〉Next Python.use(better, src=”IronPython”) # ソースコードを散策する《記事一覧》

イディオム:StringBuilder

静的メソッド SetToString の本体は、2つの処理(前半/後半)に大別できます。 public static string SetToString(object set, IEnumerable items) { string setTypeStr; ... StringBuilder sb = new StringBuilder(); ... }前半では、与えられた引数から型…

ソースコード:SetHelpers.SetToString()

静的クラス SetHelpers では、クラス SetCollection/FrozenSetCollection で共有するメソッドを支援する、補助的な処理群(Helpers)を実現します。 /// /// Contains common set functionality between set and forzenSet /// static class SetHelpers { pu…

ソースコード:X.ToString()

(メソッド set.__str__/frozenset.__str__ に相当する)メソッド ToString の定義を含む、ソースコードの断片を次に示します。 # IronPython-1.1.2/Src/IronPython/Runtime/Set.cs namespace IronPython.Runtime { /// Common interface shared by both Set…

《in draft》2008年11月18日(火)

set 型のインスタンス:同じ型の要素

IronPython のソースコードを理解するための布石として、実際に、その動作を確認してみましょう。>>> set() set([])型名 set に演算子 () を適用する(関数呼び出し)と、set 型のインスタンスが得られます。引数を省略すると、要素を持たない「空集合」が得…

set 型のインスタンス:ハッシュ値

「集合を要素に持つ」集合も表現できます。ただし、集合の要素はハッシュ値を持つ(hashable)必要があります。>>> set([set(e) for e in "ABC"])Traceback (most recent call last): File "", line 1, in set([set(e) for e in "ABC"]) TypeError: set obje…

set 型のインスタンス:任意の型の要素

集合の要素には、任意の型のインスタンスを混在できます。>>> it = 3,"ABC",True,None >>> set(it) set([None, True, 3, 'ABC']) >>> for e in it: print type(e) ここでは、集合の要素に「異なる型」のインスタンスが混在するのが分かります。

set 型のリテラル表現

set 型は、集合に相当します。集合は、順序を持たず重複しない要素群を表現したものです。set 型は、list/dict のような(文字どおりの)リテラル表現を持ちません。そこで、set 型のヘルプ情報を確認します。>>> help(set) Help on class set in module __b…

《in draft》2008年11月19日(水)

組み込み関数:str()

ここで、set.__str__ のヘルプ情報を確認します。>>> help(set.__str__) Help on wrapper_descriptor:__str__(...) x.__str__() str(x)これを見て、set.__str__ は、組み込み関数 str の動作を規定しているのが分かります。実際に、その動作を確認してみまし…

《in draft》2008年11月17日(月)

Python.use(better, src=”IronPython”) # ソースコードを散策する《記事一覧》 《承前》 set 型とともに、関係の深い frozenset 型についても解説します。

要素を区切るときに

要素を含まないか、1つだけ含むときには、カンマ「,」で区切る必要はありません。そのため、foreach ループでは、少し工夫が必要です。すると、次のような構造が見えてきます。 string comma = ""; foreach (...) { sb.Append(comma); ... comma = ", "; }…

要素を含まないときに

要素を含まないときには、括弧 ([]) で括るだけです。 sb.Append("(["); ... foreach (object o in items) { ... } sb.Append("])");対象となる IEnumerable items が、要素を含まないときには、foreach ループの本体を実行しません。そのため、作業領域 sb …

インスタンスの文字列表現

リターン値を得るために、変数 sb が作業領域 StringBuilder を保持します。StringBuilder を使うと(可変型の)文字列を編集(追加/削除/置換/挿入)したいときに便利です。すると、次のような構造が見えてきます。 StringBuilder sb = new StringBuilder()…

インスタンスの型情報

前半には、次に示す典型的な C# のイディオムが記述してあります。 string s; Type t = obj.GetType(); if (t == typeof(T1)) { s = "t1"; } else if (t == typeof(T2)) { s = "t2"; } else { s = ... // その他 }与えられた引数 set の型に合わせて、その型…

ソースコード:SetHelpers.MakeSet(object, ISet)

静的メソッド MakeSet の定義を含む、ソースコードの断片を次に示します。 public static ISet MakeSet(object setObj, ISet set) { Type t = setObj.GetType(); if (t == typeof(SetCollection)) { return new SetCollection(set); } else if (t == typeof(…

メソッド set.symmetric_difference

メソッド set.symmetric_difference のヘルプ情報を確認します。 >>> help(set.symmetric_difference) Help on method_descriptor:symmetric_difference(...) Return the symmetric difference of two sets as a new set. (i.e. all elements that are in ex…

メソッド set.intersection

メソッド set.intersection のヘルプ情報を確認します。 >>> help(set.intersection) Help on method_descriptor:intersection(...) Return the intersection of two sets as a new set. (i.e. all elements that are in both sets.)これを見て、2つの集合…

# IronPython-1.1.2/Src/IronPython/Runtime/Set.cs static class SetHelpers { ... public static ISet Union(ISet x, object y) { ISet set = SetHelpers.MakeSet(x, x); IEnumerator ie = Ops.GetEnumerator(y); while (ie.MoveNext()) { set.PrivAdd(ie.…

ソースコード:ISet.PrivFreeze()

メソッド ISet.PrivFreeze の定義を含む、ソースコードの断片を次に示します。 internal interface ISet : IEnumerable { void PrivFreeze();インターフェース ISet を実現するクラス(SetCollection/FrozenSetCollection)では、メソッド PrivFreeze を実現…

クラス:SetHelpers

次に示す静的メソッド本体に共通する、次のような構造が見えてきます。 ISet set = SetHelpers.MakeSet(x, x); ... set.PrivFreeze(); return set;インターフェース ISet の規定に従う、インスタンス set を生成して、これをリターン値します。このとき、可…

ソースコード:SetCollection.Union(object)

(メソッド set.union に相当する)メソッド Union の定義を含む、ソースコードの断片を次に示します。他のメソッド intersection/difference/symmetric_difference についても、同様です。 # IronPython-1.1.2/Src/IronPython/Runtime/Set.cs public class …