YamaKen
yamak****@bp*****
2005年 8月 22日 (月) 11:57:39 JST
小うるさいヤマケンです。 #多数派イェー At Sun, 21 Aug 2005 14:11:33 -0700, jun.l****@gmail***** wrote: > sigscheme.h / sigschemetype.h の他に、SigScheme 内部でだけ使用する > sigschemeinternal.h を用意しましょう。主な動機は > ・一部のアクセッサはどの道 private 扱い > ・sigassert() しない CAR が欲しい > ・SigScheme 内では prefix は邪魔 > ・いくつかの関数を内部で export したい > の四点です。 いいですね。私も賛成です。 そこまで再編するのもどうかと思ってたんですが、実際に内部を触って る方が必要とおっしゃるなら問題ないですね。 > prefix については大いに異論もあることと思いますが、私の考えとしては > CAR, CDR, EQ などあからさまに Scheme 用語なマクロに prefix をつけるのは > 冗長で、for loop などの可読性を低下させると思っています。FALSEP や > NULLP など、C の用語とややこしいものは prefix がついていてもいいと思いま > すが、NIL など、用語を変えるだけで区別できるものは積極的に lisp legacy > を利用すれば良いと考えています。無論これは 100% 主観ですので、気に入らな > ければ無視してください。黙って従います。 私が一番問題だと思っていたのはEQ等がsigscheme.h経由でlibsscmのユー ザ側の名前空間を汚染する事なので、内部利用に限るなら問題ないと思 います。また、FALSEP等のpで終わるpredicate名もあからさまにlisp文 化のものなのでプリフィクス無しで大丈夫だと思います。 問題はNULL, FALSE, TRUE等のCと衝突する名前です。SCM_プリフィクス 無しの状態でCのNULLとの混同を避けるためにNILを使うというのは合理 的なので納得しました。対応するpredicateもNILPで良いでしょう。 しかし、その場合TRUEとFALSEの扱いにNILとの一貫性を持たせる事が難 しくなります。これらのプリフィクスを無くそうとしても、T, F, _T, _F, TRUE, FALSE等の衝突不可避な名前しか思い付きません。また、T, F等はpredicate名と一貫性を持たせようとするとTP, FPとなり理解不能 になります。 というわけで、TRUEとFALSEにScheme specificな良い名前が見つからな い限りプリフィクス無しのNILを採用しても混乱のデメリットの方が大 きいんじゃないかと思います。 代わりに、定数はSCM_プリフィクスを付け、predicateでは省略すると いう案を考えてみました。このメールの末尾に添付するので見てみてく ださい。この場合最も煩わしいのは以下のような表現だと思うので、こ れらを簡略化するマクロも含んでいます。 Scm_NewCons(x, SCM_NULL) (cond) ? SCM_TRUE : SCM_FALSE; 前者の操作をTAILCONSと名付けましたが、もっと適切な名前があったら 教えてください。 > 内部で使用したい関数とは、具体的に env 系と ScmOp_c_length など、生の情 > 報を Scheme オブジェクトにくるまずに返す関数です。SRFI などを C で実装す > るときにこれらは結構役に立つと思います。libtool を使わない組み込みかたも > サポートするなら、外から見えなくするのが無理かも知れませんが。 組み込み系の開発環境は非GNUな事も多いんで、なるべくポータブルに したいですね。local symbolにまでできなくても、マクロを使ってプリ フィクスを付加する程度で十分だと思います。 sigschemetype.h: #define SCM_ENTYPE_PAIR(x) (SCM_SET_TYPE((x), ScmPair)) #define SCM_PAIRP(x) (SCM_TYPE(x) == ScmPair) #define SCM_PAIR(x) (sigassert(SCM_PAIRP(x)), (x)) #define SCM_PAIR_CAR(p) (SCM_PAIR(p)->obj.pair.car) #define SCM_PAIR_CDR(p) (SCM_PAIR(p)->obj.pair.cdr) #define SCM_PAIR_SET_CAR(p, val) (SCM_CAR(p) = val) #define SCM_PAIR_SET_CDR(p, val) (SCM_CDR(p) = val) #define SCM_NULL SigScm_null #define SCM_TRUE SigScm_true #define SCM_FALSE SigScm_false #define SCM_EOF SigScm_eof #define SCM_QUOTE SigScm_quote #define SCM_QUASIQUOTE SigScm_quasiquote #define SCM_UNQUOTE SigScm_unquote #define SCM_UNQUOTE_SPLICING SigScm_unquote_splicing #define SCM_UNBOUND SigScm_unbound #define SCM_UNDEF SigScm_undef #define SCM_EQ(a, b) ((a) == (b)) #define SCM_NEQ(a, b) ((a) != (b)) #define SCM_NULLP(x) (SCM_EQ((x), SCM_NULL)) #define SCM_NNULLP(x) (SCM_NEQ((x), SCM_NULL)) #define SCM_FALSEP(x) (SCM_EQ((x), SCM_FALSE)) #define SCM_NFALSEP(x) (SCM_NEQ((x), SCM_FALSE)) #define SCM_EOFP(x) (SCM_EQ((x), SCM_EOF)) sigscheme.h: /* conventional abbreviation for basic operations */ #define SCM_CAR SCM_PAIR_CAR #define SCM_CDR SCM_PAIR_CDR #define SCM_SET_CAR SCM_PAIR_SET_CAR #define SCM_SET_CDR SCM_PAIR_SET_CDR #define SCM_CAAR(l) (SCM_CAR(SCM_CAR(l))) #define SCM_CADR(l) (SCM_CAR(SCM_CDR(l))) #define SCM_CDAR(l) (SCM_CDR(SCM_CAR(l))) #define SCM_CDDR(l) (SCM_CDR(SCM_CDR(l))) #define SCM_CONS(kar, kdr) (Scm_NewCons(kar, kdr)) #define SCM_TAILCONS(kar) (SCM_CONS(kar, SCM_NULL)) #define SCM_BOOLIZE(x) ((x) ? SCM_TRUE : SCM_FALSE) sigschemeinternal.h: #define CAR SCM_CAR #define CDR SCM_CDR #define SET_CAR SCM_SET_CAR #define SET_CDR SCM_SET_CDR #define CAAR SCM_CAAR #define CADR SCM_CADR #define CDAR SCM_CDAR #define CDDR SCM_CDDR #define CONS SCM_CONS #define TAILCONS SCM_TAILCONS /* abbrev name for SCM_BOOLIZE is intentionally not provided */ #define INTP SCM_INTP #define PAIRP SCM_PAIRP #define SYMBOLP SCM_SYMBOLP #define CHARP SCM_CHARP #define STRINGP SCM_STRINGP #define VECTORP SCM_VECTORP /* : */ #define EQ SCM_EQ #define NEQ SCM_NEQ #define NULLP SCM_NULLP #define NNULLP SCM_NNULLP #define FALSEP SCM_FALSEP #define NFALSEP SCM_NFALSEP #define EOFP SCM_EOFP /* * Abbrev name for these constants are not provided since it involves some * consistency problems and confusions. Use the canonical names always. * * SCM_NULL * SCM_TRUE * SCM_FALSE * SCM_EOF * SCM_QUOTE * SCM_QUASIQUOTE * SCM_UNQUOTE * SCM_UNQUOTE_SPLICING * SCM_UNBOUND * SCM_UNDEF */ ------------------------------- ヤマケン yamak****@bp*****