標高+1m

Don't be rational.

call/ccの合成

もうjsが書けない体になってしまったのでbiwaschemeでcall/ccとマクロを使いまくっている。 yharaさんありがとう。

www.biwascheme.org

biwaのcall/ccの挙動には怪しいところがある気がするけど細かいことは気にせずボヤっと動けば良い。

いくつかテクニックをメモ。

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

※いろんな継続が呼ばれてぐちゃぐちゃになることがある。