SICP 読み (382) 5.5 翻訳系
問題 5.51
ええと、とりあえず CLASS はヘッダと名前だけ持っとくだけにします。NUMBER についても bignum なソレはスルーしたい。あと GLOC ってヤツもスルー予定。あと、BoehmGC 使う方向で検討中ッス (何
てーコトで
Boehm GC 入れてみる。でびあんパケジは以下な模様
$ apt-cache search boehm ecl - Embeddable Common-Lisp: has an interpreter and can compile to C libgc-dev - conservative garbage collector for C (development) libgc1c2 - conservative garbage collector for C and C++ $
入れてみます。
# apt-get install -fy libgc-dev libgc1c2
libgc1c2 はスデに install 済みだった模様。これで gc.h が /usr/include 配下にできる、のかな??
$ dpkg -L libgc-dev /. /usr /usr/share /usr/share/doc /usr/share/doc/libgc1c2 /usr/share/doc/libgc1c2/debugging.html /usr/share/doc/libgc1c2/gcdescr.html /usr/share/doc/libgc1c2/gcinterface.html /usr/share/doc/libgc1c2/leak.html /usr/share/doc/libgc1c2/scale.html /usr/share/doc/libgc1c2/simple_example.html /usr/share/doc/libgc1c2/tree.html /usr/share/doc/libgc1c2/README.contributors /usr/share/doc/libgc1c2/README.cords /usr/share/doc/libgc1c2/barrett_diagram.gz /usr/share/doc/libgc1c2/README.gz /usr/share/doc/libgc1c2/README.linux.gz /usr/share/man /usr/share/man/man3 /usr/share/man/man3/gc.3.gz /usr/include /usr/include/gc /usr/include/gc/gc.h /usr/include/gc/gc_typed.h /usr/include/gc/gc_inl.h /usr/include/gc/gc_inline.h /usr/include/gc/gc_mark.h /usr/include/gc/gc_cpp.h /usr/include/gc/weakpointer.h /usr/include/gc/gc_alloc.h /usr/include/gc/new_gc_alloc.h /usr/include/gc/gc_allocator.h /usr/include/gc/gc_backptr.h /usr/include/gc/gc_gcj.h /usr/include/gc/gc_local_alloc.h /usr/include/gc/leak_detector.h /usr/include/gc/gc_amiga_redirects.h /usr/include/gc/gc_pthread_redirects.h /usr/include/gc/gc_config_macros.h /usr/lib /usr/lib/libgc.a /usr/lib/libgccpp.a /usr/lib/libgc.la /usr/lib/libgccpp.la /usr/share/doc/libgc-dev /usr/lib/libgc.so /usr/lib/libgccpp.so $
GC_MALLOC も GC_ALLOC_ATOMIC も GC_REALLOC もあります。凄くコスいなぁ、と。
CHARACTERS
試験は以下
#include <CUnit/CUnit.h> #include "gauche.h" void test_gauche_SCM_CHARP(void) { CU_ASSERT_FALSE(SCM_CHARP(0)); /* 0000 */ CU_ASSERT_FALSE(SCM_CHARP(1)); /* 0001 */ CU_ASSERT_TRUE(SCM_CHARP(2)); /* 0010 */ CU_ASSERT_FALSE(SCM_CHARP(3)); /* 0011 */ CU_ASSERT_FALSE(SCM_CHARP(4)); /* 0100 */ CU_ASSERT_FALSE(SCM_CHARP(5)); /* 0101 */ CU_ASSERT_FALSE(SCM_CHARP(6)); /* 0110 */ CU_ASSERT_FALSE(SCM_CHARP(7)); /* 0111 */ CU_ASSERT_FALSE(SCM_CHARP(8)); /* 1000 */ CU_ASSERT_FALSE(SCM_CHARP(9)); /* 1001 */ CU_ASSERT_TRUE(SCM_CHARP(10)); /* 1010 */ CU_ASSERT_FALSE(SCM_CHARP(11)); /* 1011 */ } void test_gauche_SCM_CHAR_VALUE(void) { CU_ASSERT_EQUAL(0, SCM_CHAR_VALUE(0)); /* 0000 */ CU_ASSERT_EQUAL(0, SCM_CHAR_VALUE(7)); /* 0111 */ CU_ASSERT_EQUAL(1, SCM_CHAR_VALUE(8)); /* 1000 */ CU_ASSERT_EQUAL(1, SCM_CHAR_VALUE(9)); /* 1001 */ CU_ASSERT_EQUAL(2, SCM_CHAR_VALUE(16)); /* 10000 */ } void test_gauche_SCM_MAKE_CHAR(void) { CU_ASSERT_EQUAL(SCM_OBJ(2), SCM_MAKE_CHAR(0)); /* 0000 -> 0010 */ CU_ASSERT_EQUAL(SCM_OBJ(10), SCM_MAKE_CHAR(1)); /* 0001 -> 1010 */ CU_ASSERT_EQUAL(SCM_OBJ(18), SCM_MAKE_CHAR(2)); /* 0010 -> 10010 */ } void test_gauche_SCM_CHAR_ASCII_P(void) { CU_ASSERT_TRUE(SCM_CHAR_ASCII_P(127)); /* 0x7F */ CU_ASSERT_FALSE(SCM_CHAR_ASCII_P(128)); /* 0x80 */ } void test_gauche_SCM_CHAR_UPPER_P(void) { CU_ASSERT_FALSE(SCM_CHAR_UPPER_P(64)); /* 0x40 */ CU_ASSERT_TRUE(SCM_CHAR_UPPER_P(65)); /* 0x41 */ CU_ASSERT_TRUE(SCM_CHAR_UPPER_P(90)); /* 0x5A */ CU_ASSERT_FALSE(SCM_CHAR_UPPER_P(91)); /* 0x5B */ } void test_gauche_SCM_CHAR_LOWER_P(void) { CU_ASSERT_FALSE(SCM_CHAR_LOWER_P(96)); /* 0x60 */ CU_ASSERT_TRUE(SCM_CHAR_LOWER_P(97)); /* 0x61 */ CU_ASSERT_TRUE(SCM_CHAR_LOWER_P(122)); /* 0x7A */ CU_ASSERT_FALSE(SCM_CHAR_LOWER_P(123)); /* 0x7B */ } void test_gauche_SCM_CHAR_UPCASE(void) { CU_ASSERT_EQUAL('A', SCM_CHAR_UPCASE('a')); CU_ASSERT_EQUAL('A', SCM_CHAR_UPCASE('A')); } void test_gauche_SCM_CHAR_DOWNCASE(void) { CU_ASSERT_EQUAL('a', SCM_CHAR_DOWNCASE('a')); CU_ASSERT_EQUAL('a', SCM_CHAR_DOWNCASE('A')); }
だんだん main.c とかウザくなってきつつあるんですが、C だと配列にしたらしたで面倒見るのが微妙だし (配列要素数とか云々)。
次は HEAP ALLOCATED OBJECTS です。佳境に突入。