2010/09/30

おめでとうございます!「『Scheme手習い』(The Little Schemer, 4th edition)10月23日発売予定」

めでたい!今年は Lisp 本が豊作ですね!
『Scheme手習い』(The Little Schemer, 4th edition)、印刷所に入稿。10月23日発売予定。 http://bit.ly/bokZZk




追記

MIT の教科書 "計算機プログラムの構造と解釈" (昔は構造と実行) を読む為の本だったそうである。
まじか!

追記2


Scheme手習い

2010/09/27

unfold の cons が指定できても良いような

そんなことを思ったのでメモがてら。


追記

@valvallow (define(accrec-right p f g c s :optional(t'()))(let l((s s)(a t))(if(p s)a(l(g s)(c(f s)a))))) unfoldとunfold-rightの最後の引数は意味が違いますよ
(define (accrec-right p f g c s :optional(t'()))
   (let l ((s s)(a t))
     (if (p s)
         a
         (l(g s)(c (f s) a)))))

(accrec-right null? car cdr cons '(1 2 3 4 5) '(0))
;; (5 4 3 2 1 0)

このオプション引数の指定のやり方、知りませんでした。。
それに、unfold、unfold-right の引数も確認しました。
ありがとうございました!!

追記2

これは Hylomorphism になるのかなあ: 「unfold の cons が指定できても良いような」 http://valvallow.blogspot.com/2010/09/unfold-cons.html
ヒロモーフィズム?ハイロモーフィズム?何と読むんでしょうか。。初めて聞きました。
意味はわかりませんが、
「アナモルフィズム」(anamorphism)
「アポモルフィズム」(apomorphism)
とかいった言葉は srfi-1 のドキュメントで目にしたことがあります。

追記3

leque さんのコメントより。ありがとうございます!
『関数プログラミングの楽しみ』ではリストに対する hylomorphism を次のような感じで定義しています。
(define (hylo f e p g h seed)
  (fold-right f e (unfold p g h seed)))

(define (fact n)
  (hylo * 1 (cut = <> 0) values (cut - <> 1) n))
おお。なんかカッコイイ!

こんな感じでも良いのかな。
(define (fact n)
  (hylo * 1 zero? identity (lambda (n)
                             (- n 1)) n))

(define (fact n)
  (fold * 1 (unfold zero? identity (cut - <> 1) n)))


プログラミングGauche

Re: comp.lang.scheme で簡単なリスト操作のお題が出ておるな。

comp.lang.scheme で簡単なリスト操作のお題が出ておるな。 http://goo.gl/5GAm
ということで、やってみました。Scheme(Gauche)です。

以下コード。


追記

教えて頂きました!いつもありがとうございます!
@valvallow (use gauche.sequence)(use srfi-1)(define(key-sorted-combine lst)(map(pa$ append-map cdr)(group-collection lst :key car)))
(use gauche.sequence)
(use srfi-1)
(define (key-sorted-combine lst)
  (map (pa$ append-map cdr)
       (group-collection lst :key car)))

(define data
  '((0 a b) (1 c d) (2 e f) (3 g h) (1 i j)
    (2 k l) (4 m n) (2 o p) (4 q r) (5 s t)))

(key-sorted-combine data)
;; ((a b) (c d i j) (e f k l o p) (g h) (m n q r) (s t))
group-collection 要チェックや!

そういえば、以前 group-sequence は見た記憶が。。

The Little Schemer, 4th Edition

2010/09/23

番号付き部分適用 cutn

srfi-26 の cut を使ってると (cut list 1 <0> 3 <1> 4) って書けたら・・・なんて思います。衛生的なマクロではありませんが、試しに書いてみました。

使用例はこんな感じ。<...> は考慮していません。あと、(cutn list <0> <1> (* <0> <0>)) のようなネストしたものは cut 同様考慮していません。

(最後の例が微妙な気もする)

cutn のコードはこちら。


うーん。

LET OVER LAMBDA Edition 1.0

ドット対をリストに変換する

基本的には終端を空リストにしたリストを返します。一応 terminal-fun にて終端を指定できるようにしました。
コードは以下の通り。


プログラミングGauche

先日書いた defmacro! がバグっていたので

先日書いたものがバグっていたので、修正しようとしましたが解決できず・・・。
バグは、defmacro! で可変長引数が取れないというものです。
例えば、
(defmacro! (sum . args) ...
とした時に args を filter して o! シンボルを g! シンボルに置き換えようとするところで、args がまだシンボルのままであるためエラーになるというものです。よって、その処理を書く場所に気をつけて評価順序を制御すれば良いだろうと思って修正を試みていたのですが、なかなかうまくいかず。。悔しいれす(^p^)



猫好きながら猫アレルギーにより鼻水ダラダラを理由に今日は一旦諦めます。。

追記

勘違いだったようです。というか見当違いでした。filter の引数に非リストを渡していたからっぽい。全然見当違いの修正を数時間やってました。。ご飯食べてお風呂入って、再度コードを見たらあっけなく・・・。




LET OVER LAMBDA Edition 1.0

2010/09/22

Emacs ポップアップ辞書

何これ便利すぎだろ!!(笑)
単語の上で C-c p




追記

教えてもらいました!ありがとうござます。
sdic-inline.el,sdic-inline-pos-tip.elもいいですよ!
なるほどこれも便利そうだ!

Emacsテクニックバイブル ~作業効率をカイゼンする200の技~

`',hoge は `(quote ,hoge)

実用 Common Lisp (IT Architects’Archive CLASSIC MODER) P.272
イディオム「`',fn-names」はコメントする価値がある。最初は混乱するかもしれないが、よく使用されるイディオムである。等価な形式 `(quote ,fn-names) のほうが、理解しやすいかもしれない。
これはわかりやすい。

実用 Common Lisp (IT Architects’Archive CLASSIC MODER)

PAIP の pipe でエラトステネスの篩(ふるい)

実用 Common Lisp (IT Architects’Archive CLASSIC MODER) 9.3 P.263 ~。
遅延評価による無限集合の例。遅延リストとしてのpipe。Scheme(Gauche)で書いたこともあり、コードは書籍とは若干違います。

pipe を用いたエラトステネスの篩。


delay と force による pipe


クロージャによる pipe



実用 Common Lisp (IT Architects’Archive CLASSIC MODER)

Common Lisp の /=

Common Lisp の /= は、(complement =) ってことですか。
で、これ何て読むのよ・・・。

COMMON LISP 第2版