練炭ブログ

萌え壁紙、Irvine、DMonkey、Proxomitron などの情報を扱ってます。

DMonkey: String/StringBuffer オブジェクトの比較

コメントなし»

http://peace.2ch.net/test/read.cgi/win/1412399700/74 より。

別々の String オブジェクトを == 演算子や === 演算子で比較すると、true になってしまいます。

更に、StringBuffer オブジェクトや、StringStringBuffer を継承したクラス同士でもそうなります。

以下の例では、別々のオブジェクトなので正しくは false となるところ、全て true と表示されてしまいます。

class S extends String { }
class SB extends StringBuffer { }

var a = new String ('aaa');
var b = new String ('bbb');
var c = new S ('ccc');
var d = new S ('ddd');

alert (a === b);  // Stringの別々のインスタンス
alert (c === d);  // String派生クラスの別々のインスタンス
alert (a === c);  // StringとString派生クラス

var e = new StringBuffer ('eeee');
var f = new StringBuffer ('fff');
var g = new SB ('ggg');
var h = new SB ('hhh');

alert (e === f);  // StringBuffer
alert (g === h);  // StringBuffer派生クラス
alert (e === g);  // StringBufferとStringBuffer派生クラス

alert (a === e);  // StringとStringBuffer
alert (a === g);  // StringとStringBuffer派生クラス
alert (c === e);  // String派生クラスとStringBuffer
alert (c === g);  // String派生クラスとStringBuffer派生クラス

2015-03-22 追記
new してない String そのもの、StringBuffer そのものでも true になります。
派生クラスの場合(上の例の S や SB)は false です。

Irivne/Dorothy2: netinst.dms ネットインストール

コメントなし»

GitHub ではコミットごとに ZIP ファイルが自動生成されます。このファイルは Dorothy2 のパッケージインストール機能で扱えないこともありませんが、プロジェクトから出力して圧縮した書庫ではないため不要なファイルまでインストールされるといったデメリットがあります。

そこで、ZIP ファイルをダウンロードしてインストールする専用のツールを作っています。

自分自身は使わないし、必要とされるツールなのかどうか分かりませんが、一応形にはなったので反応を伺うためにも紹介しておきます。

ただ、簡単にインストールできるということが教えてクンを呼び込むことに繋がったら困る……。


設定画面のメニュー→パッケージ→ネットインストールで起動。

netinst_1

リストボックスがありますが選択肢は一つしか無いので、そのまま「ダウンロード」をクリックします。

netinst_2

ZIP ファイルのダウンロード、展開、内容の解析が行われ、スクリプトの一覧が表示されます。

ファイルに問題がある(必要なファイルが含まれない)場合は、ここでエラーが表示されます。

同じファイル名のスクリプトがインストール済みならチェックボックスにチェックが入り、「インストール済」欄にバージョンが表示されます。「→」は同じバージョンがインストールされていることを示します。

netinst_3

コンテキストメニューもあります。
WinMerge (WinMergeU.exe) がインストールされていれば差分を表示できます。

インストールしたいスクリプトにチェックを入れて「インストール」をクリックします。
(なおチェックを外してもアンインストールはされません)

※「新しいバージョンをインストールする」という動作ではなく「チェックを入れたスクリプトをインストールする」という動作です。同じバージョンや、より新しいバージョンがインストール済みでもチェックを入れたスクリプトは必ずインストールが行われます。

netinst_4

ファイルのコピーが行われ結果がステータスバーに表示されます。

ドキュメントが UTF-8 の場合は Shift_JIS に変換してインストールします。
今は Shift_JIS でレポジトリにコミットしていますが、このツールの使用を前提としていいなら UTF-8 でのコミットに変更したいと考えています。

netinst_5

先ほどの画面で「詳細表示」ボタンをクリックするとログファイルが開きます。

copy …… 新規ファイルをコピーした。
update …… 既存ファイルに上書きした。
same …… 同一内容のファイルが存在した(コピー省略)。
skip …… ファイル内容は異なるが、バージョン番号が同一なのでコピーしなかった。
※program\*.dms のみ適用。
error …… コピー時にエラーが発生した。

終了時に、ウィンドウ位置などの設定が Dorothy2\user\netinst.ini に保存されます。

Irvine/Dorothy2: ThreadStorage

4 個のコメント»

しばらく前から作っていた threadstorage ブランチを master にマージしました。
実験的な機能で、問題があれば削除して元に戻すかも知れません。

2ch で話題になっていた、プロセスIDとスレッドIDでダウンロードスレッドの同定を行い、スクリプトごしにデータを受け渡す仕組みです。common_load() で使える形式に実装し、Dorothy2R 本体側にも標準のインターフェースを設けています。

Dorothy2R_done.dms (Dorothy2B.dms に相当)とか Dorothy2R_resp.dms が増えています。

Dorothy2\common\threadstorage.dms は多分単体でも使えると思います。

