#### 13.10` `Fast-Load Serialization

(require racket/fasl) | package: base |

procedure

(s-exp->fasl v [ out #:keep-mutable? keep-mutable?]) → (or/c (void) bytes?) v : any/c out : (or/c output-port? #f) = #f keep-mutable? : any/c = #f

procedure

(fasl->s-exp in [ #:datum-intern? datum-intern?]) → any/c in : (or/c input-port? bytes?) datum-intern? : any/c = #t

The v argument must be a value that could be quoted
as a literal—

Like (compile `',v), s-exp->fasl does not preserve graph structure, support cycles, or handle non-prefab structures. Compose s-exp->fasl with serialize to preserve graph structure, handle cyclic data, and encode serializable structures. The s-exp->fasl and fasl->s-exp functions consult current-write-relative-directory and current-load-relative-directory, respectively, in the same way as bytecode saving and loading to store paths in relative form, and they similarly allow and convert constrained srcloc values (see Printing Compiled Code).

Unless keep-mutable? is provided as true to s-exp->fasl, then mutable values in v are replaced by immutable values when the result is decoded by fasl->s-exp. Unless datum-intern? is provided as #f, then any immutable value produced by fasl->s-exp is filtered by datum-intern-literal. The defaults make the composition of s-exp->fasl and fasl->s-exp behave like the composition of write and read.

The byte-string encoding produced by s-exp->fasl is independent of the Racket version, except as future Racket versions introduce extensions that are not currently recognized. In particular, the result of s-exp->fasl will be valid as input to any future version of fasl->s-exp.

> (define fasl (s-exp->fasl (list #("speed") 'racer #\!))) > fasl #"racket/fasl:\0\24\34\3 \1\23\5speed\16\5racer\r!"

> (fasl->s-exp fasl) '(#("speed") racer #\!)

Changed in version 6.90.0.21 of package base: Made s-exp->fasl format version-independent
and added the #:keep-mutable?
and #:datum-intern? arguments.

Changed in version 7.3.0.7: Added support for correlated objects.