再編進行中

log

書きましたよ。むしろ書かせましたよ。その後 20 分ぐらいひたすら変更に問題がないことを確認しては n (次の変更目印へ) を押してました。うあ…

Gauche正規表現をうまく操れなくて四苦八苦。見るも無惨な source になりました。件の bug も macro で回避してるし…

しかしこうやってグロい code を書いては自分で読めなくなるのを繰り返すことで、そのうち綺麗な code が書けるようになるのれす。めげずに苦労を重ねましょう。

log 書き

サボりたくて仕方がない…

名前変更に使った script をごにょごにょやって log を生成させてみる…実行すらできない。何で?

jun@debian /dvl/uim/org/branches/r5rs/sigscheme
$ cat rename-functions.scm
(use srfi-13)
(use srfi-1)
(define (rename)
  (define (regexp-fold str rules)
    (fold
     (lambda (rule str)
       (regexp-replace-all
        (first rule)
        str
        (second rule)))
     str
     rules))
  (define (canonicalize func-name)
    (regexp-fold
     func-name
     `((#/^(?:Sig)?Scm(Exp|Op)?_/ ,(lambda (m)
                                     (string-append
                                      "scm_"
                                      (let ((s (rxmatch-substring m 1)))
                                        (cond
                                         ((equal? s "Op") "p_")
                                         ((equal? s "Exp") "s_")
                                         (else ""))))))
       (#/_New/ "_make")
       (#/_V([A-Z].+)Printf/ "_\\1_vprintf")
       (#/TailRec/ "_tailrec")
       )
     ))

  (define (splice-underscores function)
    (regexp-replace
     #/^_/
     (regexp-replace-all
      #/_*([A-Z0-9]+)/
      function
      (lambda (m)
        (string-append "_" (rxmatch-substring m 1))))
     "")
    )

  (define (map-ident str)
    (let ((new-s (string-downcase (splice-underscores (canonicalize str)))))
      (if (not (string=? str new-s))
          (display #`",|str|\t,|new-s|"))
      new-s))

  (define (fix-function-names str)
    (regexp-replace-all
     #/((?:Sig)?Scm(Exp|Op)?_\w+)/
     str
     (lambda (m)
       (let ((s (rxmatch-substring m 1)))
         (if (rxmatch #/[a-z]/ s)
             (map-ident s)
             s)))
     ))

  (define (fix-function-declaration str)
    (regexp-replace
     #/^(\s*DECLARE_FUNCTION\(\".*?\", )(.*?)\)\;$/
     str
     (lambda (m)
       (string-append
        (rxmatch-substring m 1)
        (map-ident (rxmatch-substring m 2))
        ");"))))

  (let loop ((line (read-line)))
    (unless (eof-object? line)
            (display (fix-function-names (fix-function-declaration line)))
            (display #\newline)
            (loop (read-line))
            ))
  )

(define (main args)
  (if #t
      (with-input-from-file "error.c.bak" rename)
      (rename)))
jun@debian /dvl/uim/org/branches/r5rs/sigscheme
$ gosh rename-functions.scm
*** ERROR: Compile Error: [internal error] stray local variable:
"./rename-functions.scm":3:(define (rename) (define (regexp-fol ...

Stack Trace:
_______________________________________

[internal error] って… もしかして Gauche 自身の bug 踏んだ? でも何か怪しい。

test してる?

変更前後のやつを用意して runtest.sh で対照実験。何か immutable string 周りで glibc がやたらと memory 破壊を検出する。kzk さん?

関数 table 生成も変更するのか。だる。

そんなわけで読んだことも書いたこともない Ruby で書かれた script をいじる私。#{} とか推論ではわからん。Manual はどこだ。

ああわかった。文字列に式埋め込むのね。やっぱ manual いらね。

ErrorObj

関数名はやっぱり大域変数で渡した方がいいかも。とりあえず workaround 書いて後からなんとかしよう。

名前

いくつか始末に困る関数があるな。変数型名が入ってるやつとか、new が後ろの方についてるやつとか。あと SigScm_ErrorObj() は obsolete したはずだけど新しい macro に使われてるし。とりあえず commit して反応見るか。

…まだ check が終わってないんだが

[Gauche]

起きてそそくさと script を書き上げる。何かいまいち Gaucheregexp の使い方に慣れない。汚いなあ。まだ refactor もできるし。

[DEL: source 載せてたけど、上の方に移動]