sans.c 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <assert.h>
  4. #include <string.h>
  5. #include <errno.h>
  6. #include "sans.h"
  7. #include "symboltable.h"
  8. #include "stack.h"
  9. #include "garbagecollector.h"
  10. #include "runtime.h"
  11. void test_stack_fold() {
  12. puts("# testing stack fold:");
  13. stack_push(SDSYMB("a"));
  14. stack_push(SDSYMB("b"));
  15. stack_push(SDSYMB("c"));
  16. stack_push(SDSYMB("d"));
  17. stack_push(SDSYMB("e"));
  18. stack_push(SDSYMB("f"));
  19. bltn_display(stack_ref(5));
  20. bltn_display(stack_ref(4));
  21. bltn_display(stack_ref(3));
  22. bltn_display(stack_ref(2));
  23. bltn_display(stack_ref(1));
  24. bltn_display(stack_ref(0));
  25. puts("");
  26. stack_fold(2, 3);
  27. bltn_display(stack_ref(2));
  28. bltn_display(stack_ref(1));
  29. bltn_display(stack_ref(0));
  30. puts("");
  31. puts("");
  32. puts("");
  33. }
  34. void test_symbol_table() {
  35. u foo, bar, baz, bar2;
  36. puts("# testing symbol table:");
  37. foo = intern("foo");
  38. bar = intern("bar");
  39. baz = intern("baz");
  40. bar2 = intern("bar");
  41. printf("foo: %s\n", lookup(foo));
  42. printf("bar: %s\n", lookup(bar));
  43. printf("baz: %s\n", lookup(baz));
  44. printf("bar = bar2: %s\n", bar == bar2 ? "yes" : "NO!");
  45. puts("");
  46. puts("");
  47. }
  48. void test_stack() {
  49. sdata n;
  50. puts("# testing stack:");
  51. stack_push((sdata){.tag = tnumb, .data.ivalue = 3});
  52. stack_push((sdata){.tag = tnumb, .data.ivalue = 2});
  53. stack_push((sdata){.tag = tnumb, .data.ivalue = 1});
  54. n = stack_pop();
  55. assert(n.tag == tnumb);
  56. printf("%ld\n", n.data.ivalue);
  57. n = stack_pop();
  58. assert(n.tag == tnumb);
  59. printf("%ld\n", n.data.ivalue);
  60. n = stack_pop();
  61. assert(n.tag == tnumb);
  62. printf("%ld\n", n.data.ivalue);
  63. puts("");
  64. puts("");
  65. }
  66. void test_cons() {
  67. sdata c, n;
  68. puts("# testing cons:");
  69. c = cons((sdata){.tag = tnumb, .data.ivalue = 11},
  70. (sdata){.tag = tnumb, .data.ivalue = 22});
  71. c = cons(c,
  72. (sdata){.tag = tnumb, .data.ivalue = 33});
  73. n = bltn_car(bltn_car(c));
  74. assert(n.tag == tnumb);
  75. printf("%ld\n", n.data.ivalue);
  76. n = bltn_cdr(bltn_car(c));
  77. assert(n.tag == tnumb);
  78. printf("%ld\n", n.data.ivalue);
  79. n = bltn_cdr(c);
  80. assert(n.tag == tnumb);
  81. printf("%ld\n", n.data.ivalue);
  82. puts("");
  83. puts("");
  84. }
  85. void test_cons2() {
  86. sdata c, n;
  87. puts("# testing cons 2:");
  88. c = cons((sdata){.tag = tnumb, .data.ivalue = 11},
  89. (sdata){.tag = tnumb, .data.ivalue = 22});
  90. bltn_set_car(c, (sdata){.tag = tnumb, .data.ivalue = 44});
  91. bltn_set_cdr(c, c);
  92. n = bltn_car(c);
  93. assert(n.tag == tnumb);
  94. printf("%ld\n", n.data.ivalue);
  95. n = bltn_car(bltn_cdr(c));
  96. assert(n.tag == tnumb);
  97. printf("%ld\n", n.data.ivalue);
  98. puts("");
  99. puts("");
  100. }
  101. void test_vector() {
  102. sdata v, n;
  103. puts("# testing vector:");
  104. v = allocate_vector(3);
  105. bltn_vector_set_bang(v, SDNUMB(0), SDNUMB(101));
  106. bltn_vector_set_bang(v, SDNUMB(1), SDNUMB(102));
  107. bltn_vector_set_bang(v, SDNUMB(2), SDNUMB(103));
  108. n = bltn_vector_ref(v, SDNUMB(0));
  109. assert(n.tag == tnumb);
  110. printf("%ld\n", n.data.ivalue);
  111. n = bltn_vector_ref(v, SDNUMB(1));
  112. assert(n.tag == tnumb);
  113. printf("%ld\n", n.data.ivalue);
  114. n = bltn_vector_ref(v, SDNUMB(2));
  115. assert(n.tag == tnumb);
  116. printf("%ld\n", n.data.ivalue);
  117. puts("");
  118. puts("");
  119. }
  120. void test_eq() {
  121. sdata b;
  122. puts("# testing eq:");
  123. b = bltn_eq_question(SDBOOL(0), SDBOOL(1));
  124. assert(b.tag == tbool);
  125. printf("0 %ld\n", b.data.value);
  126. b = bltn_eq_question(SDBOOL(0), SDBOOL(0));
  127. assert(b.tag == tbool);
  128. printf("1 %ld\n", b.data.value);
  129. b = bltn_eq_question(SDBOOL(1), SDBOOL(1));
  130. assert(b.tag == tbool);
  131. printf("1 %ld\n", b.data.value);
  132. b = bltn_eq_question(SDBOOL(0), SDNUMB(1));
  133. assert(b.tag == tbool);
  134. printf("0 %ld\n", b.data.value);
  135. b = bltn_eq_question(SDBOOL(1), SDNUMB(1));
  136. assert(b.tag == tbool);
  137. printf("0 %ld\n", b.data.value);
  138. b = bltn_eq_question(SDNUMB(5), SDNUMB(5));
  139. assert(b.tag == tbool);
  140. printf("1 %ld\n", b.data.value);
  141. b = bltn_eq_question(SDNUMB(5), SDNUMB(8));
  142. assert(b.tag == tbool);
  143. printf("0 %ld\n", b.data.value);
  144. puts("");
  145. puts("");
  146. }
  147. void test_dispatch() {
  148. u label;
  149. sdata n;
  150. puts("# testing dispatch:");
  151. label = 0;
  152. while (1) {
  153. switch (label) {
  154. case 0:
  155. stack_push((sdata){.tag = tlabl, .data.ivalue = 1});
  156. label = 2;
  157. break;
  158. case 1:
  159. n = stack_pop();
  160. assert(n.tag == tnumb);
  161. label = n.data.value;
  162. printf("%ld\n", n.data.value);
  163. puts("");
  164. puts("");
  165. return;
  166. break;
  167. case 2:
  168. n = stack_pop();
  169. assert(n.tag == tlabl);
  170. label = n.data.value;
  171. stack_push((sdata){.tag = tnumb, .data.ivalue = 7});
  172. break;
  173. }
  174. }
  175. }
  176. int main(void) {
  177. printf("word size: %lu bits.\n", sizeof(u)*8);
  178. puts("");
  179. test_symbol_table();
  180. test_stack();
  181. test_cons();
  182. test_cons2();
  183. test_vector();
  184. test_eq();
  185. test_dispatch();
  186. test_stack_fold();
  187. return 0;
  188. }