From f12a8076d00d14b35cf4de0f0649a3cd1e9e0246 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Renaud=20Casenave-P=C3=A9r=C3=A9?= Date: Wed, 25 Mar 2015 17:37:27 +0100 Subject: [PATCH] Add a simple handler for `let' --- src/render/shader/glsl.lisp | 17 ++++++++++++++++- src/render/shader/walker.lisp | 5 +++-- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/src/render/shader/glsl.lisp b/src/render/shader/glsl.lisp index a2b28e5..6dd754e 100644 --- a/src/render/shader/glsl.lisp +++ b/src/render/shader/glsl.lisp @@ -21,9 +21,24 @@ (defvar *current-indent* 0 "Keep the number of space needed for the next directive.") +(defvar *env* nil + "A special variable used as a container for the macro environment.") + (defhandler newshader (newshader lambda-list &rest body) (walk-list body)) +(defhandler let (let bindings &rest body) + (let* ((names (loop for binding in bindings + collect (safe-first binding))) + (symbol-macrolet-names (loop for name in names + when (nth-value 1 (macroexpand-1 name *env*)) + collect name))) + (apply #'concatenate 'string + (append (loop for binding in bindings + collect (format nil "~(~a ~a~)~@[ = ~a~];~%" (second binding) (first binding) + (walk-list (cddr binding)))) + (walk-list body))))) + (defun default-handler (first &rest rest) "Handle a simple function call." (format nil "~@[~vt~]~(~a~) (~{~a~^, ~});~%" @@ -35,4 +50,4 @@ (defun glsl-compile (form) (let ((*current-indent* 0)) - (walk form *form-handlers* #'default-handler))) + (walk form *form-handlers* #'default-handler *env*))) diff --git a/src/render/shader/walker.lisp b/src/render/shader/walker.lisp index 2cfb874..143b073 100644 --- a/src/render/shader/walker.lisp +++ b/src/render/shader/walker.lisp @@ -83,8 +83,9 @@ collect `(gethash ',sym ,(intern (symbol-name '*form-handlers*))) collect `',func)))))) -(defun walk (form handlers default-handler) +(defun walk (form handlers default-handler env) "Walk the sexp FORM and transform it according to the rules defined in HANDLERS." (let ((*form-handlers* handlers) - (*default-handler* default-handler)) + (*default-handler* default-handler) + (*env* env)) (walk-1 form)))