Hi,

You could try to put everything you're doing with read-string / read /
open-input-file inside syntax. For example:

~/tmp> cat ./compile-time-io.scm
(define file-contents
  (let-syntax
      ((load
        (er-macro-transformer
         (lambda (x r t)
           (import chicken.io chicken.port)
           `(quote
             ,(with-input-from-file
                 "/proc/cpuinfo"
               read-lines))))))
    (load)))

(write file-contents)
(newline)

~/tmp> csc compile-time-io.scm && ./compile-time-io
( "Processor\t: AArch64 Processor rev 14 (aarch64)"
  "processor\t: 0"
  "BogoMIPS\t: 38.40" ... )

~/tmp> grep BogoMIPS ./compile-time-io
grep: ./compile-time-io: binary file matches


K.

On Tue, Dec 26, 2023, 21:07 Al <frm...@mailgw.com> wrote:

> Hi, suppose I need to reference data from "file.txt" in my Scheme
> program. I could use read-char / read / open-input-file etc (or other
> (chicken io) procedures) to read the the contents of the file into a
> variable.
>
> However, such deserialization happens at run-time. If I compile my
> program into an executable, it will try to open "file.txt" at run-time.
> How can I arrange for "file.txt" to be read at compile-time, and inlined
> into the executable, so that the executable doesn't require access to
> the original file?
>
> The only way I can think of is to convert "file.txt" to a scheme string
> definition in a separate file:
>
> ; file.scm
> (define file-contents " ... ")
>
> and include it via (include "file.scm"). Then the definition would occur
> at compile-time.
>
> But of course this requires encoding (possibly binary) files as scheme
> strings, and probably an extra Makefile step to convert file.txt into
> file.scm. This is not attractive -- are there other options?
>
>
>

Reply via email to