Langphilia! / KL1 / KLIC-3.003 / Patch / パッチとTARボールはこちら → 2002-03/, 2002-02/, 2002-01/, 2001/

KLIC-3.003 以降のパッチ。導入は自己責任で。不具合がありましたら、 上田研言語班 lang@ueda.info.waseda.ac.jp にご連絡下さい。また、(ライセンスに 制限を加えない)修正をお送り下されば、マージして公開致します。


  1. 2002-03-29
  2. 2002-03-26, いろいろゴミ捨て
  3. 2002-03-23
  4. 2002-03-21, ジェネリックオブジェクト関連のマクロを整理
  5. 2002-03-20
    1. random_numbers をコンシューマオブジェクトに変えました。 [R|Rs] を渡すと R に乱数を入れてくれます。[] を渡すと終了。 → 使用例
    2. ジェネリックオブジェクトメソッド表の命名規約を変更
  6. 2002-03-19a : method_result, GD_RETURN 削除
  7. 2002-03-19, SHM 版を完全に削除
  8. 2002-03-16, compiler/ generate.kl1, normalize.kl1 : gen_code/14 → gen_code/6, move_one_1 で P=arg(X0,J) の時 AssocList への追加が間違っているらしいものを修正
  9. 2002-03-15, {compiler, runtime}/*.kl1 : コメントなど
  10. 2002-03-12a
    1. signal_handlers - allocp
    2. compiler/obj.kl1, include/klic/ g_vector.h, generic.h : new_generic, call_generic - offset
  11. 2002-03-12 : create_vector, step_after, trace_after - allocp
  12. 2002-03-11c : g_allocp をほとんど追放した
  13. 2002-03-11b
  14. 2002-03-11a : G_MAKE_THE_NEW_GOAL, GD_MAKE_GENERIC_GOAL - g_allocp
  15. 2002-03-11 : generator.unify の結果として成功・失敗を返すようにした
  16. 2002-03-09b : gd_new, gd_generic, convert_c_string_to_klic_string - g_allocp
  17. 2002-03-09a : body_generic, generate - g_allocp
  18. 2002-03-09 : active_unify, generic_generate - g_allocp
  19. 2002-03-08b : do_unify*, makenewsusp, addhook - allocp
  20. 2002-03-08a, runtime/faisus.c, generic.c : suspend_goal, record_susp - allocp
  21. 2002-03-08, Configure, MANIFEST, runtime/ Makefile.head, Makefile.tail, config/???/*.mk.sh : 整理
  22. 2002-03-05g : G_COPY_KL1_TERM_TO_NEWGEN, G?SET_NEWOBJ_IN_NEWGEN - g_allocp
  23. 2002-03-05f : generic_gc, G?_RETURN_FROM_GC - g_allocp
  24. 2002-03-05e, runtime/gc.c : generic_gc - g_allocp
  25. 2002-03-05d, include/klic/g_basic.h, runtime/ gc.c, gmvv.c : make_larger_stack → push_gc_stack
  26. 2002-03-05c, include/klic/g_basic.h, runtime/ gc.c, gmv.c : make_larger_stack, copy_one_goal, push_gc_stack, reserve_copy - sp
  27. 2002-03-05b, include/klic/ g_basic.h, g_methtab.h, gc_macro.h, gd_macro.h, gg_macro.h, runtime/ gc.c, generic.c, gmvv.c, random.c (g_sp) : 削除
  28. 2002-03-05a, runtime/gc.c : copy_one_goal, push_gc_stack, reserve_copy - max
  29. 2002-03-05, include/klic/g_extern.h, runtime/ export_table.c, gc.c, sendrecv.c : general_gc, copy_terms, push_shm_stack - sp
  30. 2002-03-04a
    1. include/klic/alloc.h, runtime/ alloc.c, export_table.c, faisus.c (klic_alloc)
    2. Configure, runtime/Makefile.tail, config/???/runtime.mk.sh : DEBUGLIB を削除
  31. 2002-03-04, runtime/ cntlmsg.c, datamsg.c, debug.c, faisus.c, gc.c, intrpt.c, kmain.c, print.c, sched.c, shm_throw.c, unify.c [DEBUGLIB] : 削除
  32. 2002-03-02, runtime/config/*/* : 整理
  33. 2002-02-26d, runtime/config/pvm/ distio.c, distio.h, distpkt.c : has_attached → static
  34. 2002-02-26c, compiler/klic.c, config.h.sh, runtime/config/pvm/ distproc.c, distrmon.c, rmon_server.c, : DIST_COMPILER_FLAG, DIST_LINKAGE_FLAG
  35. 2002-02-26b
    1. runtime/ bb.c, cmphsh.c
    2. runtime/ config/pvm/distproc.h, config/pvm-tcp/distpkt.c, config/shm/distproc.h, debug.c, kmain.c : Close_net 削除
    3. runtime/ cntlmsg.c, ge_exref.c, ge_exref.h : get_exref_methtab
  36. 2002-02-26a, include/klic/struct.h, runtime/ bb.c, faisus.c, intrpt.c, kmain.c, sched.c, unify.c : resumed_goals → static
  37. 2002-02-26, runtime/ asyncio.c, config/pvm-tcp/distpkt.c : debugger_flag → static
  38. 2002-02-25c : global - *
  39. 2002-02-25b : global - *
  40. 2002-02-25a, runtime/ asyncio.c, asyncio.h, config/pvm-tcp/distpkt.c : sigio_handlers, send_ready_message, dist_sigio_stream_handler - allocp
  41. 2002-02-25, include/klic/gg_macro.h, runtime/ cntlmsg.c, datamsg.c, ge_exref.c, random.c (GG_*, new_generic) : assert
  42. 2002-02-24c, include/klic/gd_macro.h, runtime/ gcode.c, gfloat.c, ggoal.c, gmodule.c, gmvv.c, gpointer.c, gstring.c, gtermarray.c (GD_*) : assert
  43. 2002-02-24b, include/klic/ g_methtab.h, gc_methtab.h, gd_methtab.h, gg_methtab.h, runtime/generic.c (regist, close) : 削除
  44. 2002-02-24a
    1. runtime/shm_obj.c (resume_same_prio) : 削除
    2. include/klic/gc_macro.h, runtime/ ge_readhook.c, ge_reply_hook, gio.c, gmerge.c, wakeup.c (GC_*) : assert
  45. 2002-02-24, (enqueue_at_priority, G_MAKE_VAR, G_COPY_KL1_TERM_TO_NEWGEN) : assert
  46. 2002-02-22e, runtime/*.kl1 : public 宣言とレイアウト
  47. 2002-02-22d, runtime/asyncio.c (Call_sigio_handler) : 削除
  48. 2002-02-22c, include/klic/ g_basic.h, gc_macro.h, gd_macro.h, gg_macro.h, runtime/ gmvv.c, gstring.c (G_HEAPALLOC_WITH_CHECK) : assert
  49. 2002-02-22b, (G_HEAPALLOC) : assert
  50. 2002-02-22a, include/klic/g_basic.h (G_HEAPALLOC) : assert
  51. 2002-02-22, include/klic/ bb.h, unify.h [COMPACTCODE] : 削除
  52. 2002-02-20g, include/klic/sighndl.h, runtime/ gunix.kl1, intrpt.c, signal.c : klic_signal_handler, register_streamed_signal - allocp
  53. 2002-02-20f, include/klic/ g_basic.h, struct.h, runtime/ gc.c, kmain.c : ごみを削除
  54. 2002-02-20e, include/klic/index.h (deref_and_test, not_*) : 削除
  55. 2002-02-20d, include/klic/gg_macro.h : ごみを削除
  56. 2002-02-20c, include/klic/gd_macro.h : ごみを削除
  57. 2002-02-20b, include/klic/ gc_macro.h, struct.h, runtime/ generic.c, gobj.h, unify.c : ごみを削除
  58. 2002-02-20a, include/klic/gc_macro.h : ごみを削除
  59. 2002-02-20, compiler/obj.kl1, runtime/gc.c
  60. 2002-02-19e, include/klic/ alloc.h, struct.h, runtime/ alloc.c, gc.c : gc_hook_table, num_gc_hooks, gc_hooktab_size → static
  61. 2002-02-19d : register_gc_hook, gc_asyncio_streams, gc_exp_table, gc_timer_data, gc_decode_stack, gc_signal_streams, gc_postmortem_args - allocp, ntop, otop, nsize, osize
  62. 2002-02-19c, runtime/ asyncio.c, gc.c, ktimer.c, signal.c, sysc.kl1 : copy_one_term - allocp, ntop, otop, nsize, osize
  63. 2002-02-19b, runtime/gc.c : copy_terms, copy_one_queue - ntop, otop, nsize, osize
  64. 2002-02-19a : new_space_top, new_space_size, old_space_top, old_space_size → static
  65. 2002-02-19, runtime/gc.c : copy_terms, copy_one_queue - hp
  66. 2002-02-18e : register_after_gc_hook, scan_imp_table, deallocate_garbage - allocp
  67. 2002-02-18d, runtime/ config/*/distpkt.c, ktimer.c : set_simple_interval_timer_handler - allocp
  68. 2002-02-18c
    1. deallocate - allocp
    2. runtime/print.c : general_print の型を修正
  69. 2002-02-18b, runtime/ kmain.c, sched.c : initiate_prioq, reinitiate_prioq - allocp
  70. 2002-02-18a, runtime/ faisus.c, step.c, step.h : step_susp, step_unify_results - allocp
  71. 2002-02-18, runtime/unify.c : generator_unify - allocp
  72. 2002-02-17e, include/klic/ gc_macro.h, gd_macro.h, gg_macro.h, runtime/generic.c : G_SUSPEND, G_MAKE_THE_NEW_GOAL - g_allocp
  73. 2002-02-17d : general_gc, do_shallow_unify, do_shallow_unify_value - allocp
  74. 2002-02-17c : G_HEAPALLOC_WITH_CHECK - allocp
  75. 2002-02-17b : check_stack_for_alternatively, enqueue_after_waiting, enqueue_throw_goal - allocp
  76. 2002-02-17a, compiler/write.kl1, include/klic/control.h, runtime/faisus.c : interrupt_goal - allocp → interrupt_goal0
  77. 2002-02-17, include/klic/ alloc.h, control.h, runtime/ intrpt.c, kmain.c, sched.c : klic_interrupt - allocp
  78. 2002-02-16
    1. include/Makefile.tail : susp.h がインストールされなくなってたのを修正
    2. マクロ heapp を関数 heapp() と set_heapp() にした
  79. 2002-02-08b : FUNCTORNUMBERBASE 削除
  80. 2002-02-08a : functors, arities
  81. 2002-02-08, runtime/ atomt.kl1, datamsg,c, print.c : 変えた atomnames に合わせた
  82. 2002-02-06b, compiler/klicdb.c, runtime/newatom.c : atom.h, atom.c に [] と . も書くようにした
  83. 2002-02-06a, compiler/klicdb.c, include/klic/atomstuffs.h, runtime/ debug.c, newatom.c : → atomname(), static atomnames
  84. 2002-02-06, compiler/klicdb.c, include/klic/atomstuffs.h, runtime/newatom.c : atom.c にあった atomname = init_atomname; を newatom.c へ移動
  85. 2002-01-25, include/klic/control.h, runtime/ cntlmsg.c, config/shm/distio.c, trace.c, version.c.tmplt : make 時の警告に従って修正
  86. 2002-01-23, compiler/ *.kl1
  87. 2002-01-22, compiler/ bb.kl1, cmacro.kl1, extern.kl1, gb.kl1, generate.kl1 : public 宣言, レイアウト. 1行に複数のゴール書くの止めようよ
  88. 2002-01-21, *.c を gcc でコンパイルして出てきた警告・エラーを修正
  89. 2002-01-18
    1. Configure : SHM 版をインストールしないようにした
    2. include/klic/g_extinl.h : 削除
    3. susp.h : 一度は runtime/ に追い出したけど自作 generator object から使いたくなったので include/klic に移動。わがまま
    4. runtime/alloc.c (real_heapbytesize) : 引き算のオペランドが逆 (by 加藤@上田研)
  90. 2002-01-15a, runtime/unify.c (resume_goals) : 自作 generator object から呼びたくなったので extern に戻した。わがまま
  91. 2002-01-15, deallocate + allocp
  92. 2002-01-13
    1. runtime/config/pvm/*.?
    2. runtime/ datamsg.c, debug.c, export_table.c, faisus.c, functt.kl1, gunix.kl1
    3. runtime/runtime.h: config/pvm/distio.h にあった ioprintf, ioeprintf, iosprintf の宣言を移動
  93. 2002-01-12a
    1. include/klic/gd_macro.h (GD_body_no_arity) : 削除
    2. runtime/ alloc.c, g_pointer.h, g_termarray.h, gc.c, gcode.c, ge_exref.c, ge_readhook.c, ge_replyhook.c, gen.kl1, generic.c, gfloat.c, import_table.c
  94. 2002-01-12, runtime/ gg_shbusy.c, gg_shvar.c, ggoal.c
  95. 2002-01-11
    1. runtime/gio.c (functor_fclose_1) : FALL THRU しないようにした
    2. runtime/ gmerge.c, gmvv.c, gstring.c : テストのためのコメントを削除
    3. runtime/ gmodule.c, gpointer.c, gtermarray.c
    4. runtime/gobj.h : datamsg.c, faisus.c, gc.c, print.c, unify2.c へそれぞれのローカルマクロを移動
  96. 2002-01-07b
    1. runtime/gunix.kl1 : NO_USESOCKET って何? 削除
    2. runtime/init_dist.c (before_exec, after_exec) : cntlmsg.c へ移動して static にした
    3. runtime/import_table.c
  97. 2002-01-07a
    1. runtime/interpe.h : cntlmsg.c, export_table.c, import_table.c, sendrecv.c へそれぞれのローカルオブジェクトを移動
    2. runtime/ intrpt.c, io.kl1, itimer.kl1
  98. 2002-01-07, runtime/ kmain.c, ktimer.c
  99. 2002-01-06c, runtime/ main.c, newatom.c, options.c
  100. 2002-01-06b
    1. runtime/options.h : kmain.c でだけ宣言されるものを kmain.c へ移動
    2. runtime/ otbl.c, pipedio.c
  101. 2002-01-06a
    1. runtime/print.c : if は表引きに置き換えられそう
    2. runtime/ profile.c, random.c, recsusp.c
  102. 2002-01-06, runtime/rmon.h
  103. 2002-01-05
    1. include/klic/interpe.h : BCOPY, BZERO 再定義防止
    2. runtime/sched.c
  104. 2002-01-04, runtime/sendrecv.c
  105. 2002-01-03, runtime/shm* : SHM版が使えないようなので意味はないけど
  106. 2002-01-02
    1. runtime/step.h : step.c の extern 宣言
    2. runtime/timing.c : 削除
  107. 2002-01-01
    1. include/klic/stdc.h : STRINGH, STDDEFH を集中
    2. runtime/trace.h : extern/static を trace.c と再配分
  108. 2001-12-31, include/klic/stdc.h : 互換性のためのコードを集める
  109. 2001-12-30, include/klic/extinl.h : 削除
  110. 2001-12-29
    1. include/klic/basic.h : Const/Volatile 殲滅完了, NoReturn → NeverReturn
    2. runtime/config/pvm-tcp/distpkt.c, runtime/sendrecv.c : 引数違う fatal 呼び出し → fatalf
    3. illegal → invalid [GNU coding standard]
  111. 2001-12-28, include/klic/*.h : runtime/ からしか #include されないファイルを runtime/ へ移動
  112. 2001-12-27, include/klic/ gobjutil.h, msgfmt.h : % find . -type f | xargs grep 'gobjutil' とかやってみても何も表示されないので消してみました
  113. 2001-12-25
    1. MANIFEST : % find . -name '*' | sort > MANIFEST
    2. include/klic/*.h : ごみコメントを削除
    3. include/klic/newatom.h : static を runtime/newatom.c へ移動
    4. runtime/*.c : extern 宣言をヘッダへ
    5. runtime/runtime.h : runtime/ でしか使わなそうな extern 宣言
  114. 2001-12-22
    1. ChangeLog : runtime/makeChangelog.perl はうさん臭いので使わないことにした
    2. compiler/write.kl1 : Const → const
    3. include/klic/*.h : プロトタイプ宣言
  115. 2001-12-02, README.j : 以前として (thanks 増田@上田研)
  116. 2001-11-26, runtime/gunix.kl1 : mktemp → mkstemp (thanks 魏@上田研)
  117. 2001-11-25, compiler/klicdb.c (error_exit) : 引数違う
  118. 2001-11-24, compiler/klicdb.c, やっぱり Extern は容赦することにした
  119. 2001-11-23, compiler/klic.c : -C option, .ext 再生成条件, プロトタイプ宣言
  120. 2001-11-22, include/klic/basic.h : Extern/Const/Volatile 撲滅計画発動
  121. 2001-11-21, runtime/termio.kl1 : fork_with_pipes on klicio (by 金木@上田研)
  122. 2001-11-20
    1. FOR-DEVELOPERS.j, README.j : 誤字
    2. Makefile.tail : distclean/realclean 時に共有ライブラリを消す
    3. include/klic/*.h : マクロをおおむねカッコで囲んだ
  123. 2001-11-19, include/klic/*.h : 複数回展開防止
  124. 2001-11-18, klic-bugs@klic.org に流れたもの、その他
    1. compiler/klic.c : 引数の個数 (by ? 藤瀬@MRI, 横山@近山研)
    2. include/klic/control.h : REDCTION_COUNT
    3. include/klic/gg_macro.h : GG_ERROR_IN_IN → GG_ERROR_IN_NEW
    4. runtime/debug.c : sys_errlist[] → strerror() (by YOSHIKAWA@東大)
    5. runtime/gunix.kl1 : fork_with_pipes on unix (by 金木@上田研)
  125. extio/shared (by 五十嵐@上田研)
    1. extio, Prolog風の非同期ソケット入出力をサポート
    2. shared, libklic を共有ライブラリ化。バイナリが小さくなる

How to install from ${PATCH}.tgz

  1. % tar xzf ${PATCH}.tgz
    or, % gzcat ${PATCH}.tgz | tar xf -
  2. % cd ${PATCH}/
  3. % ./Configure
  4. % make all && make tests
  5. # make install

How to apply ${PATCH}.patch

  1. % cd ${OLD_SRC_DIR}
  2. % cat ${PATCH}.patch | patch -p1
    extio/shared は -p0、2001-* は -p1。
  3. % ./Configure builddist
    ソース *.kl1 を変更した場合、 ${OLD_INST_DIR}/lib/klic/kl1cmp によって それをコンパイルして、修正済み *.c を生成する必要があります
    (*.kl1 を変更していない場合は、./Configure だけで良い)。
    途中でKLICライブラリとコンパイラの場所を聞かれるので、 ${OLD_INST_DIR}/lib/klic を答えて下さい。
    それとは別にインストール先を聞かれますが、 こちらは ${NEW_INST_DIR} を答えて下さい。
  4. % make all && make tests
  5. # make install

開発環境

how to make ${PATCH}.patch file

  1. ソース ${NEW_SRC_DIR}/*.{kl1, h, c} を書き換える。
  2. % diff -ruN ${OLD_SRC_DIR} ${NEW_SRC_DIR} > ${PATCH}.patch

how to make ${PATCH}.tgz file

  1. % cd ${NEW_SRC_DIR}
  2. % ./Configure builddist
    1. [PARALLEL ?] yes
    2. [DIST ?] yes
    3. [pvm, pvm-tcp, shm] shm
    4. これ以外の選択肢はデフォルトのまま
  3. % make all && make tests && make disttests && make verify
  4. # make install
  5. % make realclean
  6. % ./Configure builddist コンパイラの出力 (*.kl1 → *.c) を変更した場合、セルフコンパイルする
  7. % make all && make tests && make disttests && make verify
  8. % make distclean
  9. % cd .. ; tar czf ${PATCH}.tgz ${NEW_SRC_DIR}

known bugs, misfeatures, and ヤなところ

  1. ドキュメント不足
  2. 標準入力を待っている間、その他の入出力がブロックされる → unix:unix([stdin(R)]) @node(1) とかして回避できる。
  3. public 宣言されていない述語をモジュール外部から呼び出せてしまう。
  4. klicio を unix に合わせる必要はない。単なる decorator なんだから。
  5. マクロ使い過ぎ
  6. グローバル変数使い過ぎ
  7. 条件コンパイルは論理的なインデントを破壊する
  8. KLIC-C のインタフェイスが分かりづらい。 何で G?SET_NEWOBJ_FOR_NEW は size を取るのに G?SET_NEWOBJ, G?SET_NEWOBJ_IN_NEWGEN は取らないんだ?
  9. 未定義変数同士の単一化を検出すれば ジェネレータオブジェクトは要らない気がする。
  10. モジュール変数・関数は static 宣言しろよ〜。 解析に手間がかかるじゃないか。
  11. 何で makeChangelog.perl が runtime/ にあるんだ?
  12. おそらく効率のために、 KL1 のモジュールが C の関数へ翻訳される (述語呼び出しごとにプロセスが生成されるせいで効率が悪いのではないか という非難もあるけど、逐次実行部分の検出による最適化は可能)。 このせいで KLIC-C ではマクロが乱用され、 KLIC 処理系のモジュール化が妨げられている。 ヒープ管理とか独立モジュールにした方が分かりやすいだろう。
  13. 移植性に関する矛盾
    1. GNU C 拡張機能である文式と、非 ANSI 環境への対応を混在させるな。
    2. BCMP, BCOPY, BZERO, INDEX を定義しておきながら memcmp とか使うな。
  14. 用語の不統一
    1. xxx があれば G_XXX は不要。
    2. G?_XXX と G?SET_NEWOBJ。下線つけるのかつけないのかはっきりしろ。
    3. 引数無しマクロに () が付いたり付かなかったり。ポリシー無さすぎ。
  15. 用語の重複
    1. dist: 分散 (distributed) と配布 (distribution)
  16. 不適切な表現
    1. texinfo が分からないので手が出せない documents/klicj.tex : 並列実装では、KLIC は複数プロセスを構成します。すべてのメッセージは、 unix ストリームを獲得するプロセスで処理します。例えば、`cd(Path)' メッセー ジは、単一プロセスのワーク・ディレクトリと、他に何も存在しないワーク・ディ レクトリを変更します。

KLIC-3.003 rewriting

KLIC-3.003 のソースが読むに耐えないので、俺好みに書き直すページ。

参考文献

  1. KLIC-3.003
  2. [HS] サミュエル P ハービソン / ガイ L スティール 共著, 斎藤信男 監訳, 新・詳説 C 言語 [H&Sリファレンス], ソフトバンク, 1994.
  3. [MC] STEVE McCONNELL 著, 石川勝 訳, コードコンプリート −完全なプログラミングを目指して−, アスキー出版局, 1994.
  4. 藤原博文 著, C プログラミング専門課程, 技術評論社, 1994.
  5. Peter van der Linden 著, 梅原系 訳, エキスパート C プログラミング −知られざる C の深層, アスキー出版局, 1996.
  6. [Th] デビッド・シーレン 著, 岩谷宏 訳, No Bugs! −バグは早めに追い出せ−, ビレッジセンター出版局, 1992.

目標

  1. Simple. 無駄なコードを削除する。不要な名前を捨てる
  2. Readable. 可読性
  3. Clear. 暗黙の仮定を明文化する
  4. Consistent. 一貫性
  5. Portable. 移植性, 保守性
  6. Correct. 誤りを訂正する
  7. not Compatible. 後方互換性は無視する。ANSI C 非対応環境は切り捨て
  8. not Efficient. 実行効率よりも単純さ・可読性・保守性を重視する
  9. 新しい名前を導入しない。 どうしても必要なら下線で始まる名前を付ける。 下線で始まる名前は C 言語で処理系用に予約されている

*.h

*.h の複数回展開が防止されていないので、 同一のファイルを2回以上取り込まないように注意しなければならなかった。

#ifndef _INCLUDED_H_
#define _INCLUDED_H_

$INCLUDED.h の中身

#endif /* _INCLUDED_H_ */
のように2回以上の展開を防止すれば、何も考えずに取り込むことができる [HS, 10.1]。

