ときどきの雑記帖 RE* (新南口)
L'invasion du silence
予告編
ノイエ銀英伝を観に行ったときの 本編上映前の予告編で同じ作品の 予告編を2回流されたんけど こんなこんなことあるの?
具体的な本数とか本編上映前の時間は覚えていないけど
Aの予告編→Bの予告編→Cの予告編→Dの予告編→Eの予告編→カメラ男→Aの予告編→Cの予告編→Dの予告編→Eの予告編
みたいな感じだったと思う。 (洋画の)予告編は割と好きだし 多少長くてもあまり気にしないけど 同じものを2回見せられるのはねえ…
TAOCP
4Bが出たらしい。
- Knuth: Volume 4B exists : programming
- Knuth’s Art of Computer Programming, V 4B, has gone into print | Hacker News
- Knuth: Recent News
Rustacean
Rustを使う人をそう呼ぶらしい。
- From Pythonista to Rustacean | Hacker News
- rochacbruno/py2rs: A quick reference guide for the Pythonista in the process of becoming a Rustacean
新山さんも言及していた
py2rs - PythonistaがRustaceanになるための有益なtips、チートシートなど。https://t.co/0BEjLMd0Q7
— 新山祐介 (Yusuke Shinyama) (@mootastic) October 5, 2022
村上のシーズン56号
三冠王もシーズン56本塁打もすごいことではあるけど ニュースなどで「『「日本選手』最多」って表現をしていたのが引っかかる。 どうしてそういう書き方にしているのか見当つかないでもないけど、 「(歴代)2位」じゃダメなんですか。などと思ったり。
オライリージャパンのサイト
リニューアルされてるみたいなんだけど(いつ?)、 近刊予定のページはなくなってしまったんだろうか?
あった。
O’Reilly Japan - Books :: New and Upcoming
延期
瑞起が「X68000 Z」の詳細発表と予約開始を延期 先行モニタープログラムを実施へ:製品のブラッシュアップを図るため - ITmedia PC USER
あら。
X68000 Zに関するお知らせです。
— 株式会社 瑞起(ZUIKI Inc.) (@ZUIKIInc) October 7, 2022
明日10/8に予定しておりました詳細発表と予約開始を延期することに致しました。楽しみにされていた皆様、申し訳ありません。
詳しくはホームページをご確認ください。#x68000 #68の日 https://t.co/Nx1qrObkfD pic.twitter.com/E89cWNcRYo
augmented
POSIX regex snarfed from Doug McIlroy’s C++. Converted to C by Glenn Fowler. *’d features have been added to Doug’s original code. testre should compile with other regex implementations, but you may need to run with -c to catch non-terminating loops and memory faults.
FEATURE BRE ERE ARE ------- --- --- --- negation NO expr \! expr ! conjunction NO expr \& expr expr & expr NULL subgroups YES NO YES word boundaries* \< expr \> \< expr \> < expr > minimal match* NO REG_MINIMAL REG_MINIMAL shell patterns* REG_SHELL NO NO ksh patterns* NO NO REG_SHELL
をよく読むと
最初にPOSIX regex snarfed from Doug McIlroy's C++.
とある。
そこで、Doug McIlroy regex といったキーワードで検索してみると
arnoldrobbins/mcilroy-regex: Doug McIlroy’s C++ regular expression matching library
が見つかる。
ってこのリポジトリ、 所有者がArnold Robbins (gawkのメンテナー)じゃないか!
- [TUHS] Doug McIlroy’s C++ regular expression library (mostly) revived
- [TUHS] Doug McIlroy’s C++ regular expression library (mostly) revived
- [TUHS] Doug McIlroy’s C++ regular expression library (mostly) revived
脱線はほどほどにして 元記事でリンクの貼られていたリポジトリを探すと ast/testregex.dat というものがあって、 どんなマッチをするかがある程度分かるのだけど
# augmented re's
{E a\! aa!a (0,4) ERE negation not supported
A & a (0,0)
A a! a (0,0)
A [abc]+&[bcd]* abcd (1,3)
A [abc]*&[bcd]+ abcd (1,3)
A (a.*)!&(.+) abb (1,3)(?,?)(1,3)
A xy(.*xy.*)!xy xy.xx.yy.xy.xy (0,11)
A a\! aa!a (1,3)
E a! aa!a (1,3)
E a\! aa!a (0,4)
A a! aa!a (0,4)
A x!a* NULL (0,0)
A ((...|.....)*)! aa (0,2)
A ((...|.....)*)! aaa (0,2)
A ((...|.....)*)! aaaa (0,4)
A ((...|.....)*)! aaaaa (0,4)
A ((...|.....)*)! aaaaaa (0,4)
A ((...|.....)*)! aaaaaaa (0,7)
A ((...|.....)*)! aaaaaaaa (0,7)
A ((...|.....)*)! aaaaaaaaa (0,7)
A ((...)*(.....)*)! aa (0,2)
A ((...)*(.....)*)! aaa (0,2)
A ((...)*(.....)*)! aaaa (0,4)
A ((...)*(.....)*)! aaaaa (0,4)
A ((...)*(.....)*)! aaaaaa (0,4)
A ((...)*(.....)*)! aaaaaaa (0,7)
A ((...)*(.....)*)! aaaaaaaa (0,7)
A ((...)*(.....)*)! aaaaaaaaa (0,7)
}
a!
とaa!a
の場合で結果が(0,4)
、
つまりオフセット0から4まで、言い換えると1文字目から4文字目までがマッチの結果
となる理屈がわからん🤔
conjunction(であろう)が絡んでいる方の
(a.*)!&(.+) abb (1,3)(?,?)(1,3)
もよくわからん。
ライブラリのソースコードもちょっと読んでみたけど
negationの動作は結局よくわかんなかった😓
*
や+
、?
と同様のquantifierぽいことだけは見当ついたけど。
追記
A (a.*)!&(.+) abb (1,3)(?,?)(1,3)
はPerlでいうところの$0にあたる内容がbb
、
$2もbb
、$1は不明(空ではない?)
ということだ。
なぜか(1,3)
を「1文字目から3文字目」と
解釈してしまっていて無駄に悩んでいた😓
そして
A xy(.*xy.*)!xy xy.xx.yy.xy.xy (0,11)
はxy.xx.yy.xy
がマッチ結果(先頭から二個目のxyまで))。
んが、
A a! aa!a (0,4)
これがどうにもわからん🤔
aa!a
がマッチ結果になっているけどa
あるよねえ。
[^a]*
とも違う動作をしているということなんだろうか。
(追記ここまで)
regcomp.c
switch (c)
{
case T_STAR:
case T_PLUS:
case T_LEFT:
case T_QUES:
case T_BANG:
if ((s -= n) == buf)
e = 0;
else
{
i = s - buf;
if (!(e = node(env, REX_STRING, 0, 0, i)))
return 0;
memcpy((char*)(e->re.string.base = (unsigned char*)e->re.data), (char*)buf, i);
e->re.string.size = i;
ちなみにこのファイル(testregex.dat)には
# Tom Lord's rx tests
B \(.*\)*\1 xx (0,2)(2,2)
BE ^ NULL (0,0)
BE $ NULL (0,0)
BE ^$ NULL (0,0)
BE ^a$ a (0,1)
BE abc abc (0,3)
BE abc xbc NOMATCH
BE abc axc NOMATCH
BE abc abx NOMATCH
BE abc xabcy (1,4)
BE abc ababc (2,5)
BE ab*c abc (0,3)
BE ab*bc abc (0,3)
BE ab*bc abbc (0,4)
BE ab*bc abbbbc (0,6)
E ab+bc abbc (0,4)
E ab+bc abc NOMATCH
E ab+bc abq NOMATCH
E ab+bc abbbbc (0,6)
E ab?bc abbc (0,4)
E ab?bc abc (0,3)
E ab?bc abbbbc NOMATCH
E ab?c abc (0,3)
以下略
や
# Andrew Hume's gre re tests
E a+(b|c)*d+ aabcdd (0,6)(3,4)
E ^(a|b)*(abc+|c) abccccc (0,7)(?,?)(0,7)
E (bc|bc+) bccc (0,4)(0,4)
A ((b|a)+)\1 abab (0,4)(0,2)(1,2)
E ^.+$ vivi (0,4)
E ^(.+)$ vivi (0,4)(0,4)
A ((.)+)\1 acbb (2,4)(2,3)(2,3)
以下略
というのもあって、(個人的には)「おお」という感じ。 ところでgreの正規表現てふつーのgrepとは違ったんだろうか。
FORTRAN Compiler on IBM 704
ジャンプテーブル
TRA XXXX,n
という命令で
ジャンプテーブルをひいているらしい
ことがわかったので
同様のものがないか探してみると
>grep -e "TRA [A-Z][0-9A-Z+]*,[0-9ABC]" fort1.asm
TRA SUBTR,4 IF EQUALITY IS FOUND, TRANSFER. 4F11062
TRA SUBTR,4 IF EQUALITY IS FOUND, TRANSFER. 4F11095
CC008 TRA T,1 * TAKE INDICATED TRANSFER. 4F11796
TRA TRBLKA,4 4F13527
TRA TRBLKB,4 NOW BRANCH TO INDIVIDUAL ROUTINE 4F13535
TRA I,B 4F15763
TRA MFG14+9,4 F1P03860
FLO80 TRA FLO80+8,2 INDEXED TRA, F2102120
TRA TS30,0 OFF, GO TO INNER DO PRECEDURE, F2106350
RES05 TRA RES05+7,2 INDEXED T RANSFER, C(XRB)=C(REBITS)F2214050
M13525 TRA M13525+19,4 CHOOSE APPROPRIATE SPECIAL OP BRANCH F3B07340
TRA CPY1R,4 F4464000
RAISE TRA RAISE,1 F6B00370
LOWER TRA LOWER,1 F6B00380
TRA SAT,4 F6G00780
TRA TYPE,1 F6G02260
TRA SUBTR,4 IF EQUALITY IS FOUND, TRANSFER. 4F11062
TRA SUBTR,4 IF EqUALITY IS FOUND, TRANSFER. 4F11095
CC008 TRA T,1 * TAKE INDICATED TRANSFER. 4F11796
TRA TRBLKA,4 4F13527
TRA TRBLKB,4 NOW BRANCH TO INDIVIDUAL ROUTINE 4F13535
TRA FRMTR,4 * TAKE THE INDICATED TRANSFER. DBC/092
TRA FRMTR,4 * TAKE THE INDICATED TRANSFER. BDC/204
そこそこあった。
ただTRA I,B
はOCRの誤認識で
実際にはTRA 1,B
じゃないかと思う。
open subroutine
ソースコードには次のようなテーブルがあって、 組込み関数(ここではオープンサブルーチン open subroutinesと記述) の振り分けを行っている。
REM DICTIONARY OF OPEN SUBROUTINES FOLLOWS 4F14907
OPSUB OCT 672122626060 XABS 4F14908
OCT 212262606060 ABS 4F14909
OCT 673145636060 XINT 4F14910
OCT 314563606060 INT 4F14911
OCT 674446246060 XMOD 4F14912
OCT 444624606060 MOD 4F14913
OCT 674421670060 XMAX0 4F14914
OCT 442167016060 MAX1 4F14915
OCT 674421670160 XMAX1 4F14916
OCT 442167006060 MAXO 4F14917
OCT 674431450060 XMIN0 4F14918
OCT 443145016060 MIN1 4F14919
OCT 674431450160 XMIN1 4F14920
OCT 443145006060 MIN0 4F14921
OCT 264346216360 FLOAT 4F14922
OCT 672631676060 XFIX 4F14923
OCT 623127456060 SIGN 4F14924
OCT 676231274560 XSIGN 4F14925
OCT 672431446060 XDIM 4F14926
OCT 243144606060 DIM 4F14927
BSS 10 4F14928
以前に見た「予約語」の振り分けとは違って このテーブルではエントリ一つの大きさは6文字(1ワード)固定になっている。
PL0480 CAS OPSUB,B 4F14609
TXI PL0520,B,-1 4F14610
TRA PL0650 4F14611
TXI PL0520,B,-1 4F14612
PL0520 TXH PL0480,B,-20 4F14613
STO G 4F14614
SXD PL0260,A 4F14615
TSX TET00,A 4F14616
HTR 9 4F14617
LXD PL0260,A 4F14618
TRA PL0461 4F14619
PL0650 CAL L(4) SET OP1 (S(I)) 33 =1 4F14620
ORS SCRIPL+1,A 4F14621
TRA PL0461 4F14622
1ワード固定なので比較もラク (そういやこのテーブルは「先頭基準」ですね)。
そして
M13520 LXD CCELL,4 F3B07330
M13525 TRA M13525+19,4 CHOOSE APPROPRIATE SPECIAL OP BRANCH F3B07340
TXI M13550,1,-2 (XABS) F3807350
TXI M13550,1,-2 (ABS) F3B07360
TXI M13600,1,-2 (XINT) F3B07370
TXI M13595,1,-2 (INT) F3B07380
TXI M13600,1,-2 (XFIX) F3B07390
TXI M13900,1,-2 (FLDAT) F3B07400
TXI M13680,1,-2 (XMOD) F3B07410
TXI M13681,1,-2 (MOD) F3B07420
TXI M13681,1,-2 (XSIGN) F3B07430
TXI M13681,1,-2 (SIGN) F3807440
TXI M13681,1,-2 (XMAX0 ) F3B07450
TXI M13681,1,-2 (MAX1 0 F3B07460
TXI M13680,1,-2 (XMAX1B) F3B07470
TXI M13680,1,-2 (MAX0B) F3B07480
TXI M13681,1,-2 (XMIN0B) F3807490
TXI M13681,1,-2 (MIN1B0) F3807500
TXI M13680,1,-2 (XMIN1B) F3B07510
TXI M13680,1,-2 (MIN0B0) F3B07520
REM XABS, ABS BRANCH F3B07530
M13550 TSX ERROR1+1,4 INFO ON LOC OF ARG, CHECK FOR ALL 1S F3B07540
ここのテーブルジャンプ(命令がTRAじゃないけど)で 関数それぞれの処理に分岐しているようなのだけど よく見ると同じアドレスに飛んでいる関数が複数ある。 これは飛んだ先でまた色々条件判定して分岐するわけなんだけど すげー追いかけづらい😓
M13680 PSE 100 PLACE SENSE SW. ON FOR FIXPT, F3B08660
M13681 CLA AIL-2,1 TEST INTERNAL FORMULA NO, F3B08670
SUB M1CON+17 -377777777777, SHOULD BE AT F3B08680
TZE ERROR1 LEAST TWO ARGUMENTS FOR MULTIVARIATE FCNS. F3B08690
CLA AIL,1 LOCATION OF ARGUMENT F3B08700
RET3 STO M1CW+2 LOCATION OF ARGUMENT F3B08710
TXI M13685,1,-1 ADJUST COUNT IN IR 1, F3B08720
M13685 CLA AIL,1 REL ADD + TAG OF F3B08730
STO M1CW+3 FIRST ARG TO M1CW+3 F3B08740
TXI M13690,1,-1 F3B08750
M13690 PXD 0,1 END OF AIL REC F3B08760
CAS M1ALWN 2S COMPLIMENT OF NO. OF WORDS F3B08770
TRA M13700 IN AIL RECORD F3B08780
TSX M10210,4 BRING IN NEXT AIL REC. F3B08790
TSX 4,4 N0 OF WORDS OF AIL REC NOT A MULTIPLE OF 4 F3B08800
M13700 CLA M1CW+3 REL. ADDRESS + TAG, IF ANY F3B08810
ANA M1CON+15 +000000002000 F3B08820
TZE M13710 FIRST ARG TAGGED F3B08830
MSE 99 END OF CHTG TABLE F3B08840
TSX M12500,4 CHTG TABLE SEARCH F3B08850
PSE 99 F3B08860
M13710 CLA M1CON+9 SIGN, MODULO OR MAX, MIN F3B08870
CAS CCELL COMPARE TO 10 F3B08880
NOP F3B08890
TRA M13770 MAX OR MIN BRANCH F3B08900
CLA M1CON+5 SIGN OR MODULO, +000012000000 F3B08910
CAS CCELL F3B08920
NOP F3B08930
TRA M13950 SIGN BRANCH F3B08940
MSE 100 XMOD OR MOD F3B08950
TRA M13735 FLOATING PT., MOD BRANCH F3B08960
REM XM0D BRANCH F3B08970
AIL
ところで
この部分のコメントにもいくつか現れているAIL
という単語の意味が分からん。
何かの略語(頭字語)のような気もするのだけど
ソースコード全体を探しても
元になったフレーズのようなものは見当たらなかった。