Scheme

買った本

ダブルブリッド X / 中村恵里加 ISBN:9784048670654 狼と香辛料 VIII 対立の町 〈上〉/ 支倉凍砂 ISBN:9784048670685 冲方丁のライトノベルの書き方講座 / 冲方丁 ISBN:9784796663595 はこぶね白書 (6) / 藤野もやむ ISBN:9784861275012 ブレイブ・ストーリ…

買った本とCD

プログラミングGauche / Kahuaプロジェクト, 川合史朗 ISBN:9784873113487 BEST SOFTWARE WRITING / Joel Spolsky, 青木靖 ISBN:9784798115818 ハッカー宣言 / マッケンジー・ワーク, 金田智之 ISBN:9784309243481 輪環の魔導師 2 / 渡瀬草一郎 ISBN:9784840…

大富豪の格差を計算してみる

日常の数学シリーズ。 大富豪(地域によっては大貧民とも呼ばれるトランプゲームの一種→Wikipedia:大富豪)で、カードの交換後に大富豪と大貧民で持っている2の枚数の期待値がどれくらいかを計算してみた*1。Pocket Schemeで。 fugo.scm ; 人数 players: 4 ;…

n == n + 1

ときどきの雑記帖経由、2007-11-25 - プログラミング日記 Pythonクイズ。以下を満たすnの値は何でしょうか?>>> n = ??? >>> n == n + 1 True

再帰的な無名関数

次の関数は再帰的な関数だ。 (define fact (lambda (n) (if (= n 0) 1 (* n (fact (- n 1)))))) この関数は内部で自分自身を呼び出しているので、普通の方法では無名関数として定義できない。こういう場合、不動点オペレータというものを使うと以下のように…

tinyscheme/Manual.txt 超訳

http://wataru.aoisakura.jp/tdiary/?date=20070905#p01興味があったので僕も訳してみました。以下気になったところを列挙してみます。 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; > "Safe if used as prescribed" "マニュア…

SchemeでFizzBuzz

まずは普通に。ちなみにこれは電車の中でPocket Schemeを使って書きました。 #!/usr/bin/gosh (define (fizzbuzz) (let loop ((i 1) (r ())) (if (> i 100) (reverse! r) (loop (+ i 1) (cons (cond ((zero? (modulo i 15)) "FizzBuzz") ((zero? (modulo i 3…

ToySchemeアップデート(ちょっとだけ)

最近のid:carbuncleさんの活動にインスパイアされてToySchemeを少し改良した。 #fと()の分離 引数の数チェックの為だけに存在していたクラスを削除 Javaで実装していた組み込み関数のうちSchemeで書けるもの(and, or, while, begin, list, append, reverse, …

define-syntax遊び

潜伏中だけどちょっとだけ。g:nozom:id:nozom:20061024

ToyScheme-0.5

define-syntaxがようやくまともに動くようになったので公開しておこう。 ToyScheme-0.5.zip コミット漏れがあった ToyScheme-0.5.1.zip (こっそりSubversionリポジトリも公開中)。define-syntax以外にも、quasiquoteを実装し直したり、新たにSyntaxクラス…

フィボナッチ数列のCPS(継続渡しスタイル)変換

以前書いたフィボナッチ数列のCPS変換について聞かれたので、改めて解説してみようと思う。まずは普通の再帰版 ;; List.1 (define (fib n) (if (or (= n 1) (= n 2)) 1 (+ (fib (- n 1)) (fib (- n 2)))))この中で末尾再帰になっていない部分を取り出すと、 …

ToyScheme 0.4 released.

SParser改めToySchemeのver 0.4を公開した。 長いこと放置していたけど、この前継続の実装方法についてid:carbuncleさんと話しているうちに、例外で大域脱出する必要がないことに気が付いたので久しぶりにいじってみた。 あと少しだけテストケースを用意した…

Cで継続渡し(末尾最適化バージョン)修正版

以前のバージョンは、アセンブラを使っていた名残で、void*とintが同じサイズであるという移植性のない仮定をしていたので修正した。 変更点としては、キャストの代わりにunionを使うようにしただけ。 fib.c #include <stdio.h> #include <stdlib.h> #include "obj.h" int main(</stdlib.h></stdio.h>…

Cで継続渡し(末尾最適化バージョン)

Cで継続渡しを書いてから、もう少しがんばれば末尾最適化もできそうだということに気付いて、やってみたらなんとかできた。しかも、絶対にアセンブラが必要だろうと思っていたんだけど結果的にはアセンブラに頼らずにCの範囲内で実現することができた。さす…

Javaで継続渡し

id:carbuncle:20060317を見て面白そうだったので、Javaで継続渡しを書いてみた。 public interface Continuable { public Object applyN(Continuable cont, Object[] args); }public class NullContinuation implements Continuable { private static NullCo…

One-Shot Continuations

"Representing Control in the Presence of One-Shot Continuations"という論文があるのを知った。 Traditional first-class continuation mechanisms allow a captured continuation to be invoked multiple times. Many continuations, however, are invok…

KAWAでデフォルトの出力形式をreadable-schemeにする方法

~/.kawarc.scmに以下を追加。 (if (eq? (static-field <kawa.Shell> 'defaultFormatName) #!null) (invoke-static <kawa.Shell> 'setDefaultFormat "readable-scheme"))ちなみに、shellが起動した後ではこの技は使えないので次のようにする。 (define (set-display-format format) (l</kawa.shell></kawa.shell>…

はじめてのGaucheプログラミング

スパムフィルタにbogofilter + KAKASIを使っているのだが、最近誤判定が多くなった。原因はマルチパートのメールなので、適当なMIME展開のフィルタプログラムを書けばいいと思い、Perlのライブラリを調べたけどありすぎてよく分からなかった。そこで、最近Sc…

sortの続き

id:maoe:20060201:1138822944ああ、そうか。partitionを使えば良かったんだ。というわけで、partitionを使って書き直すとこうなった。 (define (sort lst cmpfn) (let rec ((lst lst)) (cond ((null? lst) '()) ((null? (cdr lst)) lst) ((null? (cddr lst))…

Schemeネタ×2 from はてなダイアリー

はてなダイアリーのSchemeキーワードを眺めていたら、気になる話題があったのでコメントします。 Re: http://d.hatena.ne.jp/brazil/20060131/1138692196 関数型プログラミングとオブジェクト指向プログラミングの比較をしていて、その内容には概ね同意なの…

KAWAのappend-mapにバグ?

開発中のプログラムが不可解なところで暴走する原因を追っていたら、どうやらKAWAのバグらしいものを見つけてしまった。 再現する最小のコードは以下の通り。 (require 'list-lib) (define (foo x) (cond ((= x 0) '(a)) ((= x 1) '(b)) (else '()))) (appen…

マクロでtarai回し 5回目

引数に0が含まれるときにも動くように修正した。 tarai-mac.scm #! /usr/bin/env gosh (define-syntax tarai (syntax-rules () ((_ (%x ...) (%y ...) (%z ...)) (tarai "loop" (%x ...) (%y ...) (%x ...) (%y ...) (%z ...))) ((_ "loop" (%x1 %x2 ...) (%…

マクロでtarai回し 4回目

さらに修正したら状態数がまた少し減った。あと地味にバグがあったのを直した。 (define-syntax tarai-r/o (syntax-rules () ((_ 0 %x %y %z %k ...) (tarai-r/o "force" %x (tarai-r/o 1 %y %z) %k ...)) ((_ 1 %y %z %x-value %k ...) (tarai-r/o "force" …

マクロでtarai回し 2回目

また今度と言ってから8時間しか経ってないけど、どうやらできたみたいなので公開。まず、普通の関数で引数の評価を遅らせることを考えてみる(r/oはregular order=正規順序の意味)。 (define (tarai-r/o x y z) (let ((x-value (force x)) (y-value (force y)…

マクロでtarai回し 3回目

zを評価するタイミングはもっと遅らせられることに気付いたので、元にする関数をちょっと修正した。 (define (tarai-r/o x y z) (let ((x-value (force x)) (y-value (force y))) (if (<= x-value y-value) y-value (tarai-r/o (delay (tarai-r/o (1- x-valu…

マクロでtarai回し

id:nozom:20060116#1137365062で載せたtarai関数版がそもそも間違っていた。 (define (tarai x y z) (if (< x y) y (tarai (tarai (1- x) y z) (tarai (1- y) z x) (tarai (1- z) x y))))不等号は<ではなくて<=が正しい。このせいで、(1 1 1) (2 2 2)…などが…

Schemeのマクロ

define-syntaxで定義するSchemeのマクロ(Hygienic=健全な、参照上透過的)は最初理解できなかったけど、慣れるとなかなか楽しい。define-syntaxは式の変形パターンを指定すると勝手にパターンマッチングをやってくれる。ということでいくつか例を挙げてみる。…

SchemeからJavaの機能を呼び出す

The Kawa language frameworkを使うと、SchemeからJavaの機能を呼び出すことができる。 (事例1) Kawaで提供されていない機能をJavaの標準ライブラリを使って実装する Kawaはあまりライブラリが充実しているとは言えない。その代表的なものが正規表現によるマ…

Kawaを使ってJavaとSchemeを相互に呼び出す

概要 Kawaを使うとSchemeプログラムをコンパイルしてJavaから呼び出したり、逆にSchemeプログラムの中からJavaのクラスを使ったりできる。 Kawaのインストール kawa-1.8.jarをダウンロードしたら適当なところに置いてクラスパスを通すだけ。一応、RPMパッケ…

SParser-2.3

http://fhuman.esys.tsukuba.ac.jp/~nozom/SParser-2.3.zip主な変更点: Evaluatorを導入して、各オブジェクトの持っていたeval()をEvaluatorに集約した quasiquote(`)、unquote(,)、unquote-splicing(,@)を実装 let、lambdaで新しい変数束縛が作られない大バ…