call/ccの合成の解
以前の記事 ( call/ccの合成 - 標高+1m )で、やりたかったのはこういうことでした。
たまに便利なことがあると思う。
(define (compose-c/cc . fs) (letrec ((vals (list->vector (map (^ (f i) (f (lambda (res) (vector-set! vals i res) (when cont (cont))))) fs (iota (length fs))))) (cont #f)) (call/cc (lambda (k) (set! cont k))) (vector->list vals))) (console-log (apply string-append (compose-c/cc (^ (k) (timer (^ () (k "good")) 3) "hello ") (^ (k) (timer (^ () (k "bye")) 2) "world") (^ (k) (timer (^ () (k " :)")) 5) "!"))))
アップデート Update:
This is better.
(define (compose-c/cc . fs) (let* ((is (iota (length fs))) (vals (list->vector (map (^ (x) #f) is))) (cont #f)) (list->vector (map (^ (f i) (let1 v (call/cc f) (vector-set! vals i v) (when cont (cont)))) fs is)) (call/cc (lambda (k) (set! cont k))) (vector->list vals)))
call/ccの合成の訂正
前回の記事で色々と誤りがあったので訂正
biwaschemeのcall/ccの挙動に怪しいところがあるというのは間違いで、僕の理解が怪しかったのと、jsとのinterop周りで挙動がおかしくなっていた。 biwaschemeの継続の実装は問題ない様子。失礼しました。
もう一点、
call/ccを適用した関数内でUIに対するハンドラを書いて合成するパターンは、いろんな継続がいろんなタイミングで呼ばれてぐちゃぐちゃになるので、もう少し深く考える必要がある。
うまいやり方を発見したらまた書きます。
call/ccの合成
もう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
※いろんな継続が呼ばれてぐちゃぐちゃになることがある。
クラックリング -- パーカッシブなジャグリング
こんにちは、クラックラーのノリです。今日で26歳になりました。
今日は新しい遊びを発明しました。
木製の密なボールでパームジャグリングをするといい音が鳴ったので、リズムを作るようにわざと音を鳴らしてみた。
これがクラックリング:
ボールにアクリル絵の具を塗って、半乾きの状態でクラックリングすると、クラックルボールができる。
流行ってほしい!
パーカッシブなジャグリングには、Chuka chuksという先輩がいる。そちらも面白い。
嬉しいこと
妻が昔少しだけかじったポイを再開したので、家族全員で市内のジャグリングサークルに通っている。 公園に行くときもしょっちゅう、彼女はポイを回して僕はボールを投げている。
会話するLISP
スケッチ
Talking REPL. Common Lisp forms from SLIME are captured with Emacs Lisp and sent to Festival's old Scheme to be spoken. All communications are done in S-expression. Fun but not great. yet. pic.twitter.com/mrExwGJ3sJ
— Minori Yamashita (@ympbyc) February 19, 2019