2007-12-07
■ [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!の動作がいじれるってのが肝なのかな。