[Anthy-dev 2253] Re: r5rs: SigSchemeへの要望

Back to archive index

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*****



Anthy-dev メーリングリストの案内
Back to archive index