An ONC RPC Framework for Guile: Run-Time Compiler Back-End

Previous: , Up: Compiler [Contents][Index]


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.4, 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)
 (rnrs bytevectors)
 (rnrs 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.


Previous: , Up: Compiler [Contents][Index]

AltStyle によって変換されたページ (->オリジナル) /