2010/02/11

gauche fold,reduce,fold-pair,unfold

どんなもんかなーと。

;; Gauche ユーザリファレンス: 10.2 srfi-1 - List library http://practical-scheme.net/gauche/man/gauche-refj_102.html#SEC310
;; Making The Road Wiki - Programming::Scheme::SRFI1 http://ow.ly/13jo0
;; fold
(fold +
      0
      '(1 2 3 4 5))
; -> 15
(fold cons
      '()
      '(1 2 3 4 5))
; -> (5 4 3 2 1)
(fold (lambda (e l)
        (display (format "~a : ~a" e l))
        (newline)
        (cons e l))
      '()
      '(1 2 3 4 5))
;; 1 : ()
;; 2 : (1)
;; 3 : (2 1)
;; 4 : (3 2 1)
;; 5 : (4 3 2 1)
;; (5 4 3 2 1)
;; fold-right
(fold-right cons
            '()
            '(1 2 3 4 5))
; -> (1 2 3 4 5)
(fold-right cons
            '()
            '(5 4 3 2 1))
; -> (5 4 3 2 1)
(fold-right (lambda (e l)
              (display (format "~a : ~a" e l))
              (newline)
              (cons e l))
            '()
            '(1 2 3 4 5))
;; 5 : ()
;; 4 : (5)
;; 3 : (4 5)
;; 2 : (3 4 5)
;; 1 : (2 3 4 5)
;; (1 2 3 4 5)
;; pair-fold
; [SRFI-1] fold および fold-right と同様ですが、kons 手続き は与えられた clist の car ではなく、cdr をとります。
; Gauche ユーザリファレンス: 10.2 srfi-1 - List library http://practical-scheme.net/gauche/man/gauche-refj_102.html#SEC310
(use srfi-1)
;; pair-fold
(pair-fold (lambda (e l)
             (display (format "~a : ~a" e l))
             (newline)
             e)
           '()
           '(1 2 3 4 5))
;; (1 2 3 4 5) : ()
;; (2 3 4 5) : (1 2 3 4 5)
;; (3 4 5) : (2 3 4 5)
;; (4 5) : (3 4 5)
;; (5) : (4 5)
;; (5)
(use srfi-1)
;; pair-fold-right
(pair-fold-right (lambda (e l)
                   (display (format "~a : ~a" e l))
                   (newline)
                   e)
                 '()
                 '(1 2 3 4 5))
;; (5) : ()
;; (4 5) : (5)
;; (3 4 5) : (4 5)
;; (2 3 4 5) : (3 4 5)
;; (1 2 3 4 5) : (2 3 4 5)
;; (1 2 3 4 5)
;; reduce
; ridentityが使われるのはlistが空の場合だけです。
; Gauche ユーザリファレンス: 10.2 srfi-1 - List library http://practical-scheme.net/gauche/man/gauche-refj_102.html#SEC310
(reduce + 100 '(1 2 3 4 5))
; -> 15
(reduce + 100 '())
; -> 100
(reduce (lambda (e l)
          (display (format "~a : ~a" e l))
          (newline)
          (cons e l))
        "list is null"
        '(1 2 3 4 5))
;; 2 : 1
;; 3 : (2 . 1)
;; 4 : (3 2 . 1)
;; 5 : (4 3 2 . 1)
;; (5 4 3 2 . 1)
(reduce (lambda (e l)
          (display (format "~a : ~a" e l))
          (newline)
          (cons e l))
        "list is null"
        '())
; -> "list is null"
;; unfold p f g seed &optional tail-gen
;; (unfold p f g seed tail-gen) ≡
;; (if (p seed)
;; (tail-gen seed)
;; (cons (f seed)
;; (unfold p f g (g seed))))
; http://practical-scheme.net/gauche/man/gauche-refj_102.html#SEC310
(unfold null?
        car
        cdr
        '(1 2 3 4 5))
; -> (1 2 3 4 5)
(unfold null?
        (lambda (x)
          (cons (car x)(car x)))
        cdr
        '(1 2 3 4 5))
; -> ((1 . 1) (2 . 2) (3 . 3) (4 . 4) (5 . 5))
       
(display (unfold null?
                 (lambda (x) x)
                 cdr
                 '(1 2 3 4 5)))
; -> ((1 2 3 4 5) (2 3 4 5) (3 4 5) (4 5) (5))#<undef>
(unfold null?
        (lambda (l)
          (* (car l)(car l)))
        cdr
        '(1 2 3 4 5))
; -> (1 4 9 16 25)




















; fold, fold-right
(fold (lambda (x y z)
        (display (format "x = ~a, y = ~a, z = ~a\n" x y z))
        (+ x y z)) 0 '(1 1 1) '(1 1 1))
;; x = 1, y = 1, z = 0
;; x = 1, y = 1, z = 2
;; x = 1, y = 1, z = 4
;; 6
(fold (lambda (m n o r)
        (display (format "m = ~a, n = ~a, o = ~a, r = ~a\n" m n o r))
        (+ m n o r)) 0 '(1 1 1) '(1 1 1) '(1 1 1))
;; m = 1, n = 1, o = 1, r = 0
;; m = 1, n = 1, o = 1, r = 3
;; m = 1, n = 1, o = 1, r = 6
;; 9
(fold-right (lambda (x y z)
              (display (format "x = ~a, y = ~a, z = ~a\n" x y z))
              (cons x (cons y z))) '() '(1 2 3) '(a b c))
;; x = 3, y = c, z = ()
;; x = 2, y = b, z = (3 c)
;; x = 1, y = a, z = (2 b 3 c)
;; (1 a 2 b 3 c)





プログラミングGauche

speedtest タイピングゲーム

すごく懐かしいものを見つけたのでやってみました。当時もだいたいこんなもんだったような気がします。

WS0899

WS0900

何度もやってこんなもん↑でした・・・。

320pointsとかどんだけっすか。

git checkout は vss で言う「最新を取得」

ということでいいのかな。しきりにpullしてましたよ。
git checkout head filename
評判良さげな入門gitでも買うか・・・。gitの本って他にも出てるんですね。
誰かオススメ教えてください・・・。
入門git 入門Git

こっちは近日発売?
実用Git

取り合えず少し置いてみました。

追記

あれ・・・、巻き戻したいい場合はrevert?

追記2

今回の場合はcheckoutでよかったみたいです。

参考

参考2

コメント欄で教えていただきました。

2010/02/10

gist embed


なんか知らんが2個表示されるな。
; fact
(value '(((lambda (f)
            (f f))
          (lambda (f)
            (lambda (n)
              (cond ((zero? n) 1)
                    (else (((lambda (f)
                              (f f))
                            (lambda (f)
                              (lambda (n m)
                                (cond ((zero? m) 0)
                                      (else (((lambda (f)
                                                (f f))
                                              (lambda (f)
                                                (lambda (n m)
                                                  (cond ((zero? m) n)
                                                        (else ((lambda (n)(add1 n)) ((f f) n ((lambda (n)(sub1 n)) m))))))))
                                             n ((f f) n ((lambda (n)(sub1 n)) m))))))))
                           n ((f f) ((lambda (n)(sub1 n)) n)))))))) 5))
; y
(lambda (g)
  ((lambda (f)
     (f f))
   (lambda (f)
     (g (lambda (x)
          ((f f) x))))))
; dbl
(value '(((lambda (g)
            ((lambda (f)
               (f f))
             (lambda (f)
               (g (lambda (x)
                    ((f f) x))))))
          (lambda (f)
            (lambda (n)
              (cond ((zero? n) n)
                    (else (add1 (add1 (f (sub1 n))))))))) 5))






git リポジトリ削除

実用Git

2010/02/09

condの=>

以前@aharisuさんから聞いたことあったな。これは忘れる。忘れるというか憶えれない。
(cond (#f => (lambda (b)
               (not b)))
      ((list 'a 'b) => (lambda (a)
                         (display (cadr a))))
      (else 0))
; -> b#<undef>
(test expr …)
(test => expr)
(test guard => expr)
(else expr expr2 …)
 
2番目の形式であれば、exprがまず評価されます。 exprは引数をひとつ取る手続きを返さねばなりません。 続いて、testの結果がその手続きに渡され、その手続きの戻り値がcond形式の 評価値となります。

プログラミングGauche

member?

The Little Schemer のmember?
(define member?
  (lambda (a lat)
    (cond ((null? lat) #f)
          ((eq? a (car lat)) #t)
          (else (member? a (cdr lat))))))
The Little Schemer のmember? その2
(define member?
  (lambda (a lat)
    (cond ((null? lat) #f)
          (else (or (eq? a (car lat))
                    (member? a (cdr lat)))))))
もっとすっきり書くには?
(define member?
  (lambda (a lat)
    (eq? a (find (lambda (e)
                   (eq? a e)) lat))))
こんな感じか?
(define member?
  (lambda (a lat)
    (any (lambda (e)
           (eq? a e)) lat)))
Scheme手習い

2010/02/08

sxmlとminiKANRENの中の人

The Reasoned Schemer の miniKANRENの中の人とsxmlの中の人が同じらしいですね。

The Reasoned Schemer

KPF第五回勉強会やってきた



約200日ぶりという、かなり久しぶりのKPFでした。
内容はshunsukさんの記事をご覧ください。


やはり楽しいですKPF。
とにかく皆さんしゃべるしゃべる(笑)

blogに書くことやtwitterで話すことと内容が同じでも、みんなと面と向かって話せるというのが楽しいんですよね。
別に高度であったりマニアックな話でなくても良いんです。

例えば、ネットでFizzBuzzが話題になってれば「これやってみよーぜ!」「じゃオレSchemeで書いてみる!」「じゃオレRuby!」とか、Y Combinatorの記事がホッテントリに入ってたから「自分もやってみたけど、さっぱりわかんなかった」「なにそれなにそれ」とか、「Haskell始めました」とか「Emacs派ですか?vi派ですか?」とか、「Android買ったよー!」「触らせてー!」とか、「Scala始めたんだけど、Androidでも動いたよー」とか、「GAEでClojure動いたよー」とか「感電した」とか「感電した」とか。

で、
ΩΩΩ<すげぇぇぇぇ!
とか
ΩΩΩ<なにそれうまいの?
って面と向かってワイワイ話せるのが楽しいんです。


ということで、身近に同好の士がいらっしゃらない方はサークル感覚で勉強会を始めてみてはいかがでしょうか。

しかしKPF、次回の開催は未定です(笑)

9LISP - 010


次回は2010/02/20(土)です。