ときどきの雑記帖 RE* (新南口)
The Wrath of Khan
今週のしずえさん
「ねぎま」
interface 2022 Jan
今月は
☆別冊付録
●コンピュータ手帳2022
があるので買った。 コネクタ形状一覧はもう少し幅広く網羅したものを…と思うけど 現在ではあまり使われなくなったものを収録してもという話はあるんだろうねえ。
あと、一部のURLがQRコードを使って表記されていたのには「おお」という感じ (去年まではなかったよね?)。
形状と言えば
コンセント形状一覧
電源プラグとソケットのヴァーチャル博物館。歴史的なもの、標準的でないものも含めて、世界各国のありとあらゆるプラグとソケットが画像付きで解説されている。https://t.co/C7O0CsSvEN
— 新山祐介 (Yusuke Shinyama) (@mootastic) November 25, 2021
- Museum of Plugs and Sockets: home page
- Museum of Plugs and Sockets: Overview
- Museum of Plugs and Sockets: Japanese plugs and sockets
Japanese plugs and socketsの19, 20のやつ会社でみたわー。 あるときその形状のプラグのついた電源コードが急遽必要になって、 ちょっとした騒ぎになった😄
ところで新山さんのフォロワー数みたらだいぶ増えてますね。
ませまちか
Wolfram Engine for Developersについてよくある質問
メモ
- Easy to Reuse Code vs. Code Designed for Reuse - Alt + E S V
- Low-Code and the Democratization of Programming – O’Reilly
V8 awk
前回のつづき。
V7 のawkではああだったけど そのあとのバージョンではどうなのか確かめてみた。
The Unix Tree にあるものからまずはV8のものを。
<reg>\\. { cbuf[clen++] = '\\'; cbuf[clen++] = yytext[1]; }
<reg>\n { yyerror("newline in regular expression %.10s...", cbuf); lineno++; BEGIN A; }
<reg>"/" { BEGIN A;
cbuf[clen] = 0;
yylval = (int) tostring(cbuf);
unput('/');
RET(REGEXPR); }
<reg>. { CADD; }
省略
%%
startreg()
{
BEGIN reg;
clen = 0;
}
lexを使っているのは同じだけど定義が少し変わっていて、 V7 のそれではあったchcという状態がなくなっている。 そしてyaccの方も
reg_expr:
'/' {startreg();} REGEXPR '/' { $$ = $3; }
;
という構文定義になっている。
この定義だと[
と ]
の間に’/‘があると
それが正規表現をくくる/
と判断されてしまうという
現在と同じ動作になりますね。
V10
次にV10/cmd/awk (V9のツリーにawkが見当たらないようなんだけど探し方が悪い?) のawk.lx.l。 をみると、 基本的なところに違いはないのだけど 冒頭にこんな表記が追加されていて 「ああ、そういう時期のものなんだねえ」 と遠い目に。
+/*
+Copyright (c) 1989 AT&T
+ All Rights Reserved
+
+THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF AT&T.
+
+The copyright notice above does not evidence any
+actual or intended publication of such source code.
+*
ここまでで/
の扱いの変化については結論が出ちゃったのだけど
ついでなのでもう少し見てみた。
- 4.3BSD/usr/src/bin/awk
- 4.4BSD/usr/src/contrib
- OpenSolaris_b135/cmd/awk
- OpenSolaris_b135/cmd/awk_xpg4
4.3BSD→4.4BSDではawkがなくなってgawkを使うようになった? なんかそういう記憶もあるなあ(曖昧)。 OpenSolarisのxpg4でない方のawkは確かにold awkそのままだった(笑)
V10以降後年(awk単体で)公開されるまでの変化も気になるけど(lex使わなくなってるし) 今回はこの辺で。
v7 egrep grep sed
ところで
ここまで見てきたawkの定義だと、
[
の直後(^
がある場合はその直後)に]
がある場合それは
文字クラスの終端にはならないというルール(?)を満たさないのだけど
他の代表的なツールはどうだったのかというと
egrep
v7unix/egrep.y at master · v7unix/v7unix
yylex() {
extern int yylval;
int cclcnt, x;
register char c, d;
switch(c = nextch()) {
case '[':
x = CCL;
cclcnt = 0;
count = nxtchar++;
if ((c = nextch()) == '^') {
x = NCCL;
c = nextch();
}
do {
if (c == '\0') synerror();
if (c == '-' && cclcnt > 0 && chars[nxtchar-1] != 0) {
if ((d = nextch()) != 0) {
c = chars[nxtchar-1];
while (c < d) {
if (nxtchar >= MAXLIN) overflo();
chars[nxtchar++] = ++c;
cclcnt++;
}
continue;
}
}
if (nxtchar >= MAXLIN) overflo();
chars[nxtchar++] = c;
cclcnt++;
} while ((c = nextch()) != ']');
chars[count] = cclcnt;
return (x);
grep
v7unix/grep.c at master · v7unix/v7unix
case '[':
if(&ep[17] >= &expbuf[ESIZE])
goto cerror;
*ep++ = CCL;
neg = 0;
if((c = *sp++) == '^') {
neg = 1;
c = *sp++;
}
cstart = sp;
do {
if (c=='\0')
goto cerror;
if (c=='-' && sp>cstart && *sp!=']') {
for (c = sp[-2]; c<*sp; c++)
ep[c>>3] |= bittab[c&07];
sp++;
}
ep[c>>3] |= bittab[c&07];
} while((c = *sp++) != ']');
if(neg) {
for(cclcnt = 0; cclcnt < 16; cclcnt++)
ep[cclcnt] ^= -1;
ep[0] &= 0376;
}
ep += 16;
continue;
sed
v7unix/sed0.c at master · v7unix/v7unix
case '[':
if(&ep[17] >= &expbuf[ESIZE]) {
fprintf(stderr, "RE too long: %s\n", linebuf);
exit(2);
}
*ep++ = CCL;
neg = 0;
if((c = *sp++) == '^') {
neg = 1;
c = *sp++;
}
cstart = sp;
do {
if(c == '\0') {
fprintf(stderr, CGMES, linebuf);
exit(2);
}
if (c=='-' && sp>cstart && *sp!=']') {
for (c = sp[-2]; c<*sp; c++)
ep[c>>3] |= bittab[c&07];
}
if(c == '\\') {
switch(c = *sp++) {
case 'n':
c = '\n';
break;
}
}
ep[c >> 3] |= bittab[c & 07];
} while((c = *sp++) != ']');
if(neg)
for(cclcnt = 0; cclcnt < 16; cclcnt++)
ep[cclcnt] ^= -1;
ep[0] &= 0376;
ep += 16;
continue;
defchar:
default:
*ep++ = CCHR;
*ep++ = c;
}
と、この三つはどれも同じようなdo whileループで処理していて。
[
の直後の]
は通常のキャラクターとして扱われている。
それでも\
の扱いが微妙に違っていて面白い。
あとegrepのソースコードが egrep.y
とyaccのファイルだったということも。
まあyacc形式のファイルでもCのコード置ける(書ける)ってのはあるけど。