もうjsが書けない体になってしまったのでbiwaschemeでcall/ccとマクロを使いまくっている。 yharaさんありがとう。
biwaのcall/ccの挙動には怪しいところがある気がするけど細かいことは気にせずボヤっと動けば良い。
追記: call/ccの合成の解 - 標高+1m
いくつかテクニックをメモ。
call/ccを非同期処理に使う
非同期IOをブロッキングしているかのように書ける。(これは昔記事にした。)
(cdr (assoc 'data (call/cc (fetch "https://???.json"))))
call/ccの合成
call/ccを複数合成できる。魔法のよう。
(define (listen-change selector) (w/js-cont k ;;see gist (add-handler! selector "change" (lambda (e) (js-call k (.. e 'target 'value)))) ;;デフォルト値 (js-call k (.. (qsel selector) 'value)))) (define (execute-search name address date) ;; ...?name=<>&address=<>&date=<> ;; search) ;;説明のため冗長に書いた (execute-search (call/cc (listen-change "#name")) (call/cc (listen-change "#address")) (call/cc (listen-change "#date")))
↑ リアクティブに複数のinput要素の入力を繋げて検索を投げる例
biwaschemeはjsとのinteropに落とし穴がいくつかあるのでそれを避けるクラッジをいくつかこのgistに放り込んでおいた。
→ BiwaScheme glue functions · GitHub
ブラウザにemacsから繋ぐと便利。 Biwascheme from Emacs (with repl) · GitHub
※いろんな継続が呼ばれてぐちゃぐちゃになることがある。