Code Aquarium

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

Racket

(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関数が…

(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…

(Racket) member-keyの話

とりあえずクラスの基本 racketではクラスは次のように作成します。 (define sub-class% (class super-class% (super-new) ...)) racketのクラスは単一継承で必ずなんらかのクラスを継承しなければなりません。この例では super-class%クラスを継承した sub-…

(Racket) Class の External Name Control

RacketのClassシステムの説明にある Internal / External Names がピンと来なかったので、サンプルを書いてみました。 公式ドキュメントでは 比較対象にJavaのprotectedを例にあげていますが、むしろ C++ の friend に近いような気がします。Racketのdefine-…

(Racket) generatorでFizzBuzz

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

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

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