YamaKen
yamak****@bp*****
2006年 4月 27日 (木) 18:41:39 JST
ヤマケンです。 まだこの話続けんのかよ!と言われそうですが。 At Sat, 07 Jan 2006 13:43:22 -0800, jun.l****@gmail***** wrote: > > YamaKen <yamak****@bp*****> writes: > > > ・HOGEP()スタイル > > > > - SCM_ATRUEP, ATRUEP (a true valueの意。以前スルーされたけど) > > - SCM_TRUESP, TRUESP (trueの複数形。上と同義だが'true'が識別しやすい) > > - SCM_TRUEVP, TRUEVP (true value. 'V'が目立つので'true'が識別しやすい) > > - SCM_TRUEP, TRUEP (#tではない事を意識に叩き込んで使う) > > > > ・TEST()スタイル > > > > - SCM_BOOL, BOOL (boolean expression. 型名っぽいのが難) > > - SCM_B, B (BOOLの短縮形) > > - SCM_COND, COND (condition. syntaxのcondと紛らわしいけど) > > - SCM_C, C (CONDの短縮形) > > やっぱあんまり乗り気になれません。!FALSEP() と↑の提案とでわかりにくさ > に大した差が出ると思えません。むしろ他の Scheme 処理系 (Gauche, Guile, > etc) との不整合で読む側の負担が増えそう。 > > あえて名付けるなら SCM_IF() にしますが、これはこれで嬉しくないし。 > > SCM_IF(scm_p_memq(...)) or if (SCM_IF(scm_p_memq(...))) > > 結局 FOO() で書くことにしたとして、読む側が FOO() の意味は何? と問うよ > うなものならば結局 !FALSEP() だよ、となるわけで、!FALSEP に慣れるか > FOO に慣れるかでは違いは無いでしょう。 > > そんなわけで相変わらず反対。 懲りずに別案ですが、SCM_TRUTH()はどうでしょう。 if (TRUTH(scm_p_memq(key, lst))) if (!TRUTH(scm_p_zerop(n))) 個人的にはこれならムリヤリ感も無く受け入れ可能と感じます。 ついでに、他の処理系の事情も手元にあった分で適当に調べてみました。 結構バラバラで結局は処理系毎に意識を変える必要があるんで、 SigSchemeの事だけ考えて決めてしまって良いと思います。 TEST()スタイル: Bigloo FALSEP(), TRUEP()スタイル: Guile, MzScheme, QScheme, TinyScheme, (Bigloo) FALSEP(), !FALSEP()スタイル: Gauche, Scheme48, SCM, MIT, Gambit-C Bigloo 2.6f: #define TRUEP( c ) ((bool_t)(c != BFALSE)) # define CBOOL( o ) (o != BFALSE) switch( CBOOL( bfork ) && (pid = fork()) ) { Guile 1.8.0: #define scm_is_false(x) scm_is_eq ((x), SCM_BOOL_F) #define scm_is_true(x) !scm_is_false (x) /* Discouraged because they do not follow the naming convention. That is, they end in "P" but return a C boolean. Also, SCM_BOOLP evaluates its argument twice. */ #define SCM_FALSEP scm_is_false #define SCM_NFALSEP scm_is_true if (scm_is_true (scm_eqv_p (SCM_CAR (tmp), key))) if (! scm_is_false (scm_eqv_p (SCM_CAR (lst), x))) if (scm_is_false (scm_equal_p (SCM_CAR (x), SCM_CAR (y)))) MzScheme v209: #define SCHEME_FALSEP(obj) SAME_OBJ((obj), scheme_false) #define SCHEME_TRUEP(obj) (!SCHEME_FALSEP(obj)) int for_exp = (SCHEME_TRUEP(SCHEME_CADR(data)) ? 1 : 0); if (SCHEME_FALSEP(scheme_positive_p(1, &e))) { QScheme 0.5.1: #define SCM_FALSEP(x) ((x) == scm_false) #define SCM_TRUEP(x) ((x) != scm_false) if (scm_equal(SCM_AREF(a1,i), SCM_AREF(a2,i)) == scm_false) if (scm_eqv(SCM_CAR(l), n) != scm_false) { TinyScheme 1.35: #define is_true(p) ((p) != sc->F) #define is_false(p) ((p) == sc->F) if (is_true(sc->value)) if (is_false(sc->value)) { Gauche 0.8.7: #define SCM_FALSEP(obj) ((obj) == SCM_FALSE) #define SCM_TRUEP(obj) ((obj) == SCM_TRUE) #define SCM_BOOL_VALUE(obj) (!SCM_FALSEP(obj)) if (SCM_FALSEP(Scm_Memq(SCM_OBJ(cs), ctx->sets))) { if (!SCM_FALSEP(Scm_Memq(h, SCM_CDR(*tp)))) { Scheme48 1.2: #define S48_TRUE_P(v) ((v) == S48_TRUE) #define S48_FALSE_P(v) ((v) == S48_FALSE) #define S48_EXTRACT_BOOLEAN(v) ((v) != S48_FALSE) SCM 5d9: #define FALSEP(x) (BOOL_F==(x)) #define NFALSEP(x) (BOOL_F != (x)) if NFALSEP(eqv(CAR(lst), x)) return lst; if FALSEP(eqp(RVREF(ra1, i1, e1), RVREF(ra2, i2, e2))) MIT/GNU Scheme 7.7.90: #define OBJECT_TO_BOOLEAN(object) ((object) != SHARP_F) if ((FAST_PAIR_CAR (weak_pair)) != SHARP_F) if (symbol == SHARP_F) Gambit-C 4.0 beta12: #define ___FALSEP(x)((x)==___FAL) ___IF(___NOT(___FALSEP(___R1))) ___IF(___FALSEP(___R2)) ------------------------------- ヤマケン yamak****@bp*****