いまのところ意味があるのは Dorothy.fileName = 'remove'; のための処理と、getuploader_r だけです。

自分の環境では、基本のキューフォルダは Dorothy2R_a.dms のみ有効、getuploader_r 用のフォルダは Dorothy2R_a.dms と Dorothy2R_resp.dms を有効にして使っています。

Irvine: Dorothy2\common\additem.dms

3 個のコメント»

AddItem の解説。

Dorothy2 スクリプト内から Irvine に新しいキューアイテムを追加するオブジェクトです。
Read the rest of this entry »

DMonkey: for()で複数の変数を宣言するとグローバルに定義される

コメントなし»

http://peace.2ch.net/test/read.cgi/win/1394240473/715-719n より。

for (var a = xxx, y = yyy; ...; ) { ... } のように for() 文で複数の変数を宣言するとグローバル変数として定義されてしまいます。

function test () {
  for (var x = 0; false;) { }
  for (var y = 0, z = 'a'; false;) { }
}

var z = { a: 1 };
test ();
alert (typeof x);  // undefined
alert (typeof y);  // number
alert (typeof z);  // string

DMonkey: .call()/.apply() の問題点

コメントなし»
// このような関数を
Array.prototype.map = function (callback) {
  ~
};

// このように呼び出すと
Array.prototype.map.call ('foo', function (x) { ~ });

// 以降、map が勝手に fcfCall モードで動作してしまう
var a = [ ~ ].map (function (x) { ~ });

ただ、組み込みメソッドは .call.apply にアクセスしようとするとエラーになるので、DMonkey では「普通の呼び出し方でも .call() または .apply() でも使える」というメソッドはまず見かけません。

今回の例のようにポリフィルを実装するなら、.call.apply は使えないと説明しておけばよいと思います。

var s = new String ('foo');
s.map = Array.prototype.map;

のような呼び出し方であれば問題ないはずです。

なお、関数オブジェクトを this に割り当てようとすると Global に差し替えられるようです(詳細は未調査)。

今回の記事は勢いで書いたのでどこか間違いがあるかも知れないのでご注意下さい。

DMonkey: .call()/.apply() の挙動

コメントなし»

Property Accessors (関数オブジェクト以外は省略)

関数オブジェクト . プロパティ名

プロパティ名は prototypecallapply のみ使用できる。

call は関数オブジェクトの動作モードを fcfCall モードに変更し、関数オブジェクト自身を返す。

apply は関数オブジェクトの動作モードを fcfApply モードに変更し、関数オブジェクト自身を返す。

fcfCall モードの関数オブジェクトに対し .apply 演算を行うと fcfApply モードに変更される。逆も同じ。

function a () { }
alert (a === a.call);  // true

function b () { }
alert (b === b.apply);  // true

function c () { }
alert (c.call === c.apply);  // true
alert (c.call.apply.call.apply === c.apply.call.apply.call);  // true

関数オブジェクトを通常モードに戻す手段は、恐らくない。

なお、Bracket notation のつもりで

関数オブジェクト [ "call" ]

と書くと DMonkey の言語仕様により "call" を引数とした関数呼び出しが行われてしまうので、Dot notation でしかアクセスできない。

関数呼び出し

( ) (または [ ])

fcfCall モードの関数を引数付きで呼び出すと .call() の動作が実行される(第1引数が this、あれば第2引数以降が arguments)。

fcfApply モードの関数を引数付きで呼び出すと .apply() の動作が実行される(第1引数が this、あれば第2引数の配列が arguments)。

それ以外、つまり通常モードの関数や fcfCall モードまたは fcfApply モードの関数を引数なしで呼び出した場合は通常の関数呼び出しとして実行される(ただし this が何になるかは違いが出る)。

DMonkey: Math.abs(無限大)が0になる不具合

コメントなし»
alert (Math.abs (Number.POSITIVE_INFINITY));  // 0
alert (Math.abs (Number.NEGATIVE_INFINITY));  // 0

この 0 は整数型の 0 です。浮動小数点型の 0.0 ではありません。

DMonkey: NaN は真の値として評価される

コメントなし»

NaN は真の値として評価されてしまいます。

alert (NaN ? 't' : 'f');  // t

DMonkey: Number#int で強制エラーになることがある

コメントなし»
try {
  alert (9223372036854775296.int);
//alert (-9223372036854775296.int); でも同じ
}
catch (e) {
  alert ('error=' + e);
}

9223372036854775296 以上の数、または -9223372036854775296 以下の数の .int プロパティを参照すると、try catch で捕捉できないエラーが発生します。

dmonkey_invalid_floating_point_operation

もっとも .int を参照することは普通はないので気にしなくても平気だと思います。普通じゃないスクリプトを書くとしても何か役に立つことがあるのかは不明です。

  • Irvine カテゴリーの記事を表示しています。