!kiyoka.blog.2011_03 RSSPLAIN

Related pages: !kiyoka.blog.list
55555553333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333303333444444444444444444440444555555555555555555555555555555555555205555555555555555555551555555555555555555555555555555555555505
5

kiyoka日記。NendoSekkaの開発や、最近思うことなど

5

最新10件!kiyoka.blog   過去記事一覧!kiyoka.blog.list

5

kiyoka.blog_header 

5

このブログを書いている人: 西山 清香(kiyoka) - twitter: @kiyokaEXT

5

5

 

5

 

3

kiyoka.2011_03_31[Nendo][Scheme] syntax-rulesの実装中。難航中。

3

オレ処理系のNendoについての開発メモ。

3
 SYKjVO
3

chibi-scheme 0.3のer-macro-expanderとsyntax-rulesをそのままNendoに移植中。

3

今は、make-syntactic-closureをどう実装していいかわからないので、正解を探しているところ。

3

 

3
 syntactic-closuresEXT
3
 Macros offer a way to extend the Scheme language by introducing new
3
 forms of syntax that are transformed into the simpler base
3
 language. Since Scheme's syntax is defined in terms of Scheme objects
3
 -- lists & symbols, mainly --, one would imagine that procedures that
3
 perform such transformations, known as macro transformers, should be
3
 easy: they just operate on lists & symbols, especially in the presence
3
 of quasiquote. However, this is not quite the case: macros need to
3
 also be aware of the underlying lexical scoping of the programs they
3
 transform. This article will not go into the need for that; see my
3
 article hygiene-versus-gensym for discussion of that matter. Macros
3
 need to work with more than S-expressions: they need S-expressions
3
 annotated with lexical scoping information.
3
 (以下略)
3

 

3

この文章を読んでも、具体的にどう実装すればいいのかわからん。

3

MIT Schemeとchibi-scheme 0.3のソースをじっくり読めばわかるのだろうか。

3

 

3

多分、クロージャを作ってそのレキシカル環境でバインドした変数名を返せばいいのだろう。

3

で、それは具体的にRubyでどう実装すればいいのかという問題。

3

受け取ったシンボルを、グローバル環境で(gensym)した変数名に代入してから、その(gensym)したシンボルを返してもいけるかも。

3

 

3

ちなみに、今の嘘実装はこれ。

3

(er-macro-expanederとsyntax-rulesはchibi-scheme 0.3のコードそのまま動いたので、本ブログへの引用は省略)

3
(define (make-syntactic-closure mac-env use-env identifier)
3
  (let* ([id-str     (symbol->string identifier)]
3
         [alias-data (assq-ref id-str mac-env)])
3
    (if alias-data
3
        (string->symbol (car alias-data))
3
        identifier)))
3

グローバルバインドされたシンボル(ifなどの予約語)は別名 /nendo/macroenve/if などを返し、

3

それ以外の未定義のシンボルは、そのままシンボルを返している。

3

 

3

簡単な例では一見動いてように見える。

