C

printf () 系列で、書式の頭で指定する幅 ("%02d" の 2 とか) は * を指定することで parametrize できるのか。知らんかった。

Flag 宣言

書いてみたけどいまいち。Level の区分が役不足になってからの方がよさそう。 #define SQUISH(n) (!!((n) & 0xF)) #define HEX2BIN(n) (SQUISH(n) \ | (SQUISH((n) >> 4) << 1) \ | (SQUISH((n) >> 8) << 2) \ | (SQUISH((n) >> 12) << 3) \ | (SQUISH((n) >…

SCM_STRING_LEN()

size_t にまとめる予定はあるんかしら。まとめようとするとそれはそれで while (i

昇格

C

((unsigned char)0 - (unsigned char)1) < (unsigned char)0と (unsigned char)(-1) < (unsigned char)0では結果が違う。何その素敵な罠。

C 的嫌がらせ

C

これ。charへの pointer を返す関数への pointer を返す関数への pointer N個の配列だとさ。 typedef 使わずに関数を返す関数の宣言を書こうとしたら書けんかったのだ。括弧の位置がちょっと違った。

C

Shift 演算の最適化弱いなあ GCC。 jun@debian /tmp $ cat tmp.c int f (int x) { return (x & ~1) >> 2; } jun@debian /tmp $ gcc -S -o - -O2 tmp.c .file "tmp.c" .text .p2align 4,,15 .globl f .type f, @function f: pushl %ebp movl %esp, %ebp movl …

もっとちゃんとした curry

C

() で括られた list を splice するのが困難と思い込んでたので随分遠回りしてしまった。C macro は turing machine よりずっと弱いので、引数が制限されるのは不可避。それを除けば結構関数っぽく使える。あー面白かった(マテ #define INFLATE_() #define I…

記憶が朧げに蘇ってきそうなよ〜なそーでもないよ〜な…

mcpp の document に目を通したけど、## については xglue () [↓でいう CAT()] が「よくある手」となってるだけで、特に buggy ではないらしい。件の macro 群を書いてたときには「評価」とか基礎的な概念の理解が固まってなかったから、単純に馬鹿だったと…

Parametrized symbol concatenation

あれーー? これって OK なのか。これが使えるんなら misc の実装は 10 倍ぐらい単純かつ柔軟にできる。 #define CAT(x, y) x##y #define IFACE(arg) INTERM(CAT(arg, _), arg) -- CAT(arg, Y) #define INTERM(a, b) FIN(a, (a), b, (b)) #define FIN(a, b, c…

ぶつくさぶつくさ

C

ったく…これだから健全じゃない macro は…

符号つき整数の拡張

C

むう? 規格にこれの規定って無かった? 見当たらんけど… uint32_t x = (int8_t)-1;6.3.1.8 (Usual Arithmetic Conversion) には "[...]the operand with signed integer type is converted to the type of the operand with unsigned integer type." とあるだ…

知らんかった

C

enum ex{ X };としたとき、X という expression の型は int。しかし enum ex は整数系のどれでもいい。 まあ当り前といえば当り前か。

&& は & より遅い

Compiler に面倒見てもらえないのかと言ったやつ。とりあえずの解釈として、&& は & や % などとの組合せの代数的性質がよくないので compiler が reduce しにくい/しようとしないのかと考えてみた。つまり、&& などの条件演算子はあくまで独立条件を加味し…

SCM_ASSERT()

#define TRL_EXECUTE(foo) (SCM_ASSERT(bar), baz) としていたので、非 debug 時には (, baz) と展開されてしまい、error になる。他にも #define SCM_ENCODING_ASSERT(cond) (SCM_ASSERT(cond)) も SCM_ENCODING_ASSERT(foo); が (); と展開されてしまい、e…

前から気になってたどうでもいいこと

C

この書き方を見て何を思いますか。 if (a) { return 0; } else for (x;y;z) ;他に while, switch, do-while など。

(´・ω・`)=3

結局 call で alloca() の出る幕はありませんでしたとさ。残念。Buffer size をあらかじめ調べておいて malloc() した方が良い。Buffer size を記録しておくのが不経済なので realloc()。Gauche は compile と transcribe が連続で呼び出されるから stack に…

C

ゴミ値を代入する初期化構文がほしい。 int f() { int i = __garbage(); return i; } /* ↑と等価 */ int g() { int i; return i; }

うひひ、珍しいもの? が書けた

関数 call (trampoline) で alloca の代わり、できそうで利便性の低さ故なかなかできない。今回は結構自然な感じで使えた。まず 99% 走らん code だから意味とかは無いけどちょっと嬉しい。えへ。;; もし、後からもっといい実装思いついたらとりあえずため息…

longjmp() vs return

C

さっさと macro を実装し終えないといかんけど、脱線がやめられないとめられない。Pattern match で mismatch が起きたときの処理だけど、 特定の値を返して return しまくる longjmp の二つがある。前者だと戻り値の判定が積もる。後者だと setjmp() が重い…

shift と /

C

以前、(sign)a >> n == a / (1 妄言を吐いたことがありますが、間違ってます。過去にも同じ過ちを犯した覚えが鮮烈に甦ってきました。進歩がありませんね。C では / は 0 に向かって切り捨てるのに対して、>> は floor です。つまり -1 / 8 = 0, -1 >> 3 = -…

gcc で一番よく使う option は -S

C

Makefile を使わずに自分で呼び出す分には案外冗談でもない。

C

SigScheme で setjmp() を使っててややこしい代入操作が。これってどうだっけか。これだと volatile store にはならんのだっけか。 type *var; (type * volatile)var = sth;忘れた。C99 rationale 見よう。何か書いてあったはず。追記: っていうかこれだと e…

cascaded if-else

いつだったか if (...) { } else if (...) { }と cascade された if-else は何となく嫌いだと書いたけど、理由がちょっとわかった。自分の style としては if (cond) { /* Some procedure. */ } else { /* Some very different (possibly orthogonal) proced…

C

GCC が変な事を言い出した 本当に言い *出した*。警告が出ないことを確認してから commit してるので、commit 時点では出てなかったはず。GCC version 上げたっけ。そんな気もする。現在 4.0.2。4.0.1 → 4.0.2 で出現した bug か?アホな事を言ってしまった o…

C

Macro に副作用つき引数 Splint というのが check してくれるらしい。が。使ってみるといきなり debug.c でコケたり、大丈夫とわかってるのまで paranoid に警告しすぎるせいで必要な情報を抽出しにくかったり (人工無能ホスィ)、細かく制御するには source …

C

byte ヤマケンさんの comment とか kzk さんの code とか読んでて、以外と知られてない事実なんではないかと思ってみた: C99 仮想 machine では、char 型の容量こそが byte の定義である。1 byte >= 8 bits であれば、何 bits でもいい (C89 は知らないけど…

C

Nested function が欲しい。欲しい。欲しい。欲しい。便利な場面は山ほどあるのに C99 でも追加されなかった。嘆かわしい。

word

C

Reinterpret してるものってそういうことね。 まあ何でもいいや。 ところで SigScheme はやたらと int を word にとってますが、32/64bit machine 対応なら long なのでは? 記憶が曖昧ですが、64bit machine では大抵 int=32, long=64, ptr=64 だったはず。 …

C

ちっ、object code 読むまで何でかわからんかった…まだまだ甘いな。 しかし何を reinterpret してるのかはよくわからんす。Acess 幅*1でいいのかな? C++ の reinterpret_cast の semantics もこんなんだったような、違ったような… それと余計な御世話かもし…

C たんハァハァ( ;´Д`)

C

ScmObj (*func)() = 略; ... switch (i) { case 0: return (*func)(); case 1: return (*func)(argbuf[0]); case 2: return (*func)(argbuf[0], argbuf[1]); ... case 5: return (*func)(argbuf[0], argbuf[1], argbuf[2], argbuf[3], argbuf[4]); default: …