diff options
| author | Charles Cabergs <me@cacharle.xyz> | 2021-01-08 03:32:07 +0100 |
|---|---|---|
| committer | Charles Cabergs <me@cacharle.xyz> | 2021-01-08 03:32:07 +0100 |
| commit | d85e44552a1d59ad2f8a5539d8e7c0a42a3c56b8 (patch) | |
| tree | fd5d621b65b0c1cce55cb53bb8f8a649233dd5fb /temper.lisp | |
| parent | cf57d609d10fa2ea9f690bcca6896b5926340e12 (diff) | |
| download | temper-d85e44552a1d59ad2f8a5539d8e7c0a42a3c56b8.tar.gz temper-d85e44552a1d59ad2f8a5539d8e7c0a42a3c56b8.tar.bz2 temper-d85e44552a1d59ad2f8a5539d8e7c0a42a3c56b8.zip | |
Changing to ejs method (imperative)
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))) |
