2008/6/13 Sebastian Tennant <[EMAIL PROTECTED]>: > Neil Jerram <[EMAIL PROTECTED]> writes: >> As a further option, please see attached [template.scm]. If you're >> interested in this, please let me know, because I may have a more up >> to date version somewhere. > > I'd be interested in getting hold of the latest version of > template.scm as it does exactly what I need for my Guile CGI scripting > projects.
OK, I've checked now, and it appears that the code already posted is the most up to date that I have. > Also, how to use the process-template macro? > > Having created the file version.html which reads: > > <html> > <p>This page was processed by Guile $(display (version))$</p> > </html> > > I can get the desired result in a REPL using primitive-eval: [...] > or, better still, using eval-string: [...] > but using the process-template macro (with a variable list and module > requirement) produces an error: > > guile> (process-template "/path/to/version.html" ((foo 'bar)) (ice-9 rdelim)) > > Backtrace: > In standard input: > 39: 0* (process-template "/path/to/version.html" ((foo (quote bar))) ...) > 39: 1 (let* ((module #)) (module-define! module (quote foo) ...) ...) > In unknown file: > ?: 2 [eval (begin # # # ...) #<module b7cca530>] > 1: 3* (begin # # # ...) > > <unnamed port>:1:1: In expression (begin (display "<html> > ") (display " <p>This page was processed by Guile ") ...): > <unnamed port>:1:1: Unbound variable: begin > ABORT: (unbound-variable) The process-template call is just slightly wrong; it just needs to mention the (guile) module also: (process-template "/path/to/version.html" ((foo 'bar)) (guile) (ice-9 rdelim)) The (guile) module contains Guile's core bindings, including `begin'. (Possibly process-template could add (guile) automatically, but the implementation as it stands allows for greater precision.) > Would it not suffice to evaluate the template code in the environment > of the CGI script, i.e., with all the modules loaded and required > variables defined in the script before > > (eval-string (template-code "/path/to/more-complex-template.html")) > > is called? Interesting idea. I didn't provide that option before, because it wasn't helpful in the context of the program for which I wrote (ossau template), but you can easily define another API, say `eval-template', which does this: (define (eval-template template . module) (eval (with-input-from-string (template->code template) read) (if (null? module) (current-module) (car module)))) Then the call would be just (eval-template "/path/to/more-complex-template.html"). (The thing with process-template is that it allows additional variable bindings to be set up for just that process-template call, and one wouldn't (I think) want those bindings to persist in the whatever is the reference module for the template code. So process-template currently creates a temporary module, using make-module, to avoid this. But this is not cast in stone; perhaps process-template should use a surrounding `let' form instead to set up the bindings, or perhaps it would be better for the template file to begin with $(use-modules (ice-9 rdelim))$ instead of having (ice-9 rdelim) in the process-template call. I'm not sure.) > Could you perhaps provide a simple example usage of process-template? I do have more examples, but I think this is probably already covered above; let me know if not. Regards, Neil