hira

平内です。

Java屋でした。Javaの言語以外の部分が好きだった。いい夢見させてもらったなぁ。

作ったモノ

hira:作ったモノへ引越しました

質問箱

hira:質問箱へ引越しました

その他

Scheme:ある日のプログラミング風景

hogeとワタシ


hira:log

Hatenaに引越しました。(2004/03/17 22:30:06 PST)

たまにツッコミ入れてやってください。

fio

filter云々の前に、現状のGaucheで何が出来るかイロイロ試している。 でもI/O周りの関数名やオプション名はめちゃくちゃ長いし、thunkだわprocだわlambdaだらけで、もうイヤ、て感じ。 試しに、名前を短くしてthunk,procをマクロ化してみた。

    gosh> (use hira.fio) => (#<module hira.fio> #<module gauche.interactive>)
    gosh> (fo "t1" (ds :< :hello 1 :> )) => #<undef>
    gosh> (fo "t2" (wr :< :hello 2 :> )) => #<undef>
    gosh> (fo "t3" (fm "<[~10a][~10a] ~d>" (so (fi "t1")) (so (fi "t2")) 3 )) => #<undef>
    gosh> (fo "t4" (pr "<" (so (fi "t1") (fi "t2") (fi "t3") (si "world")) " "  4 "> ")) => #<undef>
    gosh> (fio "t4"  "t5") => 58
    gosh> (define t5 (so (fi "t5"))) => t5
    gosh> t5 => "<<hello1>:<:hello2:><[<hello1>  ][:<:hello2:>] 3>world 4>\n"

非常に快適だ。デフォルトのexprをcopy-portにしてから面白くなってきた。(2004/03/17 09:25:11 PST)

マクロ固め

昨日はthunkを撲滅しようと思ったのだが、ちと浅はかだった気がしてきた。 gauche.testのtest*なんかは一気に書き下すとき便利だけど、thunkを変数として扱えるtestのほうが柔軟性はある。 test*だけではつらいかも。昨日つくったfi,fo,fio,si,so,sioにはそれぞれ*付き版を用意すべきか。。。 ・・・いや違う。そのときはオリジナルを使えばいいのだ。書き捨て・即効性重視のマクロだ。柔軟性は捨てよう。(2004/03/16 07:52:25 PST)

ノーサンクス

今日はthunkでハマった。

    (with-input-from-file "1.tsv"
      (port-for-each (lambda (l) (print ">" l)) read))

これだとウンともスンとも言わずに固まってしまう。 標準入力が1.tsvに切り替わっておらず、コンソール入力でブロックしているのが原因。 こうするのが正しい。

    (with-input-from-file "1.tsv"
      (lambda ()
        (port-for-each (lambda (l) (print ">" l)) read)))

with系ioでlambdaを忘れる、の巻でした。 悔しいのでこんな風に書けるマクロを作った。

    ;;上の例と同じ
    (fi "1.tsv" (port-for-each (lambda (l) (print ">" l)) read))
    ;;1.tsvから読み込んで2.tsv(:if-exists :append :buffer :line :if-does-not-exist :error)に書き込む
    (fio "1.tsv" ("2.tsv" :xablne) (port-for-each (lambda (l) (print ">" l)) read))

こういうのが「言語以上・ライブラリ未満」ていう領域なんだろうな。 fi,fo,fio,si,so,sioと作りながら「Schemeの名前、長すぎだよー」と改めて思う。 名前を短く、thunkを撲滅したくなった一日だった。 (2004/03/15 07:12:03 PST)

Schemeを256倍使うための本

そんな本が読みたいなぁ。あと、イディオムを沢山紹介してくれる本かな。Schemeは言語以上ライブラリ未満な領域が広いし、 「やり方は何通りもある」の権化だから、似たような表現をイロイロ比較検討できるのがいいな。 ちなみに「Schemeを16777216倍使うための本」は凄過ぎなので却下。65536倍薄めてくれないと読めません。(←そもそもScheme本じゃないか、これは)。(2004/03/14 11:38:27 PST)

好きなもの

シンプルで、速くて、楽しいものが好きなのだ。 どれもクローンされまくりだってのがミソ。(2004/03/13 08:43:15 PST)

続・夕日のプログラマー

バッドノウハウと「奥が深い症候群」が面白い。 バッドノウハウからグッドラッパーへなんてのもあるし。

    良いものに対するノウハウはグッドノウハウ。
    悪いものに対するノウハウはバッドノウハウ。
    良いものに対するラッパーはグッドラッパー。  (バッドラッパー?)
    悪いものに対するラッパーはバッドラッパー。  (グッドラッパー?)

なんて言い方したら議論にならんな。ラッパーはラッピーを否定する意味で使うべきなのか?

    醜いものに対するノウハウはアグリーノウハウ。
    醜いものに対するラッパーはアグリーラッパー。  (ビューティフルラッパー?)

いかんな、これじゃ。だから何よって感じがする。

    バッド = ダメな仕様に対するワークアラウンド => ノウハウ
    グッド = ダメな仕様に対するワークアラウンドに対するワークアラウンド => ラッパー

てこと?じゃあ

    アグリー = ダメな仕様 => プログラム

だな。「The Wrapper, The Knowhow, And The Program」でどうでしょ?いや、タイトルの話(←なんのタイトルじゃ!)。(2004/03/12 08:34:10 PST)

((癒し系))

最近Cをいじってるけど、どうも落ち着かない。心許無い感じがする。丸裸で肌寒い感じ。
・・・たぶん、(温もり)が恋しいんだろう。(2004/03/11 06:51:51 PST)

時間合わせ

WiLiKiはPSTだし、ShiroさんからのメールはHSTだ。 それがどうもピンとこない。

    JST 日本   :       0       : 24 - 5 = 19 : 24 - 7 = 17
    HST ハワイ : -24 + 5 = -19 :      0      :  0 - 2 = -2
    PST 太平洋 : -24 + 7 = -17 :  0 + 2 =  2 :      0

よし。これなら理解できる。GMT-8よりJST-24+5の方が実感わくなぁ。(2004/03/10 08:03:04 PST)

マクロデビュー

今までlambdaで実現できるようなマクロばかりを書いていた。 でも、こいつぁマクロでなきゃいかん。

(define-syntax inc! (syntax-rules () ((_ slot) (set! slot (+ slot 1)))))
(define-syntax dec! (syntax-rules () ((_ slot) (set! slot (- slot 1)))))

これでやっとマクロの必要性を実感する事ができた。 なーんだ、ただのマクロじゃん(←だからそうだって)ていう感じ。(2004/03/09 07:02:06 PST)

セロ弾きのゴーシュ

 「森で生きている間、私は黙っていた。
  命を失った今、澄んだ声で歌う。」
               古いチェロにかかれていた言葉

Gaucheの名前の由来は絶対これだと予想している私。 上の引用はココで発見。 そういやλもlambdaになってからの方が、活き活きしてるような。(2004/03/08 10:57:47 PST)

ビックリ事件

2,3日前、sort!の「破壊的に再利用」の意味を誤解してハマったことがあった。 MLを読み返していたら似たような話が出てきたのでsort!だけじゃ無いのかとビックリした。 しかし、どうにも分かりにくい。なんでだろ。

1. 元の値も戻り値も使用したい。(副作用なし)
2. 元の値を使用したい。(set!しなおす手間を省きたい。メモリを節約したい)
3. 戻り値を使用したい。(メモリを節約したい)

1と2の感覚しか持ち合わせていなかった、ということか。 2は束縛への副作用を目的としているのだけど、3では束縛への副作用は効率化のための手段に過ぎない。 副作用の有無だけでなく、2と3の違いが見た目で分かるようにならないかなぁ。3は「!!」にするとか。 sort, sort!!, remove, remove!!となっていればこんなハマり方しなくて済むのだけれど。。。(2004/03/07 06:32:50 PST)

思い込んだら、試練の道

久しぶりに「switch文のbreak忘れバグ」にハマった。これとtypoは私の天敵だ。簡単に半日は持っていかれる。 自分は正しい、と思い込んでるため、疑惑があさっての方向に向かってしまうからだ。 困難なバグの場合、それに喰らいついて解決したら「俺ってすごいぜ!」と満足感が味わえるものだが、 typoを半日かけて解決した日にゃ「俺ってアホだぜ。。。」とがっかりするしかない。 ま、年に一度のイベントだと思えばいいか。今年はもう無いだろう。(2004/03/06 17:30:21 PST)

論よりRun

今日はportapi.cの宿題を片付けようと、一日中Makefileをイジクリまわしていた。 結局./libgauche_*.dllを最適化戦略の数だけ作り、./gosh -ftest io_bench.scmする前に./libgauche.dllにmvすることにした。

   text    data     bss     dec     hex filename
 463508   62132   37584  563224   89818 libgauche_0.dll

 464052   62132   37584  563768   89a38 libgauche_0i.dll
 474132   62132   37584  573848   8c198 libgauche_org.dll
-------------------------------------------------------------------------------
arc         i686-pc-cygwin
thread-type none

strategy real    user    system  process
0        35.01   12.99   19.46   32.46    #全体をSAFE_CALLで囲む
0i       41.37   12.54   25.73   38.27    #全体をSAFE_CALLで囲む(インライン展開)
org      34.20   11.84   19.61   31.45    #オリジナル

インライン展開がこんなに遅いとは。。。なんでやろ?(2004/03/05 07:24:27 PST)

何も出力しないマクロが欲しい

気兼ねなくデバッグログを埋め込みたいので、何も出力しないマクロが欲しい。

(define-syntax p (syntax-rules () ((_ msg ...) (print "***p***>" msg ... ))))
(define-syntax p (syntax-rules () ((_ msg ...)    ))) ;コレがやりたいんだけどsyntax errorになる
(define-syntax p (syntax-rules () ((_ msg ...) () ))) ;仕方ないからコレでガマン

(begin (p 'a)(p 'a)(p 'a)(p 'a)) ;(1)
(begin)                          ;(2)

(1)と(2)が同じ意味になるようなマクロって定義できないのだろうか。(2004/03/04 06:17:31 PST)

coroutine = subroutineだと思ってたあの頃

coroutineて書き言葉を見るまで、自分の勘違いに気付かなかった。 Kahuaセミナー聞いてた時もこんなだったし↓

    「コルーチン」などはcall/ccの例として、ほげほげふがふがどうのこうの・・・
        ↓
    「子ルーチン」
        ↓
    「サブルーチン」
        ↓
    (゚Д゚)ハァ? oO(call/ccって謎だなー)

過去にどれだけ「コルーチン」という言葉を見聞きしたか、記憶をたぐるのが恐ろしい。 (2004/03/03 07:37:21 PST)

クラスの中に入りたい

slotにprivateなアクセッサを定義しようとして、あれ?っと思いました。 generic functionでディスパッチということは、自他の区別なんて無いのかと。 moduleのimport/exportが近いけど、staticな変数の可視/不可視の制御なので、ちょっと違う。 slotにpublic/privateの概念を持ち込むにはどうすればいいのだろう? クラスの中に入る仕組みがあれば良いのだろうけど。 そうすれば、slot-refにイライラしなくても済むっていうオマケも付くのだが。 (2004/03/02 07:42:32 PST)

(slot-ref self 'hoge) ;;21文字 CLOS:フツーの書き方
this.getHoge()        //14文字 Java:thisマニアが自己カプセル化したときの書き方
hoge                  ;; 4文字 CLOS/Java:私が望む書き方

portapi実験場

ML:予定とベンチ Rev.30:まとめる前のportapi実験場

「2. 全面的にScm_MakeVirtualPortを採用してみる」版の設計

※FdはFile, Socket, Stdin/out/errの親クラスという位置づけ。

struct ScmPortRec {
    /* 省略 */
    union {
        /* 省略 */
        //これは廃止して以下に展開する
        //ScmPortVTable vt;       /* virtual port */
    } src;

    /* portapi interface. */
    /* safe */
    int       (*Getb)(ScmPort *p);
    int       (*Getc)(ScmPort *p);
    int       (*Getz)(char *buf, int buflen, ScmPort *p);
    ScmObj    (*Getline)(ScmPort *p);
    int       (*ByteReady)(ScmPort *p);
    int       (*CharReady)(ScmPort *p);
    void      (*Putb)(ScmByte b, ScmPort *p);
    void      (*Putc)(ScmChar c, ScmPort *p);
    void      (*Putz)(const char *buf, int len, ScmPort *p);
    void      (*Puts)(ScmString *s, ScmPort *p);
    void      (*Flush)(ScmPort *p);
    ScmObj    (*Close)(ScmPort *p);
    ScmObj    (*Seek)(ScmPort *p, ScmObj off, int whence);
    /* unsafe */
    int       (*GetbUnsafe)(ScmPort *p);
    int       (*GetcUnsafe)(ScmPort *p);
    int       (*GetzUnsafe)(char *buf, int buflen, ScmPort *p);
    ScmObj    (*GetlineUnsafe)(ScmPort *p);
    int       (*ByteReadyUnsafe)(ScmPort *p);
    int       (*CharReadyUnsafe)(ScmPort *p);
    void      (*PutbUnsafe)(ScmByte b, ScmPort *p);
    void      (*PutcUnsafe)(ScmChar c, ScmPort *p);
    void      (*PutzUnsafe)(const char *buf, int len, ScmPort *p);
    void      (*PutsUnsafe)(ScmString *s, ScmPort *p);
    void      (*FlushUnsafe)(ScmPort *p);
    ScmObj    (*CloseUnsafe)(ScmPort *p);
    ScmObj    (*SeekUnsafe)(ScmPort *p, ScmObj off, int whence);
};

/* portapi implements */
/*Scm_<TYPE><METHOD><UNSAFE>*/
/*Getb*/      Scm_FdGetb Scm_IStrGetb
/*Getc*/      Scm_FdGetc Scm_IStrGetc
/*Getz*/      Scm_FdGetz Scm_IStrGetz
/*Getline*/   Scm_FdGetline Scm_IStrGetline
/*CharReady*/ Scm_FdCharReady Scm_IStrCharReady
/*ByteReady*/ Scm_FdByteReady Scm_IStrByteReady
/*Putb*/      Scm_FdPutb Scm_OStrPutb
/*Putc*/      Scm_FdPutc Scm_OStrPutc
/*Putz*/      Scm_FdPutz Scm_OStrPutz
/*Flush*/     Scm_FdFlush
/*Close*/     Scm_FdClose
/*Seek*/      Scm_FileSeek Scm_IStrSeek Scm_OStrSeek

/*あとFdのUnsafe系とnull系(すでにある)*/

interfaceとimplementsのバインドはポート生成時に行う。

狙いは保守・拡張しやすいソース

最新ベンチ結果

#sigprocmaskを呼ぶ版
   text    data     bss     dec     hex filename
 462804   62196   37584  562584   89598 libgauche_0.dll
 463668   62196   37584  563448   898f8 libgauche_0i.dll
 468308   62196   37584  568088   8ab18 libgauche_1.dll
 473908   62196   37584  573688   8c0f8 libgauche_1i.dll
 474292   62196   37584  574072   8c278 libgauche_org.dll
-------------------------------------------------------------------------------
arc         i686-pc-cygwin
thread-type none

strategy real    user    system  process
0        21.95   11.17   9.532   20.70    #全体をSAFE_CALLで囲む
0i       22.87   11.92   9.498   21.42    #全体をSAFE_CALLで囲む(インライン展開)
1        21.75   10.67   9.222   19.89    #SAFE_CALLの前にportタイプで分岐する
1i       21.50   10.21   9.5     19.71    #SAFE_CALLの前にportタイプで分岐する(インライン展開)
org      20.59   9.972   9.562   19.53    #オリジナル

sigprocmaskを呼ばないようにしてみる

ML:sigsetjmp on port locking

More ...