(define-library (csc linker) (export link remove-labels make-label-map translate-labels) (import (scheme base) (only (csc encoding) encode) (only (csc format) sprintf) (only (csc hash-map) hash-bytevector insert lookup make-map) (only (csc list) enumerate filter) (only (csc match) match)) (begin ; A CSC bytecode program is a list of opcodes. An opcode is a symbol, or a 2 ; item list of a symbol and an argument. The full list of opcodes can be ; found in encoding.csc. (define (translate-labels program label-map) (map (lambda (x) (match x ((i . ((! 'if) label)) ; Compute offset from the current position. Subtract 1 ; because the instruction pointer is incremented each ; time already. (list 'if (- (lookup label-map label) i 1))) ((_ . ((! 'call) label)) (list 'call (lookup label-map label))) ((_ . opcode) opcode))) (enumerate program))) (lambda (i . opcode) (match opcode (((! 'if) label) #t) (_ #f))) (define (hash-string s) (hash-bytevector (string->utf8 s))) (define (cmp-strings s1 s2) (cond ((string=? s1 s2) 0) ((string