diff options
Diffstat (limited to 'temper.lisp')
| -rw-r--r-- | temper.lisp | 54 |
1 files changed, 30 insertions, 24 deletions
diff --git a/temper.lisp b/temper.lisp index 2007a3b..26eb9ec 100644 --- a/temper.lisp +++ b/temper.lisp @@ -8,17 +8,24 @@ (defconstant +temper-open+ "<%") (defconstant +temper-close+ "%>") (defconstant +temper-close-len+ (length +temper-close+)) +(defconstant +temper-interpolate+ #\=) (defun lex (input) (let ((pos (search +temper-open+ input))) (if (null pos) (list (list 'string input)) - (let* ((before (subseq input 0 pos)) - (input (subseq input pos)) - (end-pos (search +temper-close+ input)) - (code (subseq input +temper-close-len+ end-pos)) - (input (subseq input (+ end-pos +temper-close-len+)))) - (append (list (list 'string before) (list 'code code)) (lex input)))))) + (let* ((before (subseq input 0 pos)) + (input (subseq input pos)) + (end-pos (search +temper-close+ input)) + (code (subseq input +temper-close-len+ end-pos)) + (input (subseq input (+ end-pos +temper-close-len+)))) + (append + (list + (list 'string before) + (if (equal (char code 0) +temper-interpolate+) + (list 'interpolation (subseq code 1)) + (list 'code code))) + (lex input)))))) (defun tokens-to-code-string (tokens) @@ -28,14 +35,22 @@ #'(lambda (token) (let ((token-type (first token)) (token-content (second token))) - (if (eql token-type 'string) - (format nil "~S" - `(setf buf (concatenate - 'string - buf - ,(string-trim '(#\linefeed #\space) token-content) - '(#\linefeed)))) - token-content))) + (cond + ((eql token-type 'code) token-content) + ((eql token-type 'interpolation) + (format nil "~S" + `(setf buf + (concatenate 'string + buf + (format nil "~A" ,(read-from-string token-content)) + '(#\linefeed))))) + ((eql token-type 'string) + (format nil "~S" + `(setf buf + (concatenate 'string + buf + ,(string-trim '(#\linefeed #\space) token-content) + '(#\linefeed)))))))) tokens))) (defun generate (tokens) @@ -48,15 +63,6 @@ ")"))))) - +; (format t "~A" (tokens-to-code-string (lex (read-all)))) (setq res (generate (lex (read-all)))) (format t "~A" (eval res)) -; (setq str (format t "~{~S~^ ~}" res)) - - - -; (princ str) - -; (print (eval (read-from-string str))) - -; (read-from-string (lex (read-all))) |
