;Load the common functions
(load "common.scm")
;Wrapped token format
;((unlexed newlinenumber) (tokentype, tokencontents, linenumber))
;Token format
;(tokentype, tokencontents, linenumber)
;Some aliases for laziness
(define s->l string->list)
(define l->s list->string)
;I probably won't use these - but i do think they're good names
;(define tail cdr)
;(define head car)
;Tails and converts a list to a string
(define (tail-l->s lst)
(l->s (cdr lst)))
;Checks if a character is in printable range
(define (printable? ch)
(and (> ch 32) (not (= ch 127))))
;Makes a token
(define (make-token tokentype token linenum)
(list tokentype token linenum))
;Wraps a token up with extra info
(define (wrap-token unlexed newlinenum token)
(list (list (tail-l->s unlexed) newlinenum) token))
;Unwraps a token
(define (unwrap-token wrapped-token)
(cdr wrapped-token))
;Returns the wrapper of a wrapped token
(define (wrapper wrapped-token)
(car wrapped-token))
;Wraps a list token and returns
(define (return-list ch unlexed line)
(wrap-token unlexed line (make-token ch ch line)))
;Gets the next token
(define (next-token unlexed line)
(let temp ((lst (s->l unlexed))
(ch (car lst)))
(cond
;listy stuff
((in? ch "[]()")
(return-list ch unlexed-list linenumber)))))
;Returns a list of all tokens
(define (collect-tokens tolex)
(let collect ((tokens '())
(unlexed tolex)
(linenumber 0))
(if (null? unlexed)
tokens
(let temp ((wrappedtoken (next-token unlexed linenumber))
(wrap (wrapper wrappedtoken)))
(collect (append tokens (unwrap-token wrappedtoken))
(car wrap)
(cadr wrap))))))