3
(define-syntax nil!
3
  (syntax-rules ()
3
    ((_ x)
3
     (set! x '()))))
3
nendo> (define a 1)
3
3
nendo> (macroexpand '(nil! a))
3
(/nendo/macroenv/set! a (/nendo/macroenv/quote ()))
3
nendo> (nil! a)
3
()
3
nendo> a
3
()
3

 

3

試しに、以下のchibi-schemeのcutの定義はそのまま通るので、動かしてみた。

3
(define-syntax %cut
3
  (syntax-rules (<> <...>)
3
    ((%cut e? params args)
3
     (lambda params args))
3
    ((%cut e? (params ...) (args ...) <> . rest)
3
     (%cut e? (params ... tmp) (args ... tmp) . rest))
3
    ((%cut e? (params ...) (args ...) <...>)
3
     (%cut e? (params ... . tmp) (apply args ... tmp)))
3
    ((%cut e? (params ...) (args ...) <...> . rest)
3
     (error "cut: non-terminal <...>"))
3
    ((%cut #t (params ...) (args ...) x . rest)
3
     (let ((tmp x)) (%cut #t (params ...) (args ... tmp) . rest)))
3
    ((%cut #f (params ...) (args ...) x . rest)
3
     (%cut #t (params ...) (args ... x) . rest))))
3
(define-syntax cut
3
  (syntax-rules () ((cut args ...) (%cut #f () () args ...))))
3
(define-syntax cute
3
  (syntax-rules () ((cute args ...) (%cut #t () () args ...))))
3

 

3

[expandしてみる]

3
(pretty-print
3
 (macroexpand
3
  '(map (cut + 1 <>) '(1 2 3 4))))
3

 

3

[結果]

3
(map
3
 (let
3
  ((tmp 1))
3
  (lambda
3
   (tmp)
3
   (+ tmp tmp)))
3
 ('
3
  (1 2 3 4)))
3

ヒドい。なんでもかんでもtmpになる

3

 

3

勿論、計算結果もでたらめ。

3
nendo> (map (cut + 1 <>) '(1 2 3 4))
3
(2 4 6 8)
3

 

3

まだまだ挑戦は続くのであった。

3

 

0

comment (disabled)

3

 

3

3

 

3

 

4

kiyoka.2011_03_10[Sekka] Sekka 0.8.5 リリース

4

SKKライクな日本語入力メソッド Sekka 0.8.5をリリースしました。(リリースノート Sekka.ReleaseNote)

4
 NbpKsE
4

 

4

version 0.8.5

4
辞書中の「数字+単位」の変換をサポート
4
 例)
4
 "20ko" → "二十個" や "20個" など
4
 "5kagetu" → "5ヶ月" や "五ヶ月" など
4
 "10gatu10ka" → "10月10日" や "10月10日" など
4
数字文字列を漢数字に変換する
4
 "123450000" → "123450000" や  "一二三四五〇〇〇〇" 、 "一億二千三百四十五万" に変換するなど
4
バグ修正
4
sekka.el: 変換確定動作で、メジャーモードのfaceを上書きしてしまうバグを修正した。
4

 

4

やっと「数字+単位」の変換ができるようになりました。

4

個人的には欲しい機能はほとんど入ったので、今後辞書の更新もあまり無いでしょう。

4

Sekkaの開発でNendo処理系に足りないところがたくさん見付かったので、しばらくNendoを補強する作業に戻る予定です。

4

Sekka 0.9.x 系ではバグフィックスと、新しいNendo処理系への追従くらいになると思います。

4

 

0

comment (disabled)

4

4

 

4

 

5

kiyoka.2011_03_07[Life] R君語録

5

R君、2歳半になっていろんな言葉を覚えた。おもしろいのでその一部を紹介。

5

 

5
 えがめ → 眼鏡
5
 ままご → 卵
5
 おぺと → ポテト
5
 はうんこ → 半分こ
5
 しっだうん → sit down
5
 ぐっじょぶ → good job!
5
 ぴっぴー → tea please(おかわり全般に使う)
5
 まえもん → ドラえもん
5
 もにょ → ポニョ
5
 でーしゃ → 電車
5
 ででーしゃ → 自転車
5
 てぃんかんちぇん → 新幹線
5
 おいか → トミカ
5
 いかく → 四角
5
 しっぱーこ! → しゅっぱーつ!
5
 しゅっぱい → 失敗
5
 めーしゃい → ごめんなさい
5
 ありとう → ありがとう
5
 いーく → ミルク
5
 たーしゅ → トーマス
5
 かーしー → パーシー(機関車トーマスの登場キャラ)
5
 かーしー → お菓子
5
 とっぱっと → トップハム・ハット卿(機関車トーマスの登場キャラ)
5
 はなぱっか → はなかっぱ
5
 えーむ → ゲーム(iPod touchのこと)
5

 

5

全体的に最初の子音が抜けるのは基本なのかな?

5

英語がちょくちょく混じるのは、ピジョンの英語系のプレスクールに行っているせいだ。

5

good job!と言って褒められた時は、なんか変な気分だったぞ。

5

 

5

あと、ポニョの歌とトーマスの歌を歌うのだけど、ちゃんと日本語バージョンの歌詞を歌うときもあれば中国語バージョンらしき歌詞に切りかえるときもある。

5

なぜかポニョの歌は倍速が基本のようだ。

5

 

2

COMMENTKolawole

I feel so much hapepir now I understand all this. Thanks!

0

comment (disabled)

5

5

 

5

 

5

kiyoka.2011_03_06[オープンソース] 個人プロジェクトこそTDDでやるべき

5

個人プロジェクトは、プライベートな空き時間にちょっとづつ開発を進めていくというスタイルが大半だろう。

5

そういう場合こそ、TDDを積極的に使おう。

5
 UKvA7I
5

 

5

TDDの一番大きなメリットは、プロジェクトに戻る時の心理的障壁が低いこと。

5

これは、自分のプライベートな時間を使って自主的に進めていくプロジェクトでは、特に重要だ。

5

全てを頭の中にいれてなくてもプロジェクトに戻って、コードに手を入れることができるので、気軽にコードを変更できる。

5

大量のテストケースが、コードを守ってくれているおかげだ。

5

 

5

時間が細切れになり、まとまった時間があまり取れない場合は、特にTDDのメリットを感じることができる。

5

ドカッとまとまった時間が取れる場合は、TDDのメリットが見えにくいかもしれないが、それでも数日後にプロジェクトに戻る時の負荷が非常に少ない。

5

自分の場合は一番下位レイヤーの数行のライブラリ関数までテストケースを残しているので、細かい挙動を後で確認するのにも役立つ。

5

 

5

実際に、自分の過去のプライベートプロジェクトで、コード変更に対する心理的負荷が上がりすぎたため止まってしまったプロジェクトもいくつかある。

5

私の個人プロジェクトを振りかえってみよう。

5

 

5

TDDでやらなかったプロジェクト

1
Stowspec ( GNU Stowのヘルパーアプリ )
5
Sumibi ( 新感覚日本語入力メソッド )EXT
5
    sumibi_org_WASHIlogo
5
OldType ( OldTypeのためのWikiシステム。GaucheベースのWikiClone )
5
    oldtype_logo
5
R@eply.org ( iモードメール専用Webリーダー )EXT
5
    eply_org_icon
5
Predoc ( 軽量ドキュメントフォーマット )EXT
5
    img_close
5
TzWatch ( Lingr用の時刻表示アプリ )EXT
5
    2924809497_52f5ce4524_o
5
Oneliner ( Emacs shell mode )EXT
5
Cmmi (configure ; make ; make install)EXT
5
Sxmlcnv (SXML <-> XML)EXT
5

 

5

 

5

TDDでやっているプロジェクト(過去2年間くらいの大半)

5
Nendo    ( Rubyで実装されたLisp処理系 )
5
Sekka    ( SKKライクな日本語入力メソッド )
5
google-ime-api-normalizer ( Google IME APIのJSON正常化サービス )
5
fuzzy-string-matchEXT ( 曖昧文字列マッチングライブラリ for Ruby )
5

 

5

やっぱりTDDは重要。これからの個人プロジェクトは全てTDDでやります。

5

もちろん本業でもTDDでやるつもり。(って今までできてないんか!ってつっこみもありながら)

5

 

5

参考文献

5
 これは絶対読んでおいたほうが良い。
5
 TDDを実践する上で手順を実際にスローモーションで見せてくれるという感じの本。
5
 4894717115  テスト駆動開発入門: Kent Beck
5

 

5
 TDDでやっていない過去のコードをいかにTDDに直すかという内容の本。
5
 これを読んだからといって、苦労はするんだけどね。
5
 いかんともしがたいほどテストしにくいコードをいかに壊さないようにTDDに持っていくかという本なので、本業では非常に参考になると思う。
5
 4798116831  レガシーコード改善ガイド : マイケル・C・フェザーズ, ウルシステム
5

ズ株式会社

5

 

5

COMMENTsion

前から気になってたので、この機会にと、早速 Amazon で購入。読んでみました。普段の開発工程と、かなりの部分で、酷似していて、明確に「テスト」を意識するかどうか、程度の違いだけだったため、うんうん、そうそう、と、抵抗なく読み進められました。ペアプロにも興味深々なのだけど、なかなか、踏み切れない・・・。

アカデミックで、ホットな情報、いつも感謝しています。

5

COMMENTkiyoka

文脈からいくと、読まれた本は「テスト駆動開発入門」のほうですね。

sionさんは普段からテスト駆動に近い開発スタイルなんですね。

私の場合、本業ではテスト駆動かどうかは人依存だったり(まあ、スキル依存もありますが...) なかなかうまくいっておらず、「レガシーコード」が発生しがちです。

この状況をなんとかして、打開したいと思っています。

個人プロジェクトやオープンソースプロジェクトは期限が無い分、徹底的にこだわることができるので、TDDを実践できて結果的にうまくまわせるのですが、本業だとどうしても負の連鎖に陥りがちです。

うーん。いまそこにあるホットな課題なんです。

0

comment (disabled)

5