標高+1m

Don't be rational.

call/ccの合成の解

compose-c/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さんありがとう。

www.biwascheme.org

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

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

クラックリング -- パーカッシブなジャグリング

f:id:ympbyc:20160107133932j:plain
crackle balls

こんにちは、クラックラーのノリです。今日で26歳になりました。

今日は新しい遊びを発明しました。

木製の密なボールでパームジャグリングをするといい音が鳴ったので、リズムを作るようにわざと音を鳴らしてみた。

これがクラックリング:

youtu.be

ボールにアクリル絵の具を塗って、半乾きの状態でクラックリングすると、クラックルボールができる。

流行ってほしい!

パーカッシブなジャグリングには、Chuka chuksという先輩がいる。そちらも面白い。

https://www.chukachuks.com/

Jongler à Foix

balls

仕事でパリ、ライデン、フォワに行ってきた。

フォワはフランスのピレネー山脈の麓の町で、古いお城がある。 仕事が終わってから1日あったので、ジャグリングをした。 通りでやっていたらギターを持った男がきて、音を鳴らしてくれた。

Thank you everybody.

動画: youtu.be

最近ジャグリングを再開していて、ちょくちょく短い動画をinstagramに載せています。

www.instagram.com

会話するLISP

スケッチ