2009-10-01から1ヶ月間の記事一覧

1.9にはTest::Unit::AutoRunnerがない

どうやら,1.9のtest/unitは1.8のそれとは別物で,中身はminitest/unitらしい.AutoRunner.runを使おうとしたらなかった.代替手段は示されてないように見える.というかそもそもリファレンスマニュアルがry 1.9.1が出たからにはここら辺は揃ってるのかと思…

org-modeが落ちる(3)

折り畳んでる部分の直後の文字列を削除しようとするとEmacsごと落ちる.

org-modeが落ちる(2)

折り畳まれてる所を開いて,閉じて,...の後ろでTAB押すとEmacsごと落ちる.

Schemeの数値リテラルにマッチする正規表現(6)

部分式呼び出しを使って短くしてみた.一度treeを作ってから再帰的に正規表現を構成する戦略. naiveな実装で1124bytes,頑張って探索して11141110bytes.名前付きグループがあると括弧の意味が変わる問題がなければ909bytes(Gオプションが使えれば910bytes…

名前付きグループがあると括弧の意味が変わる

この前から気になってたんだけど,名前参照と番号参照を同時にしたくて困った. http://www.geocities.jp/kosako3/oniguruma/doc/RE.ja.txt 名前付きキャプチャがあるかないかで()の意味が変わってしまう.今,プログラムで正規表現を生成してて,人間が付け…

Schemeの数値リテラルにマッチする正規表現(5)

昨日までの正規表現にバグがあった. /\.#{digit}+#+\.#*#{suffix}/ は /#{digit}+#+\.#*#{suffix}/ が正解.短い方は1957bytesに,長い方は2793bytesになった.

Schemeの数値リテラルにマッチする正規表現(4)

鬼車の,名前付きキャプチャがあると()がキャプチャしなくなるのを利用して1969bytes.これ以上は部分式呼び出しを使わないと大幅な削減は厳しそう. いろいろキャプチャするバージョンは3061bytesになった.強欲マッチを止めれば2805bytes. 部分式呼び出し…

Schemeの数値リテラルにマッチする正規表現(3)

テストの仕方に問題があって,ある文字列にきっちりマッチするかどうかで確かめてたんだけど,トークンとして抜き出してくるにはそれでは不適切なことがわかった.そこで肯定先読みを使って,区切り文字が続いてるかどうかを調べるようにした. それから,問…

Schemeの数値リテラルにマッチする正規表現(2)

短くしてたんだけど,\dが使えない所為で1割伸びた.2217bytes. /(?:(?:#b(?:#[ei])?|(?:#[ei])?#b)(?:(?:[+-]?(?:(?:[01]+#*)|(?:[01]+#*\/[01]+#*)) )|(?:[+-]?(?:(?:[01]+#*)|(?:[01]+#*\/[01]+#*))@[+-]?(?:(?:[01]+#*)|(?:[01]+#*\/[ 01]+#*)))|(?:[+-…

UTF8で\dが全角数字にマッチ

irb:0> /\d/ =~ "5" => 0 irb:0> /\d/.encoding => #<Encoding:US-ASCII> irb:0> /\d/n.encoding => #<Encoding:US-ASCII> irb:0> re = Regexp.new(/\d/.source.force_encoding(Encoding::ASCII_8BIT)) => /\d/ irb:0> re.encoding => #<Encoding:US-ASCII>ぎゃーす. irb:0> /\d(?:\x80(?!))?/n =~ "5".force_encodin</encoding:us-ascii></encoding:us-ascii></encoding:us-ascii>…

StringScannerからMatchDataがとれない(2)

indexでは参照できるけど名前では参照できなかったので,参照できるようにしてみた. (2009-10-25修正):マッチしてない部分の名前での参照がバグってたので修正. --- orig_strscan.c 2009-10-18 18:39:10.000000000 +0900 +++ strscan.c 2009-10-25 00:26:…

Schemeの数値リテラルにマッチする正規表現

3839bytes.もっと短くしたいなぁ.見辛いので適当に改行を挿入. /(?:(?:(?:#b)(?:(?:#[ei])?)|(?:(?:#[ei])?)(?:#b))(?:(?:(?:(?:[+-])?)(?:(?:(?:[01 ])+#*)|(?:(?:(?:[01])+#*)\/(?:(?:[01])+#*))|(?:(?!))))|(?:(?:(?:(?:[+-])?)(?:(?: (?:[01])+#*)|(?…

Schemeのブロックコメントにマッチする正規表現(2)

開き括弧と閉じ括弧から,正規表現を生成. def charsetq(c) case c when "[", "-", "]", "\\" "\\#{c}" else c end end def _rec_regexp(str) Array.new(str.length) {|i| [Regexp.quote(str[0, i]), charsetq(str[i, 1])] } end def rec_regexp(s1, s2) a1…

Schemeのブロックコメントにマッチする正規表現

自信はない. re = /(?<block>#\|(?:(?:[^#|]|#[^|]|\|[^#])++|\g<block>)*+\|#)/ str = <</block></block>

ruby1.9のrequire_relative

ところで,require_relativeっていいよね.1.9から入ったのかな. なんかhttp://svn.ruby-lang.org/repos/ruby/trunk/NEWSに書いてあるけど,1.9.1の途中から入ったのかな?

parser generator書いてみた(5)

実行速度測ってみた. CPUは,2 GHz Intel Core 2 Duo. $ ruby19 -v ruby 1.9.1p243 (2009-07-16 revision 24175) [i386-darwin9.8.0] $ time ./sample/calc2.rb 19985 real 0m1.085s user 0m1.066s sys 0m0.014srequire_relative '../rdpg.rb' Lexer = Par…

parser generator書いてみた(4)

構文規則(の左辺)を文字列リテラルでも書けるようにした. Lexer = ParserGenerator::Lexer.new(/[ \t\n\r\v]+/) { token(:operator, /[+-]/) {|ma| ma[0].to_sym } token(:operator2, /[*\/]/) {|ma| ma[0].to_sym } token(:integer, /[0-9]+/) {|ma| ma[0]…

parser generator書いてみた(3)

度重なる仕様変更でこんな感じに書くようになった. Lexer = ParserGenerator::Lexer.new(/[ \t\n\r\v]+/) { token(:operator, /[+-]/) {|ma| ma[0].to_sym } token(:operator2, /[*\/]/) {|ma| ma[0].to_sym } token(:integer, /[0-9]+/) {|ma| ma[0].to_i …

anythingのキーバインド

以前,anythingのキーバインドを変更したけど書いてなかったので書く.増えた部分の近辺. (defvar anything-call-source-buffer "*anything source select*") (defvar anything-c-source-call-source `((name . "Call anything source") (candidate-number-…

parser generator書いてみた(2)

一昨日書いたparser generatorだけど,設計上の問題があることがわかってたのと,Ruby Library Report 【第 6 回】 正規表現と構文解析を見つけたので何か書く. 読みにくい 書きやすいのだが読みにくい感は否めない.tdp4rのように演算子を使う書き方を検討…

parser generator書いてみた

現状こんな感じで書ける. lexer = Lexer.new("x + 4 * 5", /[ \t\n\r\v]+/) { token(:operator, /[+]/) {|ma| ma[0].to_sym } token(:operator2, /[*]/) {|ma| ma[0].to_sym } token(:integer, /[0-9]+/) {|ma| ma[0].to_i } token(:identifier, /[a-z]+/) …

StringScannerからMatchDataがとれない

indexで参照するには代替手段が用意されてるけど,名前で後から参照することができないようだ. s = StringScanner.new("hoge") s.scan(/.(?<k>.)/) p s[1] # => "o" p s[:k] # => -:4:in `[]': can't convert Symbol into Integer (TypeError)</k>

ローカルでCGIを動かす

Mac OS 10.3を使ってた時は動いてたのに,今日動かそうと思ったら動いてなかった.どうもhttpd.confの位置が変わったみたいで,以前書いた設定ファイルは見つからなかった(消えたとすると,移行アシスタントで知らないうちに移行できてないことになる.カー…

org-modeが落ちる

バッファ末尾でない,空行で終わる段落(?)を折り畳もうとするとEmacsごと落ちる. org-modeで落ちる件と同じ現象みたい. adviceで空行を消そうとしたけどうまくいかなかった.

and-let*を実装した

欲しくなったので,ぐぐったら2009-10-06が出てきたので,これを(大いに)参考にして実装してみた. 束縛値がnilの時にも即座にand-let*から抜けるようにした. (and-let* ((x 10) (y nil)) x) ;; => nil (defmacro and-let* (exp &rest body) `(%and-let* ,e…

1.9のCurses::Window#getchがStringを返したりFixnumを返したりする

英字キーだとString,Returnや矢印キーではFixnumが返ってくる.1.8ではどちらもFixnum. バグじゃね?どっちかに統一すべきだろ…と思ってたらこんなソース. /* def getch */ static VALUE curses_getch(VALUE obj) { int c; rb_read_check(stdin); curses_…

練習にqsort

(defun qsort (list cmp) (if list (let* ((pivot (car list)) (list (cdr list)) (f (lambda (x) (funcall cmp pivot x)))) (append (qsort (remove-if f list) cmp) (cons pivot (qsort (remove-if-not f list) cmp)))) nil)) (prin1 (qsort '(3 1 4 1 5 9…

CLISPをソースコードからインストール

いろいろインストールが必要な上に,手際が悪くてかなり手間取った.手順の記録も適当なので注意. CLISPのソースを入手.CLISP - an ANSI Common Lisp - Browse Files at SourceForge.net $ tar -jxvf clisp-2.48.tar.bz2 $ cd clisp-2.48/ $ ./configure (…

全キャラExtraクリア

魔理沙Bでクリアして全キャラクリア.ボムのエフェクトより先に弾消しと無敵切れるのなんとかしてくれないかな?エフェクトで弾が見えない. 魔理沙Bと他のキャラでExtraとPhantasm以上の差があったような気がする. Hardもこいつがネックになるんだろうか.

Extraクリア

早苗AでExtraクリア.2ボム余り. 道中がきつい.地霊殿並の難易度だと思う. ボスはそれほどでもない印象の割には残機は余らなかった.エクステンド少なくない?気のせい? (追記)霊夢A,魔理沙A,早苗B,霊夢Bでクリア.魔理沙Bだけ異様に難しくてクリアで…