;; -*- Mode: Irken -*-
(define (string->uninterned-symbol str)
(symbol:t str))
(define symbol->string
(symbol:t str) -> str
)
(define the-symbol-table (tree:empty))
(define (intern-symbol sym)
(set! the-symbol-table
(tree/insert the-symbol-table
string<?
(symbol->string sym)
sym))
sym
)
(define (string->symbol str)
(let ((probe (tree/member the-symbol-table string<? str)))
(match probe with
(maybe:no) -> (intern-symbol (string->uninterned-symbol str))
(maybe:yes sym) -> sym
)))
(define (symbol<? s1 s2)
(string<? (symbol->string s1) (symbol->string s2)))
(define (initialize-symbol-table)
(let ((v (%%cexp (vector symbol) "(object *) pxll_internal_symbols")))
(let loop ((i 0))
(if (= i (vector-length v))
#u
(begin
(intern-symbol v[i])
(loop (+ i 1)))))))
(initialize-symbol-table)