scheme

「Clojureシンタックスハイライター開発から考えるこれからのLispに必要なもの」を発表しました

7/27に開かれたLisp Meetup #30で「Clojureシンタックスハイライター開発から考えるこれからのLispに必要なもの」というタイトルで話してきました。 Clojureシンタックスハイライター開発から考えるこれからのLispに必要なもの from sohta 内容としては、去…

麻雀の待ちを出力する問題を amb で

毎度流行りには乗り遅れる傾向にあるけど、麻雀の待ちを出力する例の問題をいまさら解いてみる。「バックトラックするだけの問題なら amb 使えば楽勝でしょ」と思って amb を使ってやってみたんだけど、思いのほかてこずった。しかも、なんだかうまく頭を切…

Gambitでクロージャをシリアライズ

できるよという話。Gambitに強力なシリアライズ機能が付いていることをyieldした途中の状態をファイルに保存とかって出来ますか - 崩壊現実-全てはvirtualに収束する-を見ていてふと思い出したので、クロージャを使って同じようなことを試してみた。 (define…

継続とマクロでお手軽ブレークポイント

継続によるプログラムの実行の中断・再開と、LOL の pandoric macro (クロージャに捕捉されている自由変数に、クロージャの外側からアクセスするためのマクロ) を組み合わせて簡単なブレークポイントっぽいものを作ってみました。 使い方 以下のようにして使…

Gaucheでシェルスクリプト

最近、Let Over Lambda (LOL) という本を読んでます。Let Over Lambda作者: Doug Hoyte出版社/メーカー: Lulu.Com発売日: 2008/04/30メディア: ペーパーバック購入: 1人 クリック: 14回この商品を含むブログ (6件) を見るLOLは、On Lispの発展(?)としてLisp…

漢数字を整数リテラルとして使えるようにする

漢数字で九九の表を作ってください。 ただし以下の条件をつけます。条件 一.アラビア数字(0〜9)禁止。 プログラムにも出力結果にもアラビア数字を含んではいけない。(全角・半角とも) 二.結果の数字は、「七」とか「一○」(=10)とか「六四」(=64)のよう…

Scheme どう書く?的

整列済みの number のリストがある。'(1 3 4 5 6 12 13 15)このようなリストで数が連続している部分は '(1 2 3) -> '(1 . 3) のように両端のみを書くような記法を導入する。最初の例のリストであれば以下のようになる。'(1 (3 . 6) (12 . 13) 15)このような…

SRFI 42でFizzBuzzとフィボナッチ

SRFI 42は、下のようにいろんなデータでのループに使うことができる。 gosh> (list-ec (: x 1 10) x) (1 2 3 4 5 6 7 8 9) gosh> (list-ec (: c "ABCDE") #`"char-,c") ("char-A" "char-B" "char-C" "char-D" "char-E") gosh> (list-ec (: x '#(1 2 3) '#(4 …

Brainfuckコンパイラ

id:mzpさんがBrainfuckインタプリタを作っていたので、なんとなくBrainfuckからSchemeへのコンパイラを作ってみた。こんな感じになってます。 (define (char->symbol c) (string->symbol #`",c")) (define (inst-name->cont name k) (lambda (x) (k `((,(cha…

13日の金曜日を数え上げる

今日から20013年12月31日までの、13日の金曜日とその総数を表示してください。 どう書く?org lequeさんのを参考に改変。list-ecを使ってるのに、さらにdropやfilterを使うのはなんだかもったいない気がするので。でも結局元のコードより長くなってるってい…

文字列に含まれる単語の最初の文字を大文字にする

文字列に含まれる単語について、それぞれの単語の最初の文字を大文字にしてください。たとえば、"LL future" と与えられたときは "LL Future" と出力する。"LL day and night" と与えられたときは "LL Day And Night" と出力する。 どう書く?org こんな感じ…

「こんなプログラムを書いてみよう」 in Scheme

文字列の集合{ BAB, AAB, BAA, AAA, ABA }があるとき、これらのすべてを1回ずつ含み、かつ、3文字の部分文字列としてはこれらの文字列しか含まない文字列は、BABAAABとBAAABABの2通りある。文字列の集合が{ BAB, AAB, BAA, AAA }のときは、そのような条件で…

コメントの削除

ソースコードからコメント部分を削除するプログラム decomment を書いてください. すくなくとも,decomment を記述したのと同じ言語で書かれているソースコードが 扱えるようにしてください. どう書く?org (use file.util) (define (main args) (dolist (…

チョコレートパズルを継続渡しで(30分で解けるようになった)

ペントミノ パズル(明治ミルクチョコパズル)をGaucheで解く(1時間で解けるようになった) - Gemmaの日記とのことなのでここは意地で対抗。id:Gemmaさんの初めのコードと同様、重複を除去してなかったのでそれを検討。いろいろ思案してたけど、よくよく考えて…

チョコレートパズルを継続渡しで

以前に作ったチョコレートパズルを継続渡しで解くプログラムを見つけた。せっかくなので載っけとく。継続を使ったサンプルプログラムって結構数が少なかったりする(と思う)ので、まぁ誰かの参考になれば嬉しい限り。チョコレートパズルについて詳しくは各自…

PLT Scheme version 4.0 is now available

PLT Scheme version 4.0 is now available from http://plt-scheme.org/This major new release offers many improvements over version 372, and we encourage everyone to upgrade. The Racket Blog とのこと。PLT Schemeはあんまり使ったことないけど、以…

与えられた木から、子→親への対応を作る

与えられた木から、子→親への対応を作るより。 (define (get-parent-alist tree) (define (rec root children) (append-map (lambda (child) (acons (car child) root (rec (car child) (cdr child)))) children)) (rec (car tree) (cdr tree))) 15分強。app…

Project おいら

Project Eulerにあらず。自分で思いついた問題を自分で解く試み。 というか、偶然直面した問題を、抽象化して手を加えたらパズルのような問題になったので、とりあえず解いてみたってだけ。非負整数を1個以上の0以上(または1以上)の整数の和の形で表す表し方…

Python風ジェネレータを限定継続で

ここでいろいろ議論されてる、call/ccを使ったジェネレータを勉強がてらに限定継続で書き直してみる。トリッキーな部分がなくなって、かなり素直に書ける。 (define (make-generator f) (let ((cont #f)) (lambda () (reset (if cont (cont #f) (f (lambda (…

StateモナドをSchemeで

id:syd_sydさんにモナドについて教わって、ようやくStateモナドを理解できたのでとりあえずSchemeで書いてみた。出力(?)と状態の組は多値で表現。 (define (>>= m f) (lambda (s0) (receive (a s1) (run-state m s0) (run-state (f a) s1)))) (define (run-…

call/ccとvalues

# valuesをcall/ccで定義できる理由がよく分かりません。誰か対応するcall-with-valuesを見せてください みずぴー日記 call/cc版valuesに対応するcall-with-valuesがどうやって定義されるのかはよく分からないですが、call-with-valuesがあると継続が複数の…

internal defineのすすめ

末尾再帰という考えを知って間もない頃、関数の内部で関数を定義することにまだ違和感を持っていたので、named letを知ってからしばらくは末尾再帰で書けるものは何でもnamed letで書いていた。internal defineに馴れてnamed let狂いの時期が過ぎた頃からち…

valuesの定義

多値を返す関数valuesは、R5RSにおいて下のようにcall/ccを使って定義されていることは比較的有名なことと思う。 (define (values . args) (call/cc (lambda (cc) (apply cc args)))) ところが、2,3年ほど前Schemeをやり始めた頃に使っていたMIT-Schemeでは…

applyの定義

mapやreverse、append等の関数を定義しなさい、という練習問題はSchemeの本であればどれでも載せているようなものだけれども、applyを定義させるような問題はあまり見かけないように思う。もちろん、「SICPの4章5章あたりでevalと一緒に嫌というほど実装して…