Previous: Code Generation Compiler Back-End, Up: Compiler


4.5.3 Run-Time Compiler Back-End

The run-time compiler back-end is also provided by the (rpc compiler) module. It reads XDR/RPC definitions and returns data structures readily usable to deal with the XDR data types or RPC programs described, at run-time. Actually, as of version 0.3, it does not have an API to deal with RPC programs, only with XDR data types.

— Scheme Procedure: rpc-language->xdr-types input

Read XDR type definitions from input and return an alist; element of the returned alist is a pair whose car is a string naming an XDR data type and whose cdr is an XDR data type object (see XDR Type Representations). input can be either an input port, a string, or an AST as returned by rpc-language->sexp (see Parser).

This procedure can raise error conditions having a sub-type of &compiler-error.

Here is an example of two procedures that, given XDR type definitions, decode (respectively encode) an object of that type:

     (use-modules (rpc compiler)
                  (rpc xdr)
                  (r6rs bytevector)
                  (r6rs io ports))
     
     (define (decode-data type-defs type-name port)
       ;; Read binary data from PORT as an object of type
       ;; TYPE-NAME whose definition is given in TYPE-DEFS.
       (let* ((types (rpc-language->xdr-types type-defs))
              (type  (cdr (assoc type-name types))))
         (xdr-decode type port)))
     
     (define (encode-data type-defs type-name object)
       ;; Encode OBJECT as XDR data type named TYPE-NAME from
       ;; the XDR type definitions in TYPE-DEFS.
       (let* ((types (rpc-language->xdr-types type-defs))
              (type  (cdr (assoc type-name types)))
              (size  (xdr-type-size type object))
              (bv    (make-bytevector size)))
         (xdr-encode! bv 0 type object)
         (open-bytevector-input-port bv)))

These procedures can then be used as follows:

     (let ((type-defs (string-append "typedef hyper chbouib<>;"
                                     "struct foo { "
                                     "  int x; float y; chbouib z;"
                                     "};"))
           (type-name "foo")
           (object    '(1 2.0 #(3 4 5))))
       (equal? (decode-data type-defs type-name
                            (encode-data type-defs type-name
                                         object))
               object))
     
     =>
     
     #t

Note that in this example type-defs contains two type definitions, which is why the type-name argument is absolutely needed.