Re: compile-time deserialization
Kristian Lein-Mathisen <[email protected]>
| Newsgroups | gmane.lisp.scheme.chicken |
|---|---|
| Message-ID | <CAAGQtHzOtZ--TZWhE2yGH_+tnjOC44=2e67tRE+Uu-kKN4HH6g@mail.gmail.com> |
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 <[email protected]> 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?
>
>
>