宣言の分散

*.h 内に static はありえない

各 *.c を C 言語におけるモジュールとみなすと、 *.h は対応するモジュールの外部インタフェイスである。 static はモジュールローカルなんだから、 *.h ではなく *.c で宣言すれば良い。

マクロ引数を()で囲む

マクロ式を()で囲む

マクロ関数の型

マクロ手続きをdo{ }while(0)で囲む

#define PROC() { .. }
だけだと、
if(..) PROC(); else ..
を展開した時に
if(..)
  { .. }
;
else ..
となり、コンパイルエラーが起きる。 これは呼び出し側(マクロ手続きのユーザ)の責任であるべきではない。
#define PROC() do{ .. }while(0)
なら、
if(..)
  do{ .. }while(0);
else ..
となり、OK [いつかの C Magazine. さらにその記事は Nifty の C 言語フォーラムによるらしい]。

名前や宣言は囲まない

assert

Const, Volatile

const, volatile の別名として使われていた。 意味が異なる用語なら別名を付けるべきだが、 Const, Volatile の意味は正に ANSI C の const, volatile である。 const, volatile を使うプログラマを不正と審判するような規約は鬼。 既存の規約と衝突するような規約は有害。 非標準環境への対応は、[HS, 4.4.1] にあるような 「予約語を再定義することが正当化されるまれなケース」に当たると思う。


Copyright 2001-2002, TAKAGI Yusuke.