トップ «前の日記(2007-12-06) 最新 次の日記(2007-12-12)» 編集

Route 477



2007-12-07

[web] 今日のリファラ

画像の説明

な ん で!?

[詳細希望]

[javascript] サーバが一定時間応答しなかったら処理を打ち切る

探していたものとは違うものだけど、一応メモ。

ネタ元:

インデントが崩れているので直したものを貼っておきますね。

function callInProgress (xmlhttp) {
  switch (xmlhttp.readyState) {
  case 1: case 2: case 3:
    return true;
    break;
  // Case 4 and 0
  default:
    return false;
    break;
  }
}
function showFailureMessage() {
  alert('uh oh, it looks like the network is down. Try again shortly');
}
// Register global responders that will occur on all AJAX requests
Ajax.Responders.register({
  onCreate: function(request) {
    request['timeoutId'] = window.setTimeout(
                                             function() {
      // If we have hit the timeout and the AJAX request is active, abort it and let the user know
      if (callInProgress(request.transport)) {
        request.transport.abort();
        showFailureMessage();
        // Run the onFailure method if we set one up when creating the AJAX object
        if (request.options['onFailure']) {
          request.options['onFailure'](request.transport, request.json);
        }
      }
    },
    5000 // Five seconds
    );
  },
  onComplete: function(request) {
    // Clear the timeout, the request completed ok
    window.clearTimeout(request['timeoutId']);
  }
});

要するに、setTimeoutで「5秒たったら通信が完了したかどうかチェックする処理」を登録する、と。

[scheme] quasiquote(`)をRubyist的に説明してみる

quasiquote == #{}

quasiquoteは、Rubyでいう「#{}」みたいなもんです。

ふつーに '(a b c) と書くと、これは ('a 'b 'c) みたいにシンボルのリストになるんだけど、 バッククオート(`)を使って `(a b ,c) と書くと、,c のところに c の値が入る。 例えば c == 3 なら ('a 'b 3) というリストになるわけです。

Ruby:

c = 3
"a b #{c}"   #=> "a b 3"

Scheme:

(define c 3)
`(a b ,c)    ;=> '('a 'b 3)

ちなみに「`」とか「,」は別名があって、`(a b ,c) は (quasiquote a b (unquote c)) の省略記法であるとされています。

unquote-splicing == *ary

「,」は変数の値を埋め込みましたが、「,@」というのもあって、これは Rubyの「*」みたいにリストの中身を展開して埋め込みます。

Scheme:

(define d '(4 5))
`(a b ,c)    ;=> '('a 'b '(4 5))
`(a b ,@c)   ;=> '('a 'b 4 5)

Ruby:

d = [4, 5]
a, b = *d    #=> a=4, b=5

でっていう

OnLisp読書会で上のような比喩が発案されたらしいので、書いてみたかっただけ。

てか実装上は上のような単純な例はどうでも良くて、ネストしたquasiquoteとかがヤバげ。

とりあえず仕様書おいときますね [あとで読む]

[scheme] R6RSでは、「変数参照のようなマクロ」を定義できるらしい

ふつーのマクロは (somemacro a b c) みたいに、関数適用の形で呼び出すんですが、 R6RSでは identifier-syntax というものを使って「変数参照だと思ったら実はマクロ」 みたいなことができるらしい。

まずdefine-syntaxと組み合わせて、マクロを定義します。ここでは「p-car」という名前のマクロを定義してみます。 identifier-syntaxでは、普通の参照のときと、代入されるとき(set!の左辺に来るとき)の2種類のケースを定義できます。

(define-syntax p-car
  (identifier-syntax
    (_ (car p))
    ((set! _ e) (set-car! p e))))

このとき、p-carの参照や代入時にマクロ展開が起きて、こうなります。

(define p (cons 4 5))
p-car         ⇒ 4

(set! p-car 15)
p.car                   ⇒ 15
p                       ⇒ (15 5)

うん、面白いけど…何に使うんだろ…w

set!の動作がいじれるってのが肝なのかな。