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 です。佳境に突入。