標高+1m

Don't be rational

call/ccの合成の解

compose-c/cc

やりたかったのはこういうことでした。

たまに便利なことがあると思う。

(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)
                                  "!"))))

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を非同期処理に使う

非同期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

S式しか書きたくない

ult screenshot

I want to only write S-expressions.

どんな言語もS式から浅くトランスパイルして書けば、とりあえずマクロは使い放題になる。

Any language, if you write it through a thin transpiler from S-expression, will have true macros.

リストとマクロさえあれば、あとははっきり言っておまけみたいなものだ。
といっちゃあ言い過ぎか。

If I have lists and macros, everything else seem like a small treat. Maybe that's too bold a thing to say.

マクロとCLOSでうまいことトランスパイラを書く工夫をしている。 その途中のメモ。

I'm figuring out a neat way to write those thin transpilers in CL using macros and CLOS.

ともあれ、今こんなことをしている場合ではないのだ。

But I really should not be doing this now. As you can probably tell.

gist.github.com