diff options
Diffstat (limited to 'temper.lisp')
| -rw-r--r-- | temper.lisp | 46 |
1 files changed, 32 insertions, 14 deletions
diff --git a/temper.lisp b/temper.lisp index 5ff5008..6893071 100644 --- a/temper.lisp +++ b/temper.lisp @@ -5,26 +5,44 @@ ""))) -(setq *temper-open* "{%") -(setq *temper-close* "%}") +(defconstant +temper-open+ "<%") +(defconstant +temper-close+ "%>") +(defconstant +temper-close-len+ (length +temper-close+)) -(defun parse (input) - (let ((pos (search *temper-open* input))) +(defun lex (input) + (let ((pos (search +temper-open+ input))) (if (null pos) - (list "\"" input "\"") + (list (list 'string input)) (let* ((before (subseq input 0 pos)) (input (subseq input pos)) - (end-pos (search *temper-close* input)) - (close-len (length *temper-close*)) - (code (subseq input close-len end-pos)) - (input (subseq input (+ end-pos close-len)))) - (append (list "\"" before "\"" code) (parse input)))))) + (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)))))) +(defun generate (tokens) + `(progn + (setq buf "") + (eval ,(read-from-string + (concatenate 'string + (map + 'string + #'(lambda (token) + (let ((token-type (first token)) + (token-content (second token))) + (if (eql token-type 'string) + (format nil "~A" + `(setf buf (concatenate 'string buf ,token-content))) + token-content))) + tokens)))))) + + +(setq res (generate (lex (read-all)))) +(setq str (format t "~{~A~^ ~}" res)) + +; (princ str) -(setq res (append '("(concatenate 'string ") (parse (read-all)) '(" ) ") )) -(setq str (format nil "~{~A~^ ~}" res)) -(princ str) ; (print (eval (read-from-string str))) -; (read-from-string (parse (read-all))) +; (read-from-string (lex (read-all))) |
