[ANN] nyacc-2.01.3 released
Matt Wette <[email protected]>
| Newsgroups | gmane.lisp.guile.user |
|---|---|
| Message-ID | <[email protected]> |
This release extends the capability to provide guile procedures directly to functions which take callback arguments. More explanation below. NYACC, for Not Yet Another Compiler Compiler, is set of guile modules for generating parsers and lexical analyzers. It also provides sample parsers and pretty-printers using SXML trees as an intermediate representation. It provides a decent C parser and a `FFI Helper' tool to help create Guile Scheme bindings for C-based libraries. It provides (partially implemented) compilers based on above mentioned parsers to allow execution with Guile as extension languages. NEWS * ffi-helper: cover more cases where passing procedure (e.g., callback) to functions works; was only function-ptr typedefs * for forward ref structs, unions which are never elaborated, don't generate a definition * update some documentation for nyacc-fh-ug and cdata A little more detail on the fix. Consider the following functions with callback argument `cb'. With nyacc-2.01.2 `f1' would accept a guile procedure directly (i.e., without user translating via procedure->pointer), but `f2' and `f3' would not. With nyacc-2.01.3, all three work. (define-ffi-module (ffi dbug) #:api-code " typedef void (*t1)(int); typedef void (t2)(int); int f1(int, t1 cb); int f2(int, t2 *cb); int f3(int, void (*cb)(int));") Expanded code appears below. NYACC maturity is production/stable level. NYACC is free software; the full source distribution is available through * the tarball repository: https://download.savannah.gnu.org/releases/nyacc/ * the git repository: git://git.savannah.nongnu.org/nyacc.git home page, project page and user's guides: * https://www.nongnu.org/nyacc * https://savannah.nongnu.org/projects/nyacc * https://www.nongnu.org/nyacc/nyacc-ug.html * https://www.nongnu.org/nyacc/ffi-help.html Report bugs: * https://savannah.nongnu.org/bugs/?group=nyacc Get support: * https://savannah.nongnu.org/support/?group=nyacc Copyright (C) 2017-2024 Matthew Wette Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. This file is offered as-is, without any warranty. Copyright (C) 2017-2024 Matthew Wette Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. This file is offered as-is, without any warranty. ============================================ nyacc v2.01.2 ;; int f1(int, t1 cb); (define-public f1 (let ((~proc (delay (ffi:pointer->procedure ffi:int (foreign-pointer-search "f1") (list ffi:int '*))))) (lambda (arg0 cb) (let ((arg0 (unwrap-number arg0)) (cb (unwrap-pointer cb t1))) ((force ~proc) arg0 cb))))) ;; int f2(int, t2 *cb); (define-public f2 (let ((~proc (delay (ffi:pointer->procedure ffi:int (foreign-pointer-search "f2") (list ffi:int '*))))) (lambda (arg0 cb) (let ((arg0 (unwrap-number arg0)) (cb (unwrap-pointer cb))) ((force ~proc) arg0 cb))))) ;; int f3(int, void (*cb)(int)); (define-public f3 (let ((~proc (delay (ffi:pointer->procedure ffi:int (foreign-pointer-search "f3") (list ffi:int '*))))) (lambda (arg0 cb) (let ((arg0 (unwrap-number arg0)) (cb (unwrap-pointer cb))) ((force ~proc) arg0 cb))))) ============================================ nyacc v2.01.3 ;; int f1(int, t1 cb); (define-public f1 (let ((~proc (delay (ffi:pointer->procedure ffi:int (foreign-pointer-search "f1") (list ffi:int '*))))) (lambda (arg0 cb) (let ((arg0 (unwrap-number arg0)) (cb (unwrap-pointer cb t1))) ((force ~proc) arg0 cb))))) ;; int f2(int, t2 *cb); (define-public f2 (let ((~proc (delay (ffi:pointer->procedure ffi:int (foreign-pointer-search "f2") (list ffi:int '*))))) (lambda (arg0 cb) (let ((arg0 (unwrap-number arg0)) (cb (unwrap-pointer cb t2*))) ((force ~proc) arg0 cb))))) ;; int f3(int, void (*cb)(int)); (define-public f3 (let ((~proc (delay (ffi:pointer->procedure ffi:int (foreign-pointer-search "f3") (list ffi:int '*))))) (lambda (arg0 cb) (let ((arg0 (unwrap-number arg0)) (cb (unwrap-pointer cb (cpointer (cfunction (lambda (~proc) (ffi:procedure->pointer ffi:void (lambda (arg0) (~proc arg0)) (list ffi:int))) (lambda (p) 'unused)))))) ((force ~proc) arg0 cb)))))