unofficial mirror of guile-user@gnu.org 
 help / color / mirror / Atom feed
* scheme -> (X)HTML
@ 2008-03-25 19:37 Paul Emsley
  2008-03-25 19:53 ` Julian Graham
  2008-03-25 20:49 ` Francesco Salvestrini
  0 siblings, 2 replies; 11+ messages in thread
From: Paul Emsley @ 2008-03-25 19:37 UTC (permalink / raw
  To: guile-user


Dear Guilers, 

I have in mind to write a little script that makes a web page about the state of
various files.

I'd like to use some schemey way of doing this.  s-expression -> HTML perhaps.

What is the thinking guile-user's way of approaching this?

Cheers, 

Paul.





^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: scheme -> (X)HTML
  2008-03-25 19:37 scheme -> (X)HTML Paul Emsley
@ 2008-03-25 19:53 ` Julian Graham
  2008-03-25 20:38   ` Neil Jerram
  2008-03-31 16:41   ` Paul Emsley
  2008-03-25 20:49 ` Francesco Salvestrini
  1 sibling, 2 replies; 11+ messages in thread
From: Julian Graham @ 2008-03-25 19:53 UTC (permalink / raw
  To: Paul Emsley; +Cc: guile-user

Hi Paul,

There are several good tools out there for doing this: Oleg Kiselyov
has written a Scheme-based port of SAX called SSAX [1] that can read
and emit S-expressions in a format he calls SXML.  It's available for
Guile as part of Andy Wingo's guile-lib [2].  For permissive HTML
parsing, Neil Van Dyke has written HtmlPrag [3].  And if you're
interested in a more DOM-based approach, I've got a module called SDOM
[4].

Hope that helps!

Regards,
Julian


[1]: http://okmij.org/ftp/Scheme/SXML.html
[2]: http://home.gna.org/guile-lib/
[3]: http://www.neilvandyke.org/htmlprag/
[4]: http://www.nongnu.org/sdom/


On Tue, Mar 25, 2008 at 3:37 PM, Paul Emsley <paul.emsley@bioch.ox.ac.uk> wrote:
>
>  Dear Guilers,
>
>  I have in mind to write a little script that makes a web page about the state of
>  various files.
>
>  I'd like to use some schemey way of doing this.  s-expression -> HTML perhaps.
>
>  What is the thinking guile-user's way of approaching this?




^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: scheme -> (X)HTML
  2008-03-25 19:53 ` Julian Graham
@ 2008-03-25 20:38   ` Neil Jerram
  2008-06-13 20:53     ` Sebastian Tennant
  2008-03-31 16:41   ` Paul Emsley
  1 sibling, 1 reply; 11+ messages in thread
From: Neil Jerram @ 2008-03-25 20:38 UTC (permalink / raw
  To: Paul Emsley; +Cc: guile-user

[-- Attachment #1: Type: text/plain, Size: 663 bytes --]

"Julian Graham" <joolean@gmail.com> writes:

> Hi Paul,
>
> There are several good tools out there for doing this: Oleg Kiselyov
> has written a Scheme-based port of SAX called SSAX [1] that can read
> and emit S-expressions in a format he calls SXML.  It's available for
> Guile as part of Andy Wingo's guile-lib [2].  For permissive HTML
> parsing, Neil Van Dyke has written HtmlPrag [3].  And if you're
> interested in a more DOM-based approach, I've got a module called SDOM
> [4].

As a further option, please see the attached.  If you're interested in
this, please let me know, because I may have a more up to date version
somewhere.

Regards,
      Neil



[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: template.scm --]
[-- Type: text/x-scheme, Size: 13401 bytes --]

;;;; (ossau template) -- template file processor

;;; Copyright (C) 2005 Neil Jerram
;;;
;; This library is free software; you can redistribute it and/or
;; modify it under the terms of the GNU Lesser General Public
;; License as published by the Free Software Foundation; either
;; version 2.1 of the License, or (at your option) any later version.
;; 
;; This library is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
;; Lesser General Public License for more details.
;; 
;; You should have received a copy of the GNU Lesser General Public
;; License along with this library; if not, write to the Free Software
;; Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA

(define-module (ossau template)
  #:use-module (ice-9 rdelim)
  #:use-module (ice-9 regex)
  #:export (template->code)
  #:export-syntax (process-template))

;*****************************************************************************;
;* A template file is a file of content, such as HTML, that is complete      *;
;* except for places where the content needs to be filled in                 *;
;* programmatically.  In the case of the template processor code here, the   *;
;* code to fill in the dynamic content is written in Scheme and appears      *;
;* inline in the template file.                                              *;
;*                                                                           *;
;* Areas of Scheme code in the template file are delimited by $.  For        *;
;* example:                                                                  *;
;*                                                                           *;
;* <I>This page was processed by Guile $(display (version))$</I>             *;
;*                                                                           *;
;* here (display (version)) is interpreted and processed as Scheme code;     *;
;* the rest is normal (HTML) content.                                        *;
;*                                                                           *;
;* If either normal content or Scheme code needs to include a $ character,   *;
;* it can do so by doubling the $, as in: Price $$10.20.                     *;
;*                                                                           *;
;* Fragments of Scheme code do not have to be individually balanced.  For    *;
;* example:                                                                  *;
;*                                                                           *;
;* $(for-each (lambda (x)$                                                   *;
;* <LI>The square of $(display x)$ is $(display (* x x))$</LI>               *;
;* $          ) (iota 11))$                                                  *;
;*                                                                           *;
;* A shorthand is provided for cases where a fragment only wants to display  *;
;* a variable.  This is $~FORMAT VARNAME$, for example $~A x$.  ~FORMAT is a *;
;* format specifier understood by (ice-9 format), and VARNAME is the name of *;
;* the variable to display.                                                  *;
;*                                                                           *;
;* It may sometimes help to know the exact algorithm in order to write a     *;
;* piece of template file code correctly.  It is as follows.                 *;
;*                                                                           *;
;* 1. Convert the template file - even the normal content - into a big       *;
;*    Scheme code string by:                                                 *;
;*                                                                           *;
;*    - converting each fragment of normal content to `(display FRAGMENT)'   *;
;*                                                                           *;
;*    - converting each `~FORMAT VARNAME' fragment to                        *;
;*      `(format #t ~FORMAT VARNAME)'                                        *;
;*                                                                           *;
;*    - copying other Scheme code fragments as written.                      *;
;*                                                                           *;
;* 2. Read and evaluate this string in an environment as specified by the    *;
;*    arguments to process-template.                                         *;
;*                                                                           *;
;*****************************************************************************;

;*****************************************************************************;
;* template->code                                                            *;
;*                                                                           *;
;* Reads a template file and returns the Scheme code that should be read and *;
;* evaluated to generate the implied output.                                 *;
;*****************************************************************************;
(define (template->code template)
  ;***************************************************************************;
  ;* Utility procedure: convert any occurrences of "$$" in STRING to just    *;
  ;* "$".                                                                    *;
  ;***************************************************************************;
  (define (unescape-$$ string)
    (cond ((string-match "\\$\\$" string)
           =>
           (lambda (match-data)
             (string-append (substring string 0 (match:start match-data 0))
                            "$"
                            (unescape-$$ (substring string
                                                    (+ (match:start match-data
                                                                    0)
                                                       1))))))
          (else string)))
  ;***************************************************************************;
  ;* Utility procedure: given a string read from the template file, after    *;
  ;* splitting between scheme and non-scheme parts, return the Scheme code   *;
  ;* corresponding to the template string.                                   *;
  ;***************************************************************************;
  (define (make-code-string template-string in-scheme)
    (if in-scheme
        ;*********************************************************************;
        ;* Template string should be interpreted as Scheme code.  If it      *;
        ;* begins with "~", it is a shorthand for a format expression;       *;
        ;* otherwise, it is straight Scheme code and doesn't need any        *;
        ;* further tweaking.                                                 *;
        ;*********************************************************************;
        (cond ((string-match "^~[^ ]+ " template-string)
               =>
               (lambda (match-data)
                 (let ((beg (match:start match-data 0))
                       (end (match:end match-data 0)))
                   (format #f
                           "(format #t ~S ~A)"
                           (substring template-string beg (- end 1))
                           (substring template-string end)))))
              (else template-string))
        ;*********************************************************************;
        ;* Template string is normal file content (i.e. outside Scheme       *;
        ;* code).  The corresponding Scheme code should display it.          *;
        ;*********************************************************************;
        (format #f "(display ~S)" template-string)))
  ;***************************************************************************;
  ;* Main procedure code.                                                    *;
  ;***************************************************************************;
  (with-input-from-file template
    (lambda ()
      ;***********************************************************************;
      ;* Loop reading lines from the template file.                          *;
      ;***********************************************************************;
      (let loop ((template-line (read-line (current-input-port) 'concat))
                 (in-scheme #f)
                 (strings '()))
        (if (eof-object? template-line)
            ;*****************************************************************;
            ;* EOF: return the concatenated Scheme code string.              *;
            ;*****************************************************************;
;            (let ((code
            (string-append "(begin "
                           (apply string-append
                                  (reverse strings))
                           ")")
;            ))
;              (with-output-to-file "template-debug.scm"
;                (lambda ()
;                  (display code)))
;              code)
            ;*****************************************************************;
            ;* Not yet EOF: normal processing.  First check for single "$";  *;
            ;* these mark the boundaries between Scheme code and normal      *;
            ;* (non-Scheme) file content.                                    *;
            ;*****************************************************************;
            (cond ((string-match "(^|[^$])(\\$)($|[^$])" template-line)
                   =>
                   ;**********************************************************;
                   ;* Found a single "$", so process the part of the line    *;
                   ;* before the "$", then toggle the in-scheme flag and     *;
                   ;* loop to process the rest of the line.                  *;
                   ;**********************************************************;
                   (lambda (match-data)
                     (let (($pos (match:start match-data 2)))
                       (loop (let ((rest (substring template-line (+ $pos 1))))
                               (if (<= (string-length rest) 1)
                                   (read-line (current-input-port) 'concat)
                                   rest))
                             (not in-scheme)
                             (cons (make-code-string (unescape-$$
                                                      (substring template-line
                                                                 0
                                                                 $pos))
                                                     in-scheme)
                                   strings)))))
                  ;***********************************************************;
                  ;* No "$" in this line, so process whole line and loop to  *;
                  ;* read the next line.                                     *;
                  ;***********************************************************;
                  (else
                   (loop (read-line (current-input-port) 'concat)
                         in-scheme
                         (cons (make-code-string (unescape-$$ template-line)
                                                 in-scheme)
                               strings)))))))))

;*****************************************************************************;
;* process-template                                                          *;
;*                                                                           *;
;* Processes a template file, with the generated output going to the current *;
;* output port.  Returns unspecified.                                        *;
;*                                                                           *;
;* Args are: template     - Name of template file.                           *;
;*           vars         - Variables to define for the Scheme code in the   *;
;*                          template file, in the same form as a set of let  *;
;*                          bindings, i.e.                                   *;
;*                            ((variable1 value1)                            *;
;*                             (variable2 value2)                            *;
;*                             ...)                                          *;
;*           modules      - List of modules that the Scheme code in the      *;
;*                          template file uses.                              *;
;*                                                                           *;
;*****************************************************************************;
(define-macro (process-template template vars . modules)
  `(let ((module (make-module 31
                              (map resolve-interface
                                   ',modules))))
     ,@(map (lambda (vardef)
              `(module-define! module
                               ',(if (pair? vardef) (car vardef) vardef)
                               ,(if (pair? vardef) (cadr vardef) vardef)))
            vars)
     (eval (with-input-from-string (template->code ,template) read)
           module)))

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: scheme -> (X)HTML
  2008-03-25 19:37 scheme -> (X)HTML Paul Emsley
  2008-03-25 19:53 ` Julian Graham
@ 2008-03-25 20:49 ` Francesco Salvestrini
  1 sibling, 0 replies; 11+ messages in thread
From: Francesco Salvestrini @ 2008-03-25 20:49 UTC (permalink / raw
  To: guile-user

Hi Paul,

On Tuesday 25 March 2008, Paul Emsley wrote:
> Dear Guilers,
>
> I have in mind to write a little script that makes a web page about the
> state of various files.
>
> I'd like to use some schemey way of doing this.  s-expression -> HTML
> perhaps.

Links that could be useful:

http://en.wikipedia.org/wiki/SXML
http://okmij.org/ftp/Scheme/SXML.html

An implementation for guile is available at the following URL:

http://home.gna.org/guile-lib

Cheers,
Francesco

> What is the thinking guile-user's way of approaching this?
>
> Cheers,
>
> Paul.



-- 
In the Spring, I have counted 136 different kinds of weather inside of
24 hours.
		-- Mark Twain, on New England weather




^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: scheme -> (X)HTML
  2008-03-25 19:53 ` Julian Graham
  2008-03-25 20:38   ` Neil Jerram
@ 2008-03-31 16:41   ` Paul Emsley
  2008-03-31 20:33     ` Francesco Salvestrini
  1 sibling, 1 reply; 11+ messages in thread
From: Paul Emsley @ 2008-03-31 16:41 UTC (permalink / raw
  To: guile-user


Julian Graham wrote:
> On Tue, Mar 25, 2008 at 3:37 PM, Paul Emsley <paul.emsley@bioch.ox.ac.uk> wrote:
>
>   
>>  Dear Guilers,
>>
>>  I have in mind to write a little script that makes a web page about the state of
>>  various files.
>>
>>  I'd like to use some schemey way of doing this.  s-expression -> HTML perhaps.
>>
>>  What is the thinking guile-user's way of approaching this?
>>     
>
> Hi Paul,
>
> There are several good tools out there for doing this: Oleg Kiselyov
> has written a Scheme-based port of SAX called SSAX [1] that can read
> and emit S-expressions in a format he calls SXML.  It's available for
> Guile as part of Andy Wingo's guile-lib [2].  For permissive HTML
> parsing, Neil Van Dyke has written HtmlPrag [3].  And if you're
> interested in a more DOM-based approach, I've got a module called SDOM
> [4].
>
> Hope that helps!
>
> Regards,
> Julian
>
>
> [1]: http://okmij.org/ftp/Scheme/SXML.html
> [2]: http://home.gna.org/guile-lib/
> [3]: http://www.neilvandyke.org/htmlprag/
> [4]: http://www.nongnu.org/sdom/
>
>   

Hi Julian,

Thank you and others for replying to my query.

I looked at [1] and [2] in your list - I didn't want to parse XML - not 
yet anyway.

Trying [1] I found that Oleg made me jump through hoops with his 
idiosyncratically organised
web pages.  That put me off a bit.  When I tried his code, it was not 
clear to me where the output
was going.  So I tried [2].  I ended up using [2] because I like reading 
Andy Wingo's blog and
it just worked out of the box anyway.

It was such fun!  I've not quasiquoted so deeply before. I'm still 
tinkering with the script - I use
it to see how my hetrogeneous overnight builds got on.

code here:
http://coot.googlecode.com/svn/trunk/build-web-page-builder.scm
results here:
http://www.ysbl.york.ac.uk/~emsley/coot/build-info.html

(Incidentally, the FC3 build seems to fail because guile-gtk-2.1 fails 
to build (it fails in make, not
configure.  Is guile-gtk-2.1 supposed to work on gtk+-2.4?  ... not 
completely the right place to
ask, I guess).

I have a question about the output.  How do I put line breaks into the 
generated text?  All on one
line is fine for my browser - but makes it hard to eyeball the HTML.

After I wrote it (and saw how concise the sxml translator was), I though 
"so what's all the fuss
about PHP?" One of the major things, perhaps, is the generation of 
images in-line.  So I thought
"couldn't guile+sxml do something similar making SVGs on the fly?"  Is 
that being quietly coded
up by someone? Making a few graphs on the fly shouldn't be so hard, 
should it?  In fact, I was
even thinking of doing it myself :)

Regards,

Paul.






^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: scheme -> (X)HTML
  2008-03-31 16:41   ` Paul Emsley
@ 2008-03-31 20:33     ` Francesco Salvestrini
  2008-04-02 11:42       ` Thien-Thi Nguyen
  0 siblings, 1 reply; 11+ messages in thread
From: Francesco Salvestrini @ 2008-03-31 20:33 UTC (permalink / raw
  To: guile-user

Hi Paul,

Sorry for bothering you off the list but I've hit some troubles with guile 
mailing lists lately so I'm writing to you directly.

There's a package I've put on savannah that uses SXML (via guile) in order to 
build HTML. Maybe it could be of some help to you. This is its main URL:

	http://www.nongnu.org/sitetool

Maybe it worth a look.

NOTE: It is in its early stage of development so do not expect too much ;-)

Cheers,
Francesco


On Monday 31 March 2008, Paul Emsley wrote:
> Julian Graham wrote:
> > On Tue, Mar 25, 2008 at 3:37 PM, Paul Emsley <paul.emsley@bioch.ox.ac.uk> 
wrote:
> >>  Dear Guilers,
> >>
> >>  I have in mind to write a little script that makes a web page about the
> >> state of various files.
> >>
> >>  I'd like to use some schemey way of doing this.  s-expression -> HTML
> >> perhaps.
> >>
> >>  What is the thinking guile-user's way of approaching this?
> >
> > Hi Paul,
> >
> > There are several good tools out there for doing this: Oleg Kiselyov
> > has written a Scheme-based port of SAX called SSAX [1] that can read
> > and emit S-expressions in a format he calls SXML.  It's available for
> > Guile as part of Andy Wingo's guile-lib [2].  For permissive HTML
> > parsing, Neil Van Dyke has written HtmlPrag [3].  And if you're
> > interested in a more DOM-based approach, I've got a module called SDOM
> > [4].
> >
> > Hope that helps!
> >
> > Regards,
> > Julian
> >
> >
> > [1]: http://okmij.org/ftp/Scheme/SXML.html
> > [2]: http://home.gna.org/guile-lib/
> > [3]: http://www.neilvandyke.org/htmlprag/
> > [4]: http://www.nongnu.org/sdom/
>
> Hi Julian,
>
> Thank you and others for replying to my query.
>
> I looked at [1] and [2] in your list - I didn't want to parse XML - not
> yet anyway.
>
> Trying [1] I found that Oleg made me jump through hoops with his
> idiosyncratically organised
> web pages.  That put me off a bit.  When I tried his code, it was not
> clear to me where the output
> was going.  So I tried [2].  I ended up using [2] because I like reading
> Andy Wingo's blog and
> it just worked out of the box anyway.
>
> It was such fun!  I've not quasiquoted so deeply before. I'm still
> tinkering with the script - I use
> it to see how my hetrogeneous overnight builds got on.
>
> code here:
> http://coot.googlecode.com/svn/trunk/build-web-page-builder.scm
> results here:
> http://www.ysbl.york.ac.uk/~emsley/coot/build-info.html
>
> (Incidentally, the FC3 build seems to fail because guile-gtk-2.1 fails
> to build (it fails in make, not
> configure.  Is guile-gtk-2.1 supposed to work on gtk+-2.4?  ... not
> completely the right place to
> ask, I guess).
>
> I have a question about the output.  How do I put line breaks into the
> generated text?  All on one
> line is fine for my browser - but makes it hard to eyeball the HTML.
>
> After I wrote it (and saw how concise the sxml translator was), I though
> "so what's all the fuss
> about PHP?" One of the major things, perhaps, is the generation of
> images in-line.  So I thought
> "couldn't guile+sxml do something similar making SVGs on the fly?"  Is
> that being quietly coded
> up by someone? Making a few graphs on the fly shouldn't be so hard,
> should it?  In fact, I was
> even thinking of doing it myself :)
>
> Regards,
>
> Paul.



-- 
<lilo> Fairlight: udp is the light margarine of tcp/ip transport protocols :)
	-- Seen on #Linux




^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: scheme -> (X)HTML
  2008-03-31 20:33     ` Francesco Salvestrini
@ 2008-04-02 11:42       ` Thien-Thi Nguyen
  0 siblings, 0 replies; 11+ messages in thread
From: Thien-Thi Nguyen @ 2008-04-02 11:42 UTC (permalink / raw
  To: guile-user

Another way is to use modules (ttn-do zzz xhtml-tree)[0] and
(ttn-do zzz publishing)[1].  All of gnuvola's html, modulo
texinfo output, is rendered that way.  Likewise, the servers
grumi[2] and sizzweb[3] compose using those modules.

Same idea as the others proposed, different dependencies.

thi


[0] http://www.gnuvola.org/software/ttn-do/ttn-do.html.gz#zzz-xhtml_002dtree
[1] http://www.gnuvola.org/software/ttn-do/ttn-do.html.gz#zzz-publishing
[2] http://www.gnuvola.org/software/ttn-do/scm-html/grumi.scm.html.gz
[3] http://www.gnuvola.org/software/ttn-do/scm-html/sizzweb.scm.html.gz





^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: scheme -> (X)HTML
  2008-03-25 20:38   ` Neil Jerram
@ 2008-06-13 20:53     ` Sebastian Tennant
  2008-06-16 21:15       ` Neil Jerram
  0 siblings, 1 reply; 11+ messages in thread
From: Sebastian Tennant @ 2008-06-13 20:53 UTC (permalink / raw
  To: guile-user

Neil Jerram <neil@ossau.uklinux.net> 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.

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:

  guile> (primitive-eval (with-input-from-string (template->code "/path/to/version.html") read))
  <html>
    <p>This page was processed by Guile 1.8.4</p>
  </html>
  guile>

or, better still, using eval-string:

  guile> (eval-string (template->code "/path/to/version.html"))
  <html>
    <p>This page was processed by Guile 1.8.4</p>
  </html>
  guile> 

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)


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?

Could you perhaps provide a simple example usage of process-template?

Any guidance much appreciated.

Regards,

Sebastian





^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: scheme -> (X)HTML
  2008-06-13 20:53     ` Sebastian Tennant
@ 2008-06-16 21:15       ` Neil Jerram
  2008-06-21  9:11         ` Sebastian Tennant
  0 siblings, 1 reply; 11+ messages in thread
From: Neil Jerram @ 2008-06-16 21:15 UTC (permalink / raw
  To: Sebastian Tennant; +Cc: guile-user

2008/6/13 Sebastian Tennant <sebyte@smolny.plus.com>:
> Neil Jerram <neil@ossau.uklinux.net> 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




^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: scheme -> (X)HTML
  2008-06-16 21:15       ` Neil Jerram
@ 2008-06-21  9:11         ` Sebastian Tennant
  2008-07-03 22:32           ` Neil Jerram
  0 siblings, 1 reply; 11+ messages in thread
From: Sebastian Tennant @ 2008-06-21  9:11 UTC (permalink / raw
  To: guile-user

Quoth "Neil Jerram" <neiljerram@googlemail.com>:
> OK, I've checked now, and it appears that the code already posted is
> the most up to date that I have.

Noted.

>> guile> (process-template "/path/to/version.html" ((foo 'bar)) (ice-9 rdelim))
>> [...]
>> <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 [...as] the (guile) module contains
> Guile's core bindings, including `begin'.

Ah, I see.  I suspected this but make-module is not included in the
procedure index of the info manual and nowhere is there any mention of
the (guile) module.

> (Possibly process-template could add (guile) automatically, but the
> implementation as it stands allows for greater precision.)

Absolutely, and it's not hard to use once you know how.

>> 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").

Neat.

> (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.)

So many options, so few clinchers.

>> 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.

Your explanation is crystal clear, thanks a lot.  I was going to suggest
modifying process-template to accept an empty variables list and, in the
absence of a module list, use (guile) and the (current-module) used, but
eval-template is much cleaner.

Out of pure curiosity, whats the significance of '31' in the make-module
call in process-template?

Seb

-- 
Emacs' AlsaPlayer - Music Without Jolts
http://sebyte.org/eap.html





^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: scheme -> (X)HTML
  2008-06-21  9:11         ` Sebastian Tennant
@ 2008-07-03 22:32           ` Neil Jerram
  0 siblings, 0 replies; 11+ messages in thread
From: Neil Jerram @ 2008-07-03 22:32 UTC (permalink / raw
  To: Sebastian Tennant; +Cc: guile-user

2008/6/21 Sebastian Tennant <sebyte@smolny.plus.com>:
>
> Out of pure curiosity, whats the significance of '31' in the make-module
> call in process-template?

I believe it's the initial size of the module's hash table for storing
bindings (from identifiers to variable locations).  (I believe that
prime numbers are good sizes for hash tables.)

     Neil




^ permalink raw reply	[flat|nested] 11+ messages in thread

end of thread, other threads:[~2008-07-03 22:32 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-03-25 19:37 scheme -> (X)HTML Paul Emsley
2008-03-25 19:53 ` Julian Graham
2008-03-25 20:38   ` Neil Jerram
2008-06-13 20:53     ` Sebastian Tennant
2008-06-16 21:15       ` Neil Jerram
2008-06-21  9:11         ` Sebastian Tennant
2008-07-03 22:32           ` Neil Jerram
2008-03-31 16:41   ` Paul Emsley
2008-03-31 20:33     ` Francesco Salvestrini
2008-04-02 11:42       ` Thien-Thi Nguyen
2008-03-25 20:49 ` Francesco Salvestrini

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).