A new beta of Gambit-C 4.0 is now available in source form at this address:
http://www.iro.umontreal.ca/~feeley/gambc40b14.tar.gz
Here's what's new:
- Binary serialization. The procedures object->u8vector and u8vector->object implement binary serialization and deserialization. The representation used is 2 to 3 times more compact than text serialization. Moreover, these procedures are implemented more efficiently, with tables, which makes binary serialization and deserialization two orders of magnitude faster than text serialization.
- Better conformance to the draft "R6RS Unicode data" SRFI. The range of the character type has been extended to #x10FFFF. Each character in a string now occupies 4 bytes of memory. The size of characters can be changed by redefining the macro ___MAX_CHR in gambit.h and recompiling the system. ___MAX_CHR can be 0xFF (1 byte per character), 0xFFFF (2 bytes per character), or 0x10FFFF (4 bytes per character). The syntax for characters, quoted strings and "here strings" proposed in the SRFI have been implemented, and the old ##x1234 syntax for characters has been removed (you should now use #\u1234 instead).
- Improvements to the Gambit compiler. A minor modification to the code generator has improved the register allocation. The inlining of arithmetic procedures (+, -, *, ...) has been improved. For example, the program
(define (triple x) (* x 3))
(define (make-multiplier x) (lambda (y) (* x y)))
is expanded to
(define triple (lambda (x) (if (and (##eq? * '#<procedure #2 *>) (##fixnum? x)) (let ((temp (##fixnum.*? x 3))) (if temp temp (* x 3))) (* x 3))))
(define make-multiplier (lambda (x) (lambda (y) (if (and (##eq? * '#<procedure #2 *>) (and (##fixnum? y) (##fixnum? x))) (if (##fixnum.= y 0) 0 (let ((temp (if (##fixnum.= y -1) (##fixnum.-? x) (##fixnum.*? x y)))) (if temp temp (* x y)))) (* x y)))))
- Testing tables for equality. Tables can be compared for equality using the equal? procedure. Two tables X and Y are considered equal by equal? when they have the same weakness attributes, the same key comparison procedure, the same hashing procedure, the same length, and for all the keys k in X, (equal? (table-ref X k) (table-ref Y k)).
- Compiled scripts now behave the same as interpreted scripts. The "main" procedure will be called automatically, the language will be set according to the first line of the script, and the value returned by the procedure "command-line" will be the list of command line arguments after the script filename. Scripts can also be compiled to an executable program.
- Process port fixes. Several problems with process ports have been fixed, in particular when pseudo-terminal: is #t. This makes it easy for a Scheme program to interact with programs that were designed to be used interactively. Here is an example:
(define p (open-process
(list path: "/sw/bin/emacs" arguments: '("-nw") pseudo-terminal: #t)))
(read-line p)
"\33[?1049h\33[?12;25h\33[?1h\33=\33[23;1H\33[?25l\33[7m----:--- F1 ..."
- Documentation checking. A script now checks that the documentation is consistent with the behavior of the system. This has helped uncover many inconsistencies. Unfortunately only a few of the inconsistencies have been fixed at this point.
Marc