新千葉 ガーベージ・コレクション

FPGA マガジンやインターフェースで書けなかったこと等をちょぼちょぼ書いてます。@ryos36

yaneu.lisp

できました。cl-ppcre つかったら一発だったりして。

(asdf:oos 'asdf:load-op 'cl-ppcre)

(defvar xoutput 'nil)
(defvar youtput 'nil)
(defvar all-output 'nil)
;(setf wq (string #\"))
;(setf wq (coerce wq 'string))
(defun |#%-reader| (stream sub-char numarg)
  (declare (ignore sub-char numarg))
  (let (chars)
    (do ((curr (read-char stream)
	       (read-char stream)))
      ((char= #\newline curr))
      (push curr chars))
    (let* ((pattern (nreverse chars))
	   (pointer pattern)
	   (start-pattern '(#\/ #\/ #\%))
	   (start-pointer start-pattern)
	   (all-output)
	   (output)
	   (flag)
	   (tmp-oneline)
	   (tmp-str))
      (do ((curr (read-char stream)
		 (read-char stream)))
	((null pointer))

	(push curr all-output)
	(if (char= #\' curr) (setf curr #\") nil)

	(if (char= #\newline curr)
	  (let ((oneline (coerce (nreverse tmp-oneline) 'string))
		sym)
	    (setf tmp-oneline 'nil)
	    (if (null start-pointer)
	      (progn
		(if tmp-str 
		  (push (string-concat " \"" tmp-str "\"") output))
		(setf tmp-str nil)
		;(push (string-concat "(write-comment \"" oneline "\")") output)
		(push (substring oneline 3) output))
	      (setf tmp-str (string-concat (if tmp-str tmp-str "") 
					   oneline 
					   (string #\newline))))
	    (setf start-pointer start-pattern))
	  (push curr tmp-oneline))

	(setf start-pointer
	      (cond ((null start-pointer) 'nil)
		    ((char= (car start-pointer) curr) (cdr start-pointer))
		    (t start-pattern)))

	(setf pointer
	      (if (char= (car pointer) curr)
		(cdr pointer)
		pattern))
	(if (null pointer)
	  (return)))
      ;-- end do
      (string-concat
	(string-concat
	  "(write-comment \""
	   (coerce (nreverse all-output) 'string)
	   "\")")
	(reduce #'string-concat (nreverse output)))
      )))

(set-dispatch-macro-character
  #\# #\% #'|#%-reader|)

(setf xoutput
#%//% END
//% (write
inline int x_A(x,y) { return x + y; }
inline int x_B(x,y) { return x + y*2; }
inline int x_C(x,y) { return x*2 + y; }

inline int y_A(x,y) { return x + y; }
inline int y_B(x,y) { return x + y*4; }
inline int y_C(x,y) { return x*4 + y; }
//% )
//% (let list 'x_A' 'x_B' 'x_C')
//% (let list2 'y_A' 'y_B' 'y_C')
//% (foreach e2 list2
//% (foreach e list ( write
//% (replace (replace
void function_XXX_YYY()
{
  for(int y = 0; y<10; ++y)
    for(int x = 0; x<10; ++x)
    {
      FUNC_XXX(x,y) * FUNC_YYY(x,y);
    }
}
//% 'XXX' e)
//% 'YYY' e2)
//% )))
//% END
)

(defun my-replace (str org_str rep_str) 
  (cl-ppcre:regex-replace-all org_str str rep_str))

(setf youtput (string-concat "(" xoutput ")"))
(setf yanae
      (with-input-from-string (s youtput)
	(read s)))


(defmacro my-let (var &rest rest)
  `(setf ,var (list ,@rest)))

(defun my-write (str)
  (princ str))

;(defun my-replace (str key word)
(defmacro old-my-foreach (iter ln &rest body)
  `(loop for ,iter in ,ln do ,@body))

(defmacro my-x (iter ln body)
  `(list ,iter ,ln ,body))

;(my-foreach e2 '("abc" "def")

(defmacro my-foreach (iter ln &rest body)
  `(loop for ,iter in ,ln do ,@body))

(defun my-replace-list (str o_str ln)
  (mapcar (lambda (v-str) (my-replace str o_str v-str)) 
	  ln))

(defun xj ()
  (my-foreach e2 '("abc" "def")
	      (my-foreach e '("xyz" "qrs")
			  (my-write
			    (list
			      (my-replace 
				(my-replace "ooAAAoo ooXXXoo" "AAA" e)
				"XXX" e2))))))

(defun my-convert-one(sym)
  (cond ((not (symbolp sym)) sym)
	((eq sym 'write) 'my-write)
	((eq sym 'foreach) 'my-foreach)
	((eq sym 'replace) 'my-replace)
	((eq sym 'let) 'my-let)
	(t sym)))

(defun write-comment (str)
  (princ str))

(defun my-convert (ln)
  (if (atom ln) ln
    (let ((it (car ln)))
      (cons (my-convert-one it)
	    (mapcar #'my-convert (cdr ln))))))

(setf new-yanase (mapcar #'my-convert yanae))

(defun eval-yanae (ln)
  (progn
    (mapcar (lambda (x)
	      (eval x))
	    ln)
    nil))

(defun ev () (eval-yanae new-yanase))
(with-open-stream (*standard-output* (open "output.cs" :direction :output))
	(ev))