ときどきの雑記帖 RE* (新南口)
3.11
種なし
種なしのビワがあるということを知った
ホーア
TRUE/FALSE
BCPLのリファレンスマニュアル によれば
4.5 TRUE and FALSE
Syntactic form: TRUE or FALSE
Semantics: The Rvalue of TRUE is a bit pattern entirely composed of ones: the Rvalue of FALSE is zero.
Note that TRUE = ~FALSE
1/0ではないらしい。 Cの1(というか非0)と0ってのはどこから?
increment/decrement operator
最近またこいつの「都市伝説」ぽいのをみかけたので 忘れないように(誰が?)
トンプソンは加減算代入演算子を発明し、x =+ yの形で実装した(C言語では順序が逆転して+=となった)。 またB言語ではインクリメント、デクリメント演算子(++ and –)が導入された。 演算子を前につけるか後ろにつけるかで、変更前と変更後のどちらの値が式の結果に 適用されるのかを選択できた。これらの新機能は最初のバージョンのB言語には見られなかった。 デニス・リッチーによれば、多くの人はDEC PDP-11で導入された自動インクリメント ・自動デクリメント・アドレッシングモードのために開発されたと思う人が多いが、 Bが開発されたときにはPDP-11は存在しておらず歴史的に見てありえないとしている[3]。
Thompson went a step further by inventing the ++ and – operators, which increment or decrement; their prefix or postfix position determines whether the alteration occurs before or after noting the value of the operand. They were not in the earliest versions of B, but appeared along the way. People often guess that they were created to use the auto-increment and auto-decrement address modes provided by the DEC PDP-11 on which C and Unix first became popular. This is historically impossible, since there was no PDP-11 when B was developed.
coreutils
その後ちょいと調べてみたところでは、
各コマンドのソースコードにある関数はほぼすべて
staticがついているので、
一つのバイナリにまとめた場合でも名前の衝突は起きないようになっているらしい。
さすがにmain(とusage)はそれができないけど、
コンパイル時にコマンドラインオプションで
名前をすり替えるマクロ定義して衝突回避していた。
staticなしの関数はこんな感じで抜き出した
>gawk "/^[A-Za-z_][A-Za-z_0-9]* \(.*\)$/{if ($0~\"[a-z].* \\(\") print (FILENAME \" \" prev \" \" $0)} {prev=$0}" *.c | grep -v -e "static" | clip
結果はこちら
basename.c void usage (int status)
basename.c int main (int argc, char **argv)
basenc.c void usage (int status)
basenc.c int main (int argc, char **argv)
cat.c void usage (int status)
cat.c int main (int argc, char **argv)
chcon.c void usage (int status)
chcon.c int main (int argc, char **argv)
chmod.c void usage (int status)
chmod.c int main (int argc, char **argv)
chown-core.c extern void chopt_init (struct Chown_option *chopt)
chown-core.c extern void chopt_free (struct Chown_option *chopt)
chown-core.c extern char * gid_to_name (gid_t gid)
chown-core.c extern char * uid_to_name (uid_t uid)
chown.c void usage (int status)
chown.c int main (int argc, char **argv)
chroot.c void usage (int status)
chroot.c int main (int argc, char **argv)
cksum.c int main (void)
cksum.c int crc_sum_stream (FILE *stream, void *resstream, uintmax_t *length)
cksum.c int crc32b_sum_stream (FILE *stream, void *resstream, uintmax_t *reslen)
cksum_avx2.c bool cksum_avx2 (FILE *fp, uint_fast32_t *crc_out, uintmax_t *length_out)
cksum_avx512.c bool cksum_avx512 (FILE *fp, uint_fast32_t *crc_out, uintmax_t *length_out)
cksum_pclmul.c bool cksum_pclmul (FILE *fp, uint_fast32_t *crc_out, uintmax_t *length_out)
cksum_vmull.c bool cksum_vmull (FILE *fp, uint_fast32_t *crc_out, uintmax_t *length_out)
comm.c void usage (int status)
comm.c int main (int argc, char **argv)
copy.c #if USE_XATTR ATTRIBUTE_FORMAT ((printf, 2, 3))
copy.c ATTRIBUTE_FORMAT ((printf, 2, 3))
copy.c extern void dest_info_init (struct cp_options *x)
copy.c extern void src_info_init (struct cp_options *x)
copy.c extern void cp_options_default (struct cp_options *x)
copy.c extern bool chown_failure_ok (struct cp_options const *x)
copy.c extern mode_t cached_umask (void)
coreutils-arch.c int single_binary_main_arch (int argc, char **argv)
coreutils-chgrp.c int single_binary_main_chgrp (int argc, char **argv)
coreutils-dir.c int single_binary_main_dir (int argc, char **argv)
coreutils-vdir.c int single_binary_main_vdir (int argc, char **argv)
coreutils.c void usage (int status)
coreutils.c int main (int argc, char **argv)
cp-hash.c extern void forget_created (ino_t ino, dev_t dev)
cp-hash.c extern char * src_to_dest_lookup (ino_t ino, dev_t dev)
cp-hash.c extern char * remember_copied (char const *name, ino_t ino, dev_t dev)
cp-hash.c extern void hash_init (void)
cp.c void usage (int status)
cp.c int main (int argc, char **argv)
csplit.c extern void xalloc_die (void)
csplit.c struct buffer_record * get_new_buffer (idx_t min_size)
csplit.c int main (int argc, char **argv)
csplit.c void usage (int status)
cut.c void usage (int status)
cut.c int main (int argc, char **argv)
date.c void usage (int status)
date.c int main (int argc, char **argv)
dd.c ATTRIBUTE_FORMAT ((__printf__, 2, 3))
dd.c void usage (int status)
dd.c int main (int argc, char **argv)
df.c void usage (int status)
df.c int main (int argc, char **argv)
digest.c void usage (int status)
digest.c int main (int argc, char **argv)
dircolors.c void usage (int status)
dircolors.c int main (int argc, char **argv)
dirname.c void usage (int status)
dirname.c int main (int argc, char **argv)
du.c void usage (int status)
du.c int main (int argc, char **argv)
echo.c void usage (int status)
echo.c int main (int argc, char **argv)
env.c void usage (int status)
env.c int main (int argc, char **argv)
expand-common.c extern void add_tab_stop (colno tabval)
expand-common.c extern void parse_tab_stops (char const *stops)
expand-common.c extern void finalize_tab_stops (void)
expand-common.c extern colno get_next_tab_column (colno column, idx_t *tab_index, bool *last_tab)
expand-common.c extern void set_file_list (char **list)
expand-common.c extern FILE * next_file (FILE *fp)
expand-common.c extern void cleanup_file_list_stdin (void)
expand-common.c extern void emit_tab_list_info (void)
expand.c void usage (int status)
expand.c int main (int argc, char **argv)
expr.c void usage (int status)
expr.c int main (int argc, char **argv)
factor.c void usage (int status)
factor.c int main (int argc, char **argv)
find-mount-point.c extern char * find_mount_point (char const *file, struct stat const *file_stat)
fmt.c void usage (int status)
fmt.c int main (int argc, char **argv)
fold.c void usage (int status)
fold.c int main (int argc, char **argv)
getlimits.c void usage (int status)
getlimits.c PRINT_FLOATTYPE (print_FLT, float, ftoastr, FLT_BUFSIZE_BOUND)
getlimits.c PRINT_FLOATTYPE (print_FLT, float, ftoastr, FLT_BUFSIZE_BOUND) PRINT_FLOATTYPE (print_DBL, double, dtoastr, DBL_BUFSIZE_BOUND)
getlimits.c PRINT_FLOATTYPE (print_DBL, double, dtoastr, DBL_BUFSIZE_BOUND) PRINT_FLOATTYPE (print_LDBL, long double, ldtoastr, LDBL_BUFSIZE_BOUND)
getlimits.c int main (int argc, char **argv)
group-list.c extern bool print_group (gid_t gid, bool use_name)
groups.c void usage (int status)
groups.c int main (int argc, char **argv)
head.c void usage (int status)
head.c int main (int argc, char **argv)
hostid.c void usage (int status)
hostid.c int main (int argc, char **argv)
hostname.c void usage (int status)
hostname.c int main (int argc, char **argv)
id.c void usage (int status)
id.c int main (int argc, char **argv)
install.c void usage (int status)
install.c int main (int argc, char **argv)
iopoll.c extern int iopoll (int fdin, int fdout, bool block)
iopoll.c extern bool iopoll_input_ok (int fdin)
iopoll.c extern bool iopoll_output_ok (int fdout)
iopoll.c extern bool fclose_wait (FILE *f)
iopoll.c extern bool fwrite_wait (char const *buf, ssize_t size, FILE *f)
join.c void usage (int status)
join.c int main (int argc, char **argv)
kill.c void usage (int status)
kill.c int main (int argc, char **argv)
link.c void usage (int status)
link.c int main (int argc, char **argv)
ln.c void usage (int status)
ln.c int main (int argc, char **argv)
logname.c void usage (int status)
logname.c int main (int argc, char **argv)
ls.c int main (int argc, char **argv)
ls.c DEFINE_SORT_FUNCTIONS (ctime, cmp_ctime)
ls.c DEFINE_SORT_FUNCTIONS (ctime, cmp_ctime) DEFINE_SORT_FUNCTIONS (mtime, cmp_mtime)
ls.c DEFINE_SORT_FUNCTIONS (mtime, cmp_mtime) DEFINE_SORT_FUNCTIONS (atime, cmp_atime)
ls.c DEFINE_SORT_FUNCTIONS (atime, cmp_atime) DEFINE_SORT_FUNCTIONS (btime, cmp_btime)
ls.c DEFINE_SORT_FUNCTIONS (btime, cmp_btime) DEFINE_SORT_FUNCTIONS (size, cmp_size)
ls.c DEFINE_SORT_FUNCTIONS (size, cmp_size) DEFINE_SORT_FUNCTIONS (name, cmp_name)
ls.c DEFINE_SORT_FUNCTIONS (name, cmp_name) DEFINE_SORT_FUNCTIONS (extension, cmp_extension)
ls.c DEFINE_SORT_FUNCTIONS (extension, cmp_extension) DEFINE_SORT_FUNCTIONS (width, cmp_width)
ls.c void usage (int status)
make-prime-list.c int main (int argc, char **argv)
mkdir.c void usage (int status)
mkdir.c int main (int argc, char **argv)
mkfifo.c void usage (int status)
mkfifo.c int main (int argc, char **argv)
mknod.c void usage (int status)
mknod.c int main (int argc, char **argv)
mktemp.c void usage (int status)
mktemp.c int main (int argc, char **argv)
mv.c void usage (int status)
mv.c int main (int argc, char **argv)
nice.c void usage (int status)
nice.c int main (int argc, char **argv)
nl.c void usage (int status)
nl.c int main (int argc, char **argv)
nohup.c void usage (int status)
nohup.c int main (int argc, char **argv)
nproc.c void usage (int status)
nproc.c int main (int argc, char **argv)
numfmt.c void usage (int status)
numfmt.c int main (int argc, char **argv)
od.c void usage (int status)
od.c PRINT_TYPE (print_s_char, signed char)
od.c PRINT_TYPE (print_s_char, signed char) PRINT_TYPE (print_char, unsigned char)
od.c PRINT_TYPE (print_char, unsigned char) PRINT_TYPE (print_s_short, short int)
od.c PRINT_TYPE (print_s_short, short int) PRINT_TYPE (print_short, unsigned short int)
od.c PRINT_TYPE (print_short, unsigned short int) PRINT_TYPE (print_int, unsigned int)
od.c PRINT_TYPE (print_int, unsigned int) PRINT_TYPE (print_long, unsigned long int)
od.c PRINT_TYPE (print_long, unsigned long int) PRINT_TYPE (print_long_long, unsigned long long int)
od.c PRINT_TYPE (print_long_long, unsigned long long int) PRINT_TYPE (print_intmax, uintmax_t)
od.c PRINT_FLOATTYPE (print_bfloat, bfloat16, ftoastr, FLT_BUFSIZE_BOUND)
od.c PRINT_FLOATTYPE (print_bfloat, bfloat16, ftoastr, FLT_BUFSIZE_BOUND) PRINT_FLOATTYPE (print_halffloat, float16, ftoastr, FLT_BUFSIZE_BOUND)
od.c PRINT_FLOATTYPE (print_halffloat, float16, ftoastr, FLT_BUFSIZE_BOUND) PRINT_FLOATTYPE (print_float, float, ftoastr, FLT_BUFSIZE_BOUND)
od.c PRINT_FLOATTYPE (print_float, float, ftoastr, FLT_BUFSIZE_BOUND) PRINT_FLOATTYPE (print_double, double, dtoastr, DBL_BUFSIZE_BOUND)
od.c PRINT_FLOATTYPE (print_double, double, dtoastr, DBL_BUFSIZE_BOUND) PRINT_FLOATTYPE (print_long_double, long double, ldtoastr, LDBL_BUFSIZE_BOUND)
od.c int main (int argc, char **argv)
operand2sig.c extern int operand2sig (char const *operand)
paste.c void usage (int status)
paste.c int main (int argc, char **argv)
pathchk.c void usage (int status)
pathchk.c int main (int argc, char **argv)
pinky.c void usage (int status)
pinky.c int main (int argc, char **argv)
pr.c int main (int argc, char **argv)
pr.c void usage (int status)
printenv.c void usage (int status)
printenv.c int main (int argc, char **argv)
printf.c void usage (int status)
printf.c STRTOX (intmax_t, vstrtoimax, strtoimax (s, &end, 0))
printf.c STRTOX (intmax_t, vstrtoimax, strtoimax (s, &end, 0)) STRTOX (uintmax_t, vstrtoumax, strtoumax (s, &end, 0))
printf.c STRTOX (uintmax_t, vstrtoumax, strtoumax (s, &end, 0)) STRTOX (long double, vstrtold, cl_strtold (s, &end))
printf.c int main (int argc, char **argv)
prog-fprintf.c void prog_fprintf (FILE *fp, char const *fmt, ...)
ptx.c void usage (int status)
ptx.c int main (int argc, char **argv)
pwd.c void usage (int status)
pwd.c int main (int argc, char **argv)
readlink.c void usage (int status)
readlink.c int main (int argc, char **argv)
realpath.c void usage (int status)
realpath.c int main (int argc, char **argv)
relpath.c bool relpath (char const *can_fname, char const *can_reldir, char *buf, size_t len)
remove.c enum RM_status rm (char *const *file, struct rm_options const *x)
rm.c void usage (int status)
rm.c int main (int argc, char **argv)
rmdir.c void usage (int status)
rmdir.c int main (int argc, char **argv)
runcon.c void usage (int status)
runcon.c int main (int argc, char **argv)
seq.c void usage (int status)
seq.c int main (int argc, char **argv)
set-fields.c void set_fields (char const *fieldstr, unsigned int options)
show-date.c extern bool show_date (char const *format, struct timespec when, timezone_t tz)
shred.c void usage (int status)
shred.c int main (int argc, char **argv)
shuf.c void usage (int status)
shuf.c int main (int argc, char **argv)
sleep.c void usage (int status)
sleep.c int main (int argc, char **argv)
sort.c void usage (int status)
sort.c int main (int argc, char **argv)
split.c void usage (int status)
split.c int main (int argc, char **argv)
stat.c void usage (int status)
stat.c int main (int argc, char *argv[])
stdbuf.c void usage (int status)
stdbuf.c int main (int argc, char **argv)
stty.c ATTRIBUTE_FORMAT ((printf, 1, 2))
stty.c void usage (int status)
stty.c int main (int argc, char **argv)
sum.c int bsd_sum_stream (FILE *stream, void *resstream, uintmax_t *length)
sum.c int sysv_sum_stream (FILE *stream, void *resstream, uintmax_t *length)
sync.c void usage (int status)
sync.c int main (int argc, char **argv)
tac-pipe.c Line_ptr line_ptr_decrement (const Buf *x, const Line_ptr *lp)
tac-pipe.c Line_ptr line_ptr_increment (const Buf *x, const Line_ptr *lp)
tac.c void usage (int status)
tac.c int main (int argc, char **argv)
tail.c void usage (int status)
tail.c int main (int argc, char **argv)
tee.c void usage (int status)
tee.c int main (int argc, char **argv)
temp-stream.c bool temp_stream (FILE **fp, char **file_name)
test.c ATTRIBUTE_FORMAT ((printf, 1, 2))
test.c void usage (int status)
test.c int main (int margc, char **margv)
timeout.c void usage (int status)
timeout.c int main (int argc, char **argv)
touch.c void usage (int status)
touch.c int main (int argc, char **argv)
tr.c void usage (int status)
tr.c int main (int argc, char **argv)
true.c void usage (int status)
true.c int main (int argc, char **argv)
truncate.c void usage (int status)
truncate.c int main (int argc, char **argv)
tsort.c void usage (int status)
tsort.c int main (int argc, char **argv)
tty.c void usage (int status)
tty.c int main (int argc, char **argv)
uname.c void usage (int status)
uname.c int main (int argc, char **argv)
unexpand.c void usage (int status)
unexpand.c int main (int argc, char **argv)
uniq.c void usage (int status)
uniq.c int main (int argc, char **argv)
unlink.c void usage (int status)
unlink.c int main (int argc, char **argv)
uptime.c void usage (int status)
uptime.c int main (int argc, char **argv)
users.c void usage (int status)
users.c int main (int argc, char **argv)
wc.c void usage (int status)
wc.c int main (int argc, char **argv)
wc_avx2.c extern struct wc_lines wc_lines_avx2 (int fd)
wc_avx512.c extern struct wc_lines wc_lines_avx512 (int fd)
who.c void usage (int status)
who.c int main (int argc, char **argv)
whoami.c void usage (int status)
whoami.c int main (int argc, char **argv)
yes.c void usage (int status)
yes.c int main (int argc, char **argv)
で、
getlimits.c PRINT_FLOATTYPE (print_FLT, float, ftoastr, FLT_BUFSIZE_BOUND)
getlimits.c PRINT_FLOATTYPE (print_FLT, float, ftoastr, FLT_BUFSIZE_BOUND) PRINT_FLOATTYPE (print_DBL, double, dtoastr, DBL_BUFSIZE_BOUND)
getlimits.c PRINT_FLOATTYPE (print_DBL, double, dtoastr, DBL_BUFSIZE_BOUND) PRINT_FLOATTYPE (print_LDBL, long double, ldtoastr, LDBL_BUFSIZE_BOUND)
こういうのはマクロ(この例ではPRINT_FLOATTYPE)で、
展開すると関数になるのだけど、
きちんと(?)staticつきだった😄
clang
けっこーgccと違うのね
- strftime: pacify clang -Wstring-plus-int - GNU portability library
- [\ PATCH] strftime: pacify clang -Wstring-plus-int
- float-h: Ensure ISO C23 compliance with clang 22. - GNU portability library
- ISO/IEC 60559:2020 Information technology — Microprocessor Systems — Floating-Point arithmetic
- C support for ISO/IEC 60559:2020 WG 14 N2531
- float-h: Ensure ISO C23 compliance with clang 22
WG 14
| N3846 | 2026/03/10 | Grant, compile_assert – optimization-enforced conditions at compile time |
| N3841 | 2026/03/10 | Thomas, March 2026 CFP teleconference agenda |
| N3842 | 2026/03/08 | Thomas, C2Y proposal - Standard pragmas and headers (Updates N3702) |
| N3840 | 2026/03/08 | Thomas, February 2026 CFP teleconference minutes |
| N3835 | 2026/03/08 | Meneide, Transparent Aliases, r7 |
| N3834 | 2026/03/08 | Meneide, Thread Attributes, r3 |
| N3833 | 2026/03/08 | Meneide, Integer Constant Expression-Initialized const Integer Declarations are Implicitly constexpr, r4 |
| N3832 | 2026/03/08 | Myers, Floating-point TS 18661 (C23 version, 2025) issue log, r3 |
| N3831 | 2026/03/08 | Myers, C23 issue log, r4 |
| N3808 | 2026/03/08 | Karl, Remove undefined behavior for invalid multibyte characters and non-initial shift states in preprocessing tokens and header names |
| N3807 | 2026/03/08 | Karl, Remove undefined behavior for non-basic source characters in source files |
| N3806 | 2026/03/08 | Karl, Remove undefined behavior for mismatched quote characters |
新刊近刊
ピンチは数学で解決
ピンチは数学で解決: ゾンビ襲来から宇宙空間サバイバルまで | クリス・ワーリング, 尼丁 千津子 |本 | 通販 | Amazon
メモ
QuickDrawの技法
初期Macintoshを支えた描画エンジン QuickDrawの技法 | 柴田文彦 |本 | 通販 | Amazon
けっこうな値段だなあと思ったら分厚い本だった
| 出版社: | ラトルズ |
| 発売日: | 2026/3/25 |
| 本の長さ: | 552ページ |
| 商品の重量: | 649 g |
| 寸法; | 14.8 x 2.7 x 21 cm |
Kindle版はもう読める?
ところでなんとなく著者のお名前に見覚えが…と思ったら
この辺の本の著者だった
創って学ぶCPUの基本
創って学ぶCPUの基本 3bitプロセッサを作りながらゼロから仕組みを理解する | 檀上京之介 |本 | 通販 | Amazon
キットはこれ? ビット・トレード・ワン、CPUの仕組みを初歩から学べる自作CPUキットを発売 - ITmedia PC USER
awk
gawk
文字列連結
Fortranが//https://t.co/V1HLOOJV7B
— 高橋カヲル (@kaoru6) March 4, 2026
Juliaが*ですなhttps://t.co/vSiJL7hTJV
文字列 - マニュアル - Julia 1.5.4 ドキュメント (翻訳) - inzkyk.xyz
文字列の連結には * が使えます:
julia> greet \* ", " \* whom \* ".\n" "Hello, world.\n"
文字列の連結に + を使う言語のユーザーは * が選ばれているのに驚くかもしれません。 文字列の連結に対する * の利用は数学 (特に抽象代数) に先例があります。
数学では普通 + は可換な演算を表します。可換な演算とはオペランドの順序が 結果に影響しない演算のことであり、例えば行列の加算では同じ形状を持つ任意の行列 A, B に対して A + B == B + A が成り立つので、行列の加算は可換です。 これに対して * は通常非可換な演算を表します。非可換な演算とは、一般に A * B != B * A となる演算のことです。greet * whom != whom * greet なので、 行列の乗算と同様、文字列の連結は非可換です。したがって、 文字列連結を表す中置演算子としては * が一般的な数学での使われ方と一致する自然な選択となります。
さらに正確に言うと、有限長の文字列全ての集合 S と文字列連結演算 * は自由モノイド (S, *) を構成します。 この集合の単位元は空文字列 "" です。自由モノイドが非可換であるとき、 その演算は ⋅ や * といった記号で表記されます。そして上述の通り、+ は可換な演算を表す記号として区別されます。
へー
57577
プロジェクト・ヘイル・メアリー上下巻 アンディ・ウィアー 小野田和子訳 #短歌 https://t.co/n0hYGfVA41
— 浅木原忍 (@asagihara_s) March 7, 2026
GHC
GHCの次のバージョンは9.16ではなく10.0になる。4月1日にブランチが切られる予定。新機能をねじ込むなら今のうち。新機能記事の準備も徐々に進めた方が良いか https://t.co/hA713zmT7K
— mod_poppo (@mod_poppo) March 7, 2026