2007-11-01から1ヶ月間の記事一覧
くるいざき?
Exercise 1.12. The following pattern of numbers is called Pascal's triangle.The numbers at the edge of the triangle are all 1, and each number inside the triangle is the sum of the two numbers above it.35 Write a procedure that computes el…
めずらしく英語のページを読む気になった。 Exercise 1.11. A function f is defined by the rule that f(n) = n if n 3. Write a procedure that computes f by means of a recursive process. Write a procedure that computes f by means of an iterative…
まだマクロが全然わかってないんだがとりあえずやってみたい気持ちが先行中(笑) ということで実装してみたのがこれ。 >>(define .. (lambda (x y) (let ((e (- y x -1))) (if (< e 0) () (iota e x))))) =>.. >>(.. 0 10) =>(0 1 2 3 4 5 6 7 8 9 10) >>(..…
まずは、shiroさんに教えてもらったGaucheのコード*1 (use util.match) (define qsort (match-lambda (()()) ((x . xs) (receive (l r) (partition (cut < <> x) xs) `(,@(qsort l) ,x ,@(qsort r))))))次になるべく似せたHaskellのコード import List qsort…
なんてことだ。gauche.sequence の group-sequenceがhaskellのgroupと同じだとは >>(use gauche.sequence) =>#<undef> >>(group-sequence '(1 1 2 3 3 2 2 4)) =>((1 1) (2) (3 3) (2 2) (4)) >>(map car (group-sequence '(1 1 2 3 3 2 2 4))) =>(1 2 3 2 4)あと、</undef>…
いつも忘れてしまうのでメモする importをghci中で用いるには :mをつかう。 Prelude> :m List Prelude List> あと hugsでは whereだが、 ghciではlet
そういえば今までrubyでは .sortをつかって知らない振りをしていたんだがrubyで書くとどうなるかやってみる。 >> def qsort(x) x.size<2?x:(y=x.shift;z=x.partition{|i|i<y};[qsort(z[0]),y,qsort(z[1])]) end => nil >> qsort([3,4,5,1,1,2]) => [[[], 1, [[], 1, [2]]], 3, [[], 4, [5]]] >> def </y};[qsort(z[0]),y,qsort(z[1])])>…
なるほど、カリー化とまでは行かないけど簡単に関数が作れるんだな。すごい。srfi-26 >>((lambda (x) (+ 1 2 x 4 5)) 6) =>18 >>((cut + 1 2 <> 4 5) 6) =>18 >>((cut + 1 2 <> 4 <>) 6 7) =>20 >>((cut <> 1 2 3 4 5) *) =>120よし、これでshiroさんのプロ…
しょうがないやるか。 >>(let ((x '(1 2 3 4))) `(a x c d)) =>(a x c d) >>(let ((x '(1 2 3 4))) `(a ,x c d)) =>(a (1 2 3 4) c d) >>(let ((x '(1 2 3 4))) `(a ,@x c d)) =>(a 1 2 3 4 c d) >>(let ((x 2)) `(a ,x c d)) =>(a 2 c d) >>(let ((x 2)) `(…
多値を使ったpartitionでqsortをしてみる >>(define qsort (lambda (x) (if (null? x) () (receive (l r) (partition (lambda (y) (< y (car x))) (cdr x)) (append (qsort l) (list (car x)) (qsort r)))))) =>qsort >>(qsort '(5 3 4 2 3)) =>(2 3 3 4 5)r…
filterとremoveを同時にやるpartitionを教えてもらったので使ってみようと思ったらなんと多値じゃないか。 なになに?参照渡しがどうのこうの・・・って schemeは参照渡しだよな。 >>(let ((a '(1 2 3))) (print a)((lambda (x) (filter! odd? x)) a) a) (1 …
とりあえずはこんなかんじらしい >> (match '(1 2 3) ((a b c) (list a b c))) => (1 2 3) >> (match '(1 (2 3)) ((a (b c)) (list a b c))) => (1 2 3)つぎに、リスト処理させてみる >>(match '(1 2 3 4) ((x . xs) (print x))) 1 =>#<undef> >>(match '(1 2 3 4) </undef>…
一つ違いzipによるuniq まあ、昨日のscheme版の焼き直し。haskellの方が読みやすいが数字しかuniq出来ない あと、メタな記号が入れられないので(今回は1000でごまかした)いまいち。 Prelude> (\x->reverse $ drop 1 $ reverse $fst $ unzip $ filter (\x->…
なんてことだ。mingwでコンパイルされたghci.exeはコマンドプロンプトではreadlineが動くが、cygwin上では動かない。 しょうがないのでrlwrapをかませてみる。.bashrcに以下を記述して解決 PATH=~/bin/ghc/bin:$PATH #ghcのバイナリへのパスを加える alias g…
一つずらしたリストとzipして同じ要素のタプルを削除するフィルターを通す版 更に追記。zipつかうとちょっとだけ富豪な気分 srfi-1のzipは少ない方で作るので (cons () x)がちょっとだけかっこわるい。 >> (define uniq (lambda (x) (unzip1 (filter (lambda…
リストから任意のものを抜き出すのはrubyだとselectだからと思って探してみると srfi-1のfilterがそうだった。 >> (define qsort (lambda (x) (if (null? x) () (append (qsort (filter (lambda (y) (< y (car x))) (cdr x))) (list (car x)) (qsort (filter…
なるほどな。dorリストつかうのか。 >> ((lambda (x . y) (print x y)) 1) 1() => #<undef> >> ((lambda (x . y) (print x y)) 1 2) 1(2) => #<undef> >> ((lambda (x . y) (print x y)) 1 2 3) 1(2 3) => #<undef> >> ((lambda (x . y) (if (null? y) "only x" "x and y")) 1) =></undef></undef></undef>…
http://d.hatena.ne.jp/n9d/20071120/1195568232で、shiroさんに教えて頂いたのでもう少しやってみる。 gauche.sequenceを使う方法 >> (begin (use srfi-1) (use gauche.sequence) (take (shuffle (iota 10)) 4)) => (8 9 5 0) append-mapを使う方法 やばい…
util.combinationsを教えてもらったので富豪で再チャレンジ。 http://practical-scheme.net/gauche/man/gauche-refj_158.html#SEC430 何故かわからないが順列という名であるのにnPrでr=nのときしか用意されていない。 >> (permutations '(1 2 3)) => ((1 2 3…
引数のリストと同じメンバーがいないような数字をランダムで出力するyを使用。 なんかletだらけになるのが気持ち悪い。 >> (let me ((x ())) (define y (lambda (x) (let me ((a x)) (let ((b (random-integer 10))) (if (memq b a) (me a) b))))) (if (> (l…
「必殺、括弧包み!」とつっこみたかっただけ。 Archives > October 25, 2007">「ワイは猿や!コンビネーター猿や!」 「必殺、包み包み!」
srfi-1はtakeの関係上いつも使いたいのでいれておく。 あと、irbの:SIMPLEタイプにプロンプトを変える。 (use srfi-1) (read-eval-print-loop #f #f (lambda (result) (print "=> " result "\n")) (lambda () (display ">> ")(flush))) (display "\nbye...\n…
以前から気になっていたんだが、irbのプロンプトに余計なものが出過ぎていたので.irbrcを以下のようにした。 IRB.conf[:PROMPT_MODE] = :SIMPLEこうするとマニュアルの記述はirbの出力だったことがわかる。 $ irb >> 1+2 => 3 >>
まだまだだ。 乱数はsrfi-27番。 (use srfi-1) (use srfi-27) (random-source-randomize! default-random-source) (display (let me ((i (iota 10 0)) (j 4)) (if (> j 0) (let ((k (random-integer (length i)))) (cons (list-ref i k) (me (delete k i) (-…
1.7からのArray#fetchが未チェックだったことが判明。 (ありがとうございます>id:winebarrel さん)ということで、書き直す。 #!/usr/bin/ruby class Array def [](i) self.fetch(i) end end a=Array[1,2,3] puts a[0] # =>1 puts a[2] # =>3 puts a[3] # =…