Scheme 手習い 2 章

エントリ投入の報せが tweet された。

コメント列挙するまえに

not という特殊形式について確認。
基本的には #f が渡された場合のみ #t を戻す、という理解で良いのかどうか。

gosh> (not '())
#f
gosh> (not #f)
#t
gosh> (not #t)
#f
gosh> (not 1)
#f
gosh> 

中身てきには定義は以下、って事で良いのかどうか (src/vm.c より引用)。ちなみに見てるバージョンは 0.8.11 だったりしてます。

            CASE(SCM_VM_NOT) {
                VAL0 = SCM_MAKE_BOOL(SCM_FALSEP(VAL0));
                NEXT1;
            }

あるいは gauche.h における定義が以下。

#define SCM_FALSEP(obj)     ((obj) == SCM_FALSE)
#define SCM_TRUEP(obj)      ((obj) == SCM_TRUE)
#define SCM_NULLP(obj)      ((obj) == SCM_NIL)
#define SCM_EOFP(obj)       ((obj) == SCM_EOF)
#define SCM_UNDEFINEDP(obj) ((obj) == SCM_UNDEFINED)
#define SCM_UNBOUNDP(obj)   ((obj) == SCM_UNBOUND)

/*
 * BOOLEAN
 */
#define SCM_BOOLP(obj)       ((obj) == SCM_TRUE || (obj) == SCM_FALSE)
#define SCM_BOOL_VALUE(obj)  (!SCM_FALSEP(obj))
#define	SCM_MAKE_BOOL(obj)   ((obj)? SCM_TRUE:SCM_FALSE)

うむ。#f だったら #t を戻してそれ以外なら #t を戻してます。

エントリについて

  • lat? の定義の方法が趣味の問題に見えますのでどちらでも良いはず
  • member? のソレはナイスでした
    • そもそも述語が '() とか戻しちゃ駄目でしょ的ソレ
  • 再起の確認は trace 使えば分かりやすいです
    • 慣れたらやらなくなるはず (を
    • branch 云々も自分マターで構いません
    • git で色々ヤるのも良いと思います
  • 関数定義についても色々試してみれば良いと思います。
    • 章ごとで分けちゃうとか
    • 末端に追加するんじゃなくて先頭に追加するとか

それにしても

とりあえず手元にテキストが無いんだけど、どうやって進めたものやら。