2010/03/31

Hello World

ここの「Hello World」はすごい(笑)
これは「パターン指向リファクタリング入門」で見たJava以来すごい。
読みにくいので貼り付けてみると、こんな感じ。すごくパターンハッピーですね。気持ちはわかります。オブジェクト指向デザインパターンを覚えると必要ないところにまで使いたくなるんですよね、なぜか。なんか必殺技っぽいからでしょうか。

/* http://developers.slashdot.org/comments.pl?sid=33602&cid=3636102 */
public interface MessageStrategy {
    public void sendMessage();
}
 
public abstract class AbstractStrategyFactory {
    public abstract MessageStrategy createStrategy(MessageBody mb);
}
 
public class MessageBody {
    Object payload;
    public Object getPayload() {
        return payload;
    }
    public void configure(Object obj) {
        payload = obj;
    }
    public void send(MessageStrategy ms) {
        ms.sendMessage();
    }
}
 
public class DefaultFactory extends AbstractStrategyFactory {
    private DefaultFactory() {;}
    static DefaultFactory instance;
    public static AbstractStrategyFactory getInstance() {
        if (instance==null) instance = new DefaultFactory();
        return instance;
    }
 
    public MessageStrategy createStrategy(final MessageBody mb) {
        return new MessageStrategy() {
            MessageBody body = mb;
            public void sendMessage() {
                Object obj = body.getPayload();
                System.out.println((String)obj);
            }
        };
    }
}
 
public class HelloWorld {
    public static void main(String[] args) {
        MessageBody mb = new MessageBody();
        mb.configure("Hello World!");
        AbstractStrategyFactory asf = DefaultFactory.getInstance();
        MessageStrategy strategy = asf.createStrategy(mb);
        mb.send(strategy);
    }
}
パターン指向リファクタリング入門~ソフトウエア設計を改善する27の作法

プログラマは皆どのようにしてLisperと化して行くのか?

ハッカーと画家 コンピュータ時代の創造者たち

カッとなって書いた。今は後悔していない。ネタです。

追記

こっそりいくつか追加した。

初めての人のためのLISP[増補改訂版]

2010/03/30

Emacs S式操作

表を拝借。C-M-f, C-M-b, C-x C-e しか使ってない・・・。あー C-M-a, C-M-e, C-c C-l も使うか。
Key定義コメント
C-M-@, C-M-SPCmark-sexpこれでS式をマークできるので、切り取ったりコピーしたりする
C-M-hmark-defun関数をマーク
C-M-f, C-M-bforward-sexp, backward-sexpS式単位で移動
C-M-ttranspose-sexpM-t のS式版
C-x n dnarrow-to-defun現在の関数以外を不可視に。defun の奥深くからでも可能
M-(insert-parentheses括弧を挿入し、カーソルをその間に移動(□)
M-TABlisp-complete-symbol補完
C-M-abeginning-of-defun関数定義の先頭へ
Esc C-deletebackward-kill-sexp前の S 式を削除
C-M-kkill-sexpS 式 をkill
C-c C-eeval-expressionS式の評価
C-x C-eeval-last-sexp直前のS式の評価
C-c C-reval-regionリージョン内のS式の評価
  • C-x n d からの復帰は C-x n w
こちらからも表を拝借。
コマンド動作
C-x C-eカーソルのS式を評価
C-c C-eカーソルのS式を含むトップレベルのS式を評価
C-c C-lファイルをロード
C-c C-rリージョンを評価
C-c C-zSchemeのインタプリタが動いているバッファへフォーカスを移動

コマンド動作
M-C-f次のS式へ移動
M-C-b前のS式へ移動
M-C-aカーソルのS式を含むトップレベルのS式の先頭へ移動
M-C-eカーソルのS式を含むトップレベルのS式の末尾へ移動
M-C-d1つ内側のS式へ移動
M-C-u1つ外側のS式へ移動
M-C-SPCカーソルのS式の次のS式をマーク
M-C-tカーソルのS式の前後の式を交換

プログラミングGauche

UML, ER(Entity Relation)図エディタ, Database Diagram

UML、ERDのエディタで使い易いものはないでしょうか。Linuxで使えるものが良いです。
JUDE, NClass, DBDesignerは以前使っていました。

UML

Web-based

ERD

Web-based


参考


UMLモデリングレッスン 21の基本パターンでわかる要求モデルの作り方

2010/03/29

defmacro: fluid-let

マクロ
ほぼ写経ですが。

プログラミングGauche

defmacro: or

gensymはgenerate symbolでしょうか。
プログラミングGauche

syntax-rules: if

マクロとは式の変換です。 

プログラミングGauche

syntax-rules: when, unless

define-macroとdefine-syntax。

プログラミングGauche

defmacro: when, unless

実は、マクロについては「プログラミングGauche」をサラッと眺めただけだったりします。

プログラミングGauche

2010/03/28

member?, let/cc

こういうのもありかな。

The Little Schemer, 4th EditionThe Seasoned Schemer

TSS deep

The Seasoned Schemer 16章。

(deep 3)
; -> (((pizza)))

というような手続きを書け、とのこと。無理やり(?)fold-rightなんかで書いてみたり。

続きのdeepR, deepMなど。

The Seasoned Schemer

内包表記

この機構は豊富な操作手続を提供しているので、リストジェネレータとい うだけではなく、ジェネリックなループ構文(Common Lisp の loop マ クロ並みに強力/邪悪だという人もいます)を提供しています。
プログラミングGauche

TSS set!

The Seasoned Schemerの15章になって初めて出てきたset!。set!ってのはこういうのだよーという章。



The Seasoned Schemer

cond, and, or

1
2
3
4
(and a b)
; -> (cond (a b) (else #f))
(or a b)
; -> (cond (a #t) (else b))
The Little Schemer, 4th Edition

また出てきたYコンビネータ。Y!。

また出てきました。今度はThe Seasoned Schemerに。The Little Schemerでも9章で出てきました。理解できなくて散々書きました。
Yコンビネータは、いろんなサイトや解説記事を読みましたが、結局The Little Schemerが一番わかりやすかったです。The Seasoned SchemerではY!が出てきます。「!」ということで、副作用ありです。side effectです。その名もY-bang。ワイバーンみたい。
The Little SchemerThe Seasoned Schemer合わせて20章のうちで、初めて副作用が出てくるのが15章です。ここまで代入などを使わずにきて、急に使うことになるとさすがに気持ち悪く感じますね。

ちなみにY!が出てくるのは16章です。
Thunk you, Peter J. Landin.
だそうです。
1
2
3
4
5
6
7
8
9
10
11
12
(define Y!
 (lambda (L)
  (let ((h (lambda (l)(quote ()))))
   (set! h
    (L (lambda (arg)(h arg))))
   h)))

(define Y-bang
 (lambda (f)
  (letrec
   ((h (f (lambda (arg)(h arg)))))
   h)))
あれ、でも下のY-bangは副作用あるか?

そういえば、Yコンビネータはこれを見たときに、理解のきっかけになりました。
1
2
3
4
5
6
7
((lambda (f) 
   (f f 10)) 
 (lambda (f n) 
   (cond 
    ((< 0 n) 
     (print "hello") 
     (f f (- n 1))))))


The Seasoned SchemerThe Little Schemer, 4th Edition計算論 計算可能性とラムダ計算 (コンピュータサイエンス大学講座)

2010/03/27

敷金は結構な金額が返ってきたりする

以前、引っ越した際に「掃除や修繕等で、敷金はほとんど返ってこないと思って下さい。」と不動産屋さんに言われました。「そうなんですか。(そんなはずないやろ~)」と思って調べてみました。結果的には電話一本で7割くらい戻ってきました。

「『原状回復ガイドライン』に添った敷金の用途の明細を下さい。」というようなことを言っただけです。同じように言ったからといって、返ってくるとは限らないとは思います。ただ、この辺の事情を知っておくと交渉の余地があるかもしれません。
掃除代金や修繕費用は原則的には大家さんが負担しないといけない、などのガイドラインがあるとかないとか(ハッキリ覚えていませんが)。

あまりよく覚えていませんが、引越しの季節ですし、調べてみてはいかがでしょうか。

2010/03/26

確定申告に行ってきました

初めての確定申告。遅ればせながら行ってきました。本来は15日までだったのですが、諸事情により今日行ってきました。特に問題なく、すぐに終わりました。10分もかからなかったかもしれません。15日を過ぎているので人が少なくて、逆によかったかも知れません。

必要なものは
  • 源泉徴収票
  • 通帳 or キャッシュカード
  • 保険料の納付書(などの証明できるもの)
  • 生命保険の書類
ぐらいでしょうか。

append1, append

昨日TLで見かけたので。いろいろ書いてみるつもりでしたが、たいして差のないコードばかりになりました。やはりfold系は、余計なことを考えなくて済むので好きです。
recur, letrec, named-let, cps, let/cc, fold, fold-right など。


追記

unfold, unfold-right


プログラミングGauche

MCTSのカード


先日、財布と一緒に掲題のカード無くしたんだけど、再発行できるのかな。
そうそう、こういうカード↓。


srfi さーふぃ

srfiは「さーふぃ」(とか「するふぃー」)と読むらしいですね。つい先日まで「えすあーるえふあい」と読んでましたよ。わりと長くそう読んでいたので、第一声で「さーふぃ」と私の口から出ることはまずありません。
はてな住人がかかわったものに、id:higepon 氏が、CGIライブラリさえポータブルに書けないという事実に奮起して作られた、SRFI 98: An interface to access environment variables がある
ところでこれって、何で書かれているのでしょうか。Schemeで書かれているのでしょうか。Schemeで書かれていないのでしょうか。どこかにソースが落ちていたりするのでしょうか。

念のため確認。SLIBは「えすりぶ」で良いですよね。まさか「すりぶ」とか「すりびー」とか「すらいぶ」とか。SLIB・・・、traceしか使ったことないです。

追記

ん?ん?
もしかして、srfiって仕様だけで実装は処理系任せ的な?

追記2

Ω ΩΩ<な、なんだってー

プログラミングGauche

2010/03/25

cycle

リストを受け取り、そのリストの要素を先頭から順に返す(全ての要素を返したら、再びリストの先頭を返す)関数を返す関数cycle
こうかな。

circular-listってのがあるのか。中はどうなってんだろう。
let1, if-let1, rlet1, and-let*, fluid-let ...
The Seasoned Schemer

filter-break

ストlisと述語手続きpredを取り、lisの各要素に順にpredを適用して、 predが真の値を返したら直ちにその要素を返すような関数find

The Seasoned Schemer

find-fold/cps

ですです、これです!目が回ります・・・。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
;http://cametan-001.tumblr.com/post/470529715/cps-rt-valvallow
(define (find-fold/cps pred?/cps proc/cps seed lis cont)
  (null?/cps lis
      (lambda (result)
        (if result
     (cont seed)
     (pred?/cps (car lis)
         (lambda (result) ;テキストじゃここが抜けてる。ここがないとダメ。
         (if result
      (proc/cps (car lis)
         seed
         (lambda (seed2)
           (find-fold/cps pred?/cps proc/cps seed2 (cdr lis) cont)))
      (find-fold/cps pred?/cps proc/cps seed (cdr lis) cont))))))))


まあ、ホントの事言うと、プログラミングGaucheのあの例が適切で分かりやすいもの選んでるのか、って言うと疑問なんですけどね。
これは私も、もちょっとシンプルな例はなかったのかなー、と思いました。
書けたとしても書く気にはなれないコードだなと。

プログラミングGauche

auto-complete.el




ちょうど、補完候補の選択が↑↓でしかできないのは、どうやったら変更できるかなー。と思っていたところでした。
(define-key ac-complete-mode-map "\C-n" 'ac-next)
(define-key ac-complete-mode-map "\C-p" 'ac-previous)
(custom-set-faces
 '(ac-candidate-face ((t (:background "dark orange" :foreground "white"))))
 '(ac-selection-face ((t (:background "gray25" :foreground "white")))))
色は適当にこの辺で。

memo, call/cc, named let, do

1
2
3
4
5
6
7
8
9
10
(define (my-reverse ls)
  (let/cc return
   (let ((r #f))
     (let ((l ls) (acc '()))
       (let/cc continue
        (set! r continue))
       (and (null? l) (return acc))
       (set! acc (cons (car l) acc))
       (set! l (cdr l))
       (r '())))))

Scheme:
;; named let
(define (my-reverse ls)
  (let loop ((l ls) (acc '()))
    (if (null? l)
        acc
        (loop (cdr l) (cons (car l) acc)))))
 
(display (my-reverse '(1 2 3 4 5)))
(newline)

;; do
(define (my-reverse ls)
  (do ((l ls (cdr l))
       (acc '() (cons (car l) acc)))
      ((null? l) acc)))

(display (my-reverse '(1 2 3 4 5)))
(newline)

(define (my-reverse ls)
  (do ((l ls (cdr l))
       (acc '() (cons (car l) acc)))
      ((null? l) acc)
    (for-each (lambda (x)
  (for-each display x)
  (newline)) `(("l => " ,l) ("acc => " ,acc)))))

(my-reverse '(1 2 3 4 5))


Output:
1
2
3
4
5
6
7
8
9
10
11
12
(5 4 3 2 1)
(5 4 3 2 1)
l => (1 2 3 4 5)
acc => ()
l => (2 3 4 5)
acc => (1)
l => (3 4 5)
acc => (2 1)
l => (4 5)
acc => (3 2 1)
l => (5)
acc => (4 3 2 1)
1
2
3
4
5
6
7
(define (depth* l)
  (let loop ((e l) (d 1) (acc '(1)))
    (if (null? e)
 (apply max acc)
 (let ((kar (car e)))
   (let ((recur (if (pair? kar) (depth* kar) 0)))
     (loop (cdr e) (+ d recur) (cons d acc)))))))
1
2
3
4
5
6
(define (leftmost l)
  (let/cc skip
   (let loop ((l l))
     (let ((kar (car (if (null? l) (skip l) l))))
       (cond ((pair? kar) (loop kar) (loop (cdr l)))
      (else (skip kar)))))))
1
2
3
4
5
6
7
8
9
10
11
12
13
14
(define (filter* pred? l)
  (let loop ((l l))
    (if (null? l)
 '()
 (let ((kar (car l))
       (kdr (cdr l)))
   (let ((fd (loop kdr)))
     ;; let/cc (あるいは call/cc) をここに被せる
     (let/cc skip
      (cons (cond ((pair? kar) (loop kar))
    ((pred? kar) kar)
    ;; 脱出
    (else (skip fd)))
     fd)))))))

プログラミングGauche