;;;; lazy-ffi.scm ; ; Copyright (c) 2000-2011, Felix L. Winkelmann ; All rights reserved. ; ; Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following ; conditions are met: ; ; Redistributions of source code must retain the above copyright notice, this list of conditions and the following ; disclaimer. ; Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following ; disclaimer in the documentation and/or other materials provided with the distribution. ; Neither the name of the author nor the names of its contributors may be used to endorse or promote ; products derived from this software without specific prior written permission. ; ; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS ; OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY ; AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR ; CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR ; CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR ; SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ; THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR ; OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE ; POSSIBILITY OF SUCH DAMAGE. (require-library srfi-69) (define lazy-ffi:*symbols* (make-hash-table)) (define (lazy-ffi:generate-uid s) (or (hash-table-ref/default lazy-ffi:*symbols* s #f) (let ([uid (string->symbol (conc "lazy-ffi:" (current-seconds) (random #x1000000)))]) (hash-table-set! lazy-ffi:*symbols* s uid) uid) ) ) (define (lazy-ffi:read port) (if (eq? (peek-char port) #\~) (begin (read-char port) `(lazy-ffi:function-ptr ,(read port)) ) (let ([x (read port)]) (define (process x) (cond [(or (not x) (string? x)) `(lazy-ffi:module ,x)] [(symbol? x) `(lazy-ffi:function ',x ',(lazy-ffi:generate-uid x))] [(list? x) `(list ,@(map process x))] [else (syntax-error "invalid use of `#~'" x)] ) ) (process x) ) ) ) (set-sharp-read-syntax! #\~ lazy-ffi:read)