Lucas Stadler лет назад: 8
Родитель
Сommit
09b6a7bed5
2 измененных файлов с 12 добавлено и 1 удалено
  1. 1 1
      scm/inc/compiler.scm
  2. 11 0
      scm/inc/driver.c

+ 1 - 1
scm/inc/compiler.scm

@ -11,7 +11,7 @@
11 11
  (define (immediate-rep x)
12 12
    (cond
13 13
      ((integer? x) (bitwise-arithmetic-shift x fixnum-shift))
14
      ((char? x) (bitwise-xor (bitwise-arithmetic-shift (char->integer x) 8) char-shift))
14
      ((char? x) (bitwise-xor (bitwise-arithmetic-shift (char->integer x) char-shift) #b00001111))
15 15
      ((boolean? x) (bitwise-xor (bitwise-arithmetic-shift (cond
16 16
                                                             ((boolean=? x #t) 1)
17 17
                                                             ((boolean=? x #f) 0))

+ 11 - 0
scm/inc/driver.c

@ -6,6 +6,13 @@
6 6
#define fixnum_tag   0 // 00
7 7
#define fixnum_shift 2
8 8
9
#define char_mask 240  // 11110000
10
#define char_tag  15   // 00001111
11
#define char_shift 8
12
13
#define boolean_mask  96 // 1100000
14
#define boolean_shift 7
15
9 16
#define empty_list   47 // 00101111
10 17
11 18
int scheme_entry();
@ -14,6 +21,10 @@ int main(int argc, char **argv) {
14 21
	int val = scheme_entry();
15 22
	if ((val & fixnum_mask) == fixnum_tag) {
16 23
		printf("%d\n", val >> fixnum_shift);
24
	} else if ((val & char_mask) == 0) {
25
		printf("#\\%c\n", val >> char_shift);
26
	} else if ((val & boolean_mask) == 0) {
27
		printf("#%s\n", (val >> boolean_shift) == 1 ? "t" : "f");
17 28
	} else if (val == empty_list) {
18 29
		printf("()\n");
19 30
	} else {