[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [skribilo-users] Compiling a skribilo document within Guile
From: |
Ludovic Courtès |
Subject: |
Re: [skribilo-users] Compiling a skribilo document within Guile |
Date: |
Sun, 15 Jan 2017 23:57:59 +0100 |
User-agent: |
Gnus/5.13 (Gnus v5.13) Emacs/25.1 (gnu/linux) |
Roger Mason <address@hidden> skribis:
> (use-modules (skribilo engine) ;; provides `find-engine'
> (skribilo evaluator) ;; provides `evaluate-document'
> (skribilo package base) ;; provides `chapter', etc.
> (skribilo utils syntax) ;; `set-correct-file-encoding!'
> (srfi srfi-1)
> (ice-9 rdelim)) ;read-line
>
> (let* (;; infile, outfile, engine
> (infile (list-ref (command-line) 1))
> (outfile (list-ref (command-line) 2))
> (eng (string->symbol (list-ref (command-line) 3)))
> (e (find-engine eng))
>
> ;; The (document ...) bit wast pasted in from the file
> ;; It compiles fine using this text
> ;; There must be something odd about the (document ...) returned by
> with-input-from-file...
> (result (with-input-from-file infile
> (lambda ()
> (set-correct-file-encoding!)
> (let loop ((line (read-line))
> (result '()))
> (if (eof-object? line)
> (string-join (reverse result)
> (string #\newline))
> (loop (read-line)
> (cons line result)))))))
> (d result))
>
> ;; "Evaluate" the document to a file.
> (with-output-to-file (string-append outfile "." (symbol->string eng))
> (lambda ()
> (evaluate-document d e))))
I think the problem is that ‘d’ here is a string, namely:
"(document #:title …)"
whereas ‘evaluate-document’ expects an <ast> object.
Instead, you should be doing something like:
(let* ((code (call-with-input-file infile read))
(ast (primitive-eval code)))
(with-output-to-file …
(lambda ()
(evaluate-document ast e))))
See ‘evaluate-ast-from-port’ in (skribilo evaluator) for an example.
HTH!
Ludo’.