Code Aquarium

minazoko's blog -*- 水底のブログ -*-

Scheme

(Racket) トップレベルbeginの継続が捕捉できない

仕様?バグ? #lang racket (define cc '()) (begin (display 'A) (call/cc (lambda (k) (set! cc k))) (display 'B)) (cc) ;; なにも表示されない。 call/ccの継続は (display 'B) を実行してトップレベルへ戻る処理の筈。だけど保存しておいた継続を実行し…

(Racket) composeマクロ

composeマクロを作る 関数合成を行うcomposeは通常関数で提供されます。それをマクロで作るとどうなるかという話。昨日即興で書いた物が全然ダメダメだったので再挑戦です。使用するのは syntax-rules。 compose1 と compose Racketには2つのcompose関数が…

(Scheme) syntax-rulesの引数が1つのパターンは省略できる?

前からあやふやだったので確認してみた。 これでandマクロが作れるのは違和感がある。 (define-syntax myand (syntax-rules () ((_) #t) ((_ e1 e2 ...) (if (not e1) #f (myand e2 ...))))) (_ e1 e2 ...) が引数2つ以上を表すならば、上のマクロ定義では…

(Racket) draw-text における文字回転

draw-textによる縦書きは、文字列を分割して一文字ずつ置いていくのが簡単です。ただしカタカナの長音記号は横棒のままになっていますので、文字を回転して描画します。 回転したい文字の中心に座標原点を移動 (set-origin) さらに座標系の回転(rotate) そし…

(Racket) 無名関数をcutで評価

lamda式等で無名関数を作り即時評価するコードは次のようになります。 ((lambda (x y) (* x y)) 5 7) ;=> 35 このように無名関数のコードが短ければいいのですが長くなると適用される引数をずっと後ろの方に書く事になり可読性が下がります。 ((lambda (x y)…

(Racket) values->list マクロとか

無いっぽいので... (define-syntax values->list (syntax-rules () ((_ vs) (call-with-values (thunk vs) list)))) (define-syntax values->vector (syntax-rules () ((_ vs) (call-with-values (thunk vs) vector)))) (define-syntax values->hash (syntax…

ifマクロ

Gaucheでifマクロを書いてみた。 マクロ名は if だとアレなので %if とする。 当然ながら if case cond といった分岐用特殊形式の使用は禁止。 else無指定への対応すると煩雑になるので2つに分けています。 (define-macro (%__if test then else) `((assoc-…

(Gauche)バブルソート

今読んでいる数学ガールガロア理論がバブルソートにちょっとだけ触れていました。 考えてみるとバブルソートは何となく概要を知っている程度で、実装した記憶がありません。振り返るとバブルのつもりが結局挿入ソート的な物を書いて終わってることが多いよう…

(Gauche) sort における #"|a|" の(?) 謎挙動

[追記] 本件、早々に突っ込みをいただきました。 @mnzktw #"|a|" は只の定数文字列"|a|"になるので、比較関数が引数に関わらず定数値を返しているためだと思います。多分意図したのは #"~|a|" じゃないでしょうか。— Kilo Kawai (@anohana) 2014, 10月 11#"|…

(Gauche) 2chお題「そろばんAA」

2ちゃんねるプログラム板 プログラミングのお題スレ Part5 より 252 名前: デフォルトの名無しさん [sage] 投稿日: 2014/10/08(水) 21:14:41.09 ID:QOSwbYHc お題: 整数n(0<=n<1000000)をソロバンのAAに変換するプログラムを書け n=9563なら ######## #oo|…

(Racket) generatorでFizzBuzz

racketにもgeneratorライブラリがあるので、前回のgaucheのコードを移植……しようとした。しかしracketのgeneratorは汎用ストリームのように使うには、どうにも使いづらかった……。 steramとの相互変換が出来ればもっと楽できそうなんだけど。 #lang racket (r…

(Gauche)generatorでFizzBuzz

毎度似たような FizzBuzzを書いていますが、gaucheでgeneratorを使ったバージョン。無限リストを3本作ってマージするこの方式は、n f b を受け取った後、n をとるか f b をとるかの判定部分が泥臭くなります。 今回はパターンマッチを使って多少はすっきり…

ClojureのスレッドマクロをSchemeで

Clojureのマクロ -> と ->> のScheme版です。動作確認はRacketでしましたが、syntax-rulesしか使ってないので他の処理系でも動くかな? apply->とapply->>は補助用のヘルパマクロです。似たような構造が並んでいるので共通部分を共通化することも考えました…