(in-package :monkey) (defun make-tokens (&rest tokens) (loop :for token :in tokens :if (consp token) :collect (make-token (car token) (cadr token)) :if (numberp token) :collect (as-token token))) (defun test-lexer (str expect) (let ((lexer (make-lexer str))) (not (find nil (mapcar #'token= (lexer-tokens lexer) expect))))) (defun test-1 () (test-lexer "=+(){},;" (make-tokens token-= token-+ token-lparen token-rparen token-lbrace token-rbrace token-comma token-semicolon token-eof))) (defun test-2 () (test-lexer "let five = 5; let ten = 10; let add = fn(x, y) { x + y; }; let result = add(five, ten); !-/*; 5 < 10 > 5; if (5 < 10) { return true; } else { return false; } 10 == 10; 10 != 9; " (make-tokens token-let (list token-ident "five") token-= (list token-int "5") token-semicolon token-let (list token-ident "ten") token-= (list token-int "10") token-semicolon token-let (list token-ident "add") token-= token-function token-lparen (list token-ident "x") token-comma (list token-ident "y") token-rparen token-lbrace (list token-ident "x") token-+ (list token-ident "y") token-rbrace token-semicolon token-let (list token-ident "result") token-= (list token-ident "add") token-lparen (list token-ident "five") token-comma (list token-ident "ten") token-rparen token-semicolon token-! token-- token-/ token-* token-semicolon (list token-int "5") token-< (list token-int "10") token-> (list token-int "5") token-semicolon (list token-if "if") token-lparen (list token-int "5") token-< (list token-int "10") token-rparen token-lbrace token-return token-true token-semicolon token-rbrace token-else token-lbrace token-return token-false token-semicolon token-rbrace (list token-int "10") token-== (list token-int "10") token-semicolon (list token-int "10") token-!= (list token-int "9") token-semicolon token-eof "")))