scheme

例の問題

効率とか気にしない感じで。 (use srfi-1) (use srfi-42) (define (candidates xs n) (if (>= 1 n) (map list xs) (append-map (lambda (x) (map (cut cons x <>) (candidates xs (- n 1)))) xs))) (define (solve n) (list-ec (: e (candidates '("A" "C" "…

fizzbuzz

お正月なのでてきとーに。 (use srfi-42) (use srfi-1) (define-class <fb> () ((default :init-keyword :default) (word :init-keyword :word))) (define (make-fb i) (make <fb> :default i :word "")) (define-method add ((self <fb>) (i <integer>)) (cond [(= (slot-ref sel</integer></fb></fb></fb>…

差分リストを作ることを試してみた。

全部実装していないけど。ベンチマークに必要な分だけ実装。 差分リストについて 差分リストはリストのようなもの。appendがO(1)でできるのがlistとの違い データ構造 cons snoc append listから変換 listに変換 リスト O(1) O(N) O(N) - - 差分リスト O(1) …

lambda式についてリストについて

lispはリストというとすぐにリストを思い浮かべる。リストというのはこういう構造。consを重ねて創り出して、carとcdrで分解する。 ;; cons (list 1 2 3) ; => (1 2 3) (cons 1 (cons 2 (cons 3 '()))) ; => (1 2 3) (use srfi-1) (cons* 1 2 (cons 3 '())) …

部分継続の利用例。

めも。 途中でreturn (use gauche.partcont) (use util.match) (define (times xs) (fold * 1 xs)) (times '(1 2 3)) ; => 6 ;; (times '(1 2 0 "foo")) ; => *** ERROR: operation * is not defined between "foo" and 0 (define (times/pc xs) (fold (lamb…

継続とか全然理解してなかった

(個人用のメモ。gauche前提の話)本当は探索用の手続きだったけれど、本質とは関係ないのでもっと単純な例で書くことにする。以下のようなコードがあるとする。 (define (rec n) (let loop ((i 0)) (unless (> i n) (print i) (loop (+ i 1))))) (rec 4) ;; ;…

某所での問題の回答

N=1のとき無限ループしないようにcuteを使うと良さげ。 (use util.list) (define (overlaps xs n) (unfold (any-pred null? (compose null? cdr)) (cut take* <> n) (cute drop* <> (max 1 (- n 1))) xs)) (overlaps '(0 1 2 3 4 5 6 7 8 9) 2) ; => ((0 1) …

ぷよぷよ19連鎖の問題

ぷよぷよ19連鎖の問題をschemeで解いてみた。最近書いていなかったので何か手続的な書き方になってしまっているかも? (use srfi-42) (use gauche.experimental.ref) (use gauche.experimental.app :only ($)) (use gauche.experimental.lamb) (use gauche.s…

ご飯食べられないみたい。

これに集中していたわけじゃないけれど、5時間ちょっとかかった。 (かと言って、これに集中すれば3時間以内だったかというと…)今更。 http://www.itmedia.co.jp/enterprise/articles/1004/03/news002.html 麻雀のルールが分からないので何とも。色々調べたけ…

再帰を使う以外に書けない。

行っている内容はリストの要素を走査して木をつくるというもの 減少したらそこで打ち切り 要素の値が深さを決めるのではなく、現在の値との大小関係 実行結果 (list->tree '(1 1 1 1)) ; => (1 1 1 1) (list->tree '(0 1 1 2 2 1 1 2 1 0)) ; => (0 (1 1 (2 …

部分継続便利だなー。

(define (generator$ iterator$) (let ((cont-storage #f)) (define (make-next cont) (lambda () (let/cc return (step cont return)))) (define (step cont return) (set! cont-storage (lambda (x cont*) (return x (make-next cont*)))) (cont)) (make-n…

Longest Duplicated Substring

http://programmingpraxis.com/2010/12/14/longest-duplicated-substring/ だいぶpythonの書き方が分かってきた。きれいに書こうとしない方が逆に綺麗になる。python。 どこからでも値が変えられるというのは、やっぱり副作用も便利だなと思ったり。

String Subset

http://programmingpraxis.com/2010/11/23/string-subsets/ import operator import collections def is_str_subset(sub, base): D = collections.defaultdict(lambda : 0) for c in list(base): D[c] += 1 for c in list(sub): D[c] -= 1 if D[c] < 0: retu…

Maximum Sum Subsequence

http://programmingpraxis.com/2010/12/03/maximum-sum-subsequence/ def max_subseq(xs): prev_max, cur_max = 0,0 for x in xs: tmp = x+prev_max if prev_max >= 0 else x cur_max = max(tmp, cur_max) prev_max = tmp return cur_max L=[31, -41, 59, 26…

From Letters

http://programmingpraxis.com/2010/11/30/form-letters/ import re def from_letters(message, seq): def repl(m): i = int(m.group(2)) return m.group(1)+seq[i] return re.sub(r'([^\$])\$(\d+)', repl, message) S = """ Welcome back, $1! We hope tha…

srfi-1の関数をだいたいelispで書いた。

エキスパートpythonのメタディスクリプタの部分をschemeで書いてみる。

結果の値として出しているのはちがうけれど…。こんな感じなのかな? maybe-monad$はメイビーモナドじゃないかも。失敗したら止まるようなループみたいな感覚で付けただけなので。

pythonのデコレータについて

結構面白い。 def dec(fn): return lambda x, *arg, **kw : fn(x-1,*arg,**kw) @dec def f(n): print "input: %d" % n return 1 if n<=0 else n * f(n-1) print f(10) # input: 9 # input: 7 # input: 5 # input: 3 # input: 1 # input: -1 # 945 これは結局…

パターンマッチみたいなことをするプログラム(schemeで)

http://d.hatena.ne.jp/tana-laevatein/20101111/1289483291 ちょっと面白そうだったのでやってみました。 matchという名前にするとutil.matchと名前が被ってしまうので@matchという名前にしました。*1 (define (@match xs ys) (let/cc break (define (colle…

継続使ってgeneratorもどき

終了しないのが問題。

左から削る。右から削る。

srfi-1/unfoldの使い方としておもしろいかなと思ったので紹介。 (use srfi-1) (use gauche.experimental.lamb) (define (truncarting-l xs) (unfold null? identity cdr xs)) (define (truncarting-r xs) (unfold null? reverse cdr (reverse xs))) (truncar…

srfi-42の紹介(loopマクロ:scheme版のような)

はじめに 多くの言語はちょっとしたループを回すような処理を手軽に記述する方法を持っています。CLにはloopマクロ*1がありますし、pythonやhaskellなどはリスト内包表記などを持っています。ちなみにschemeにもそんな方法があります。srfi-42で定義されてい…

gl.processing途中経過 (愚痴っぽい。長文であまり価値がない。たぶん)

前書き 今の作業の延長線上に開発のゴールが見えないような気がした。今までprocessingと対応づけるように機能を充実させてきたけれど、実装が進むにつれて、基盤としているopenglとprocessingとの際による挙動のズレが大きくなってきた。そのズレは強引に修…

増減できるカウンタの作成

久しぶりにscheme自体で遊んでみました。ふと、オブジェクトの状態に対するアクセサを多値で返すという風にしていくとどうなるだろうと思ったのでやってみました。 クロージャの利用 よくクロージャの実例としてカウンタの作成が引き合いにだされます。 例え…

gauche-packageを利用したgaucheの拡張モジュールの作り方

この記事で作ったモジュールのリポジトリはgithubにあります。http://github.com/podhmo/gauche-perlinnoise はじめに gaucheにはschemeで書かれたモジュールの他にCで書かれた拡張モジュールがあります。 拡張モジュールを作る足場を作るためのツールが実は…

拡張モジュールの作り方を説明しようと思います。

gaucheの拡張モジュールの作り方を調べていてわかったことなどをまとめようと思います。 まとめようと思った理由は、ネット上で見つかる拡張モジュールの作成のためのドキュメントが難しいという印象を受けたからでした。 Gauche:拡張ライブラリ入門 Cで書く…

openglのblendについて

glBlendFuncに渡す引数の数が多すぎて把握しきれていない。 glのコードをラッピングはしていないけれど、とりあえずblendingもできるということで。 code (use gl.processing) (with-simple-draw (200 200) (blend-info) (background 0 0 0) (gl-enable GL_B…

マルチテクスチャについて

意外と簡単でした。(もっとオプションが色々あるのかもしれませんが) draw-mixed-shapeで2つのtextureを混ぜ合わせて表示できます。 まだオプションの部分に直接GL_REPLACEなどのglの引数を直接与えていますが、いずれ:typeA :replaceなどにしようと思いま…

座標系によるtextureの上下反転について

textureは座標系によっては上下が反転してしまうことがあるみたい。 例えば、このようなコードを書いてデフォルトの座標系で画像を表示した際には、上下が正しく表示される。 (use gl.processing) (define texture #f) (define draw (draw-once$ (^ () (with…

無事複数枚の画像が表示できました。

前々からテクスチャを読み込む機能は加えていたのだけれど、なぜか2枚のテクスチャを生成した際には 2枚目のテクスチャが表示されないので困ってました。今日テクスチャを3枚にしてみたら、2枚目までが表示されていました… というわけで、バグが取れたので無…