結城浩のSICP日記 RSSフィード

2006-05-30

filterとstring-filter filterとstring-filter - 結城浩のSICP日記 を含むブックマーク

selectでフィルタを読んでいるうちに「Schemeではどうするの?」と思ってごそごそ調べました。

SRFI-13にはそのものずばりのstring-filterというのがありました。

(use srfi-13)

(string-filter "HelloWorld" char-upper-case?)
;=> HW

もっと汎用のfilterも使ってみましょう。

(use srfi-1)

(filter char-upper-case? (string->list "HelloWorld"))
;=> (H W)
  • 大文字かどうか調べる: char-upper-case?
  • 文字列を文字のリストに変換: string-list
  • 述語が真の要素のみを集めたリストを作る: filter
  • 文字列のうち特定の文字のみを集めた文字列を作る: string-filter

追記:rui314さんから、「総称関数としてのfilter, filter-to」の存在を教えていただきました。総称関数なので型の制約をするりと抜けて総称的な操作ができますね。ただし、SRFIではなくGauche依存のコードになります。いちいちリストに落とし込まなくてもよいのは便利ですね。ご指摘ありがとうございます。

(use gauche.collection)

(filter char-upper-case? "HelloWorld")
;=> (H W)

(filter-to <string> char-upper-case? "HelloWorld")
;=> HW

(filter-to <list> char-upper-case? "HelloWorld")
;=> (H W)

(filter-to <vector> char-upper-case? "HelloWorld")
;=> #(H W)

Continuation Passing Style Continuation Passing Style - 結城浩のSICP日記 を含むブックマーク

自分がこのSICP日記で書いたContinuation Passing Styleのプログラムを読み返していて「うーん、いまこれを書けといわれても書けるだろうか」と不安になりました。(^_^;;

でもそれと同時に「このSICP日記をはじめから読み返せば書けるかも」と思い直しました。

自分の思考の記録を残しておくってよいことかもしれませんね(…という思いが、ブログで勉強しましょうシリーズの源になっているのかな)。

それにしても「はてなダイアリーライター」は便利だ。私の思考にぴったりフィットしている。すごくうれしいぞ。

rui314rui3142006/05/30 21:42Gaucheの場合、<string>はコレクションクラスのオブジェクトなので、gauche.collectionモジュールのfilter手続きを使うことができます。これだとコレクションをリストにしなくて済みます。
(use gauche.collection)
(filter char-upper-case? "Hello, World")
;; => (#\H #\W)
結果をリスト以外の型で得たい場合、filter-toを使えます。
(filter-to <string> char-upper-case? "Hello, World")
;; => (#\H #\W)
http://gauche.sourceforge.jp/doc/gauche-refj_164.html

トラックバック - http://sicp.g.hatena.ne.jp/hyuki/20060530