diff options
-rw-r--r-- | lisplib.c | 3 | ||||
-rw-r--r-- | share/txr/stdlib/doc-syms.tl | 2 | ||||
-rw-r--r-- | share/txr/stdlib/ffi.tl | 6 | ||||
-rw-r--r-- | txr.1 | 30 |
4 files changed, 40 insertions, 1 deletions
@@ -632,7 +632,8 @@ static val ffi_set_entries(val dlt, val fun) val name[] = { lit("with-dyn-lib"), lit("deffi"), lit("deffi-type"), lit("deffi-cb"), lit("deffi-cb-unsafe"), - lit("deffi-sym"), lit("deffi-var"), lit("typedef"), lit("sizeof"), + lit("deffi-sym"), lit("deffi-var"), lit("deffi-struct"), + lit("deffi-union"), lit("typedef"), lit("sizeof"), lit("alignof"), lit("offsetof"), lit("arraysize"), lit("elemsize"), lit("elemtype"), lit("ffi"), lit("carray-ref"), lit("carray-sub"), lit("sub-buf"), lit("znew"), diff --git a/share/txr/stdlib/doc-syms.tl b/share/txr/stdlib/doc-syms.tl index 177ac266..20e7cf0e 100644 --- a/share/txr/stdlib/doc-syms.tl +++ b/share/txr/stdlib/doc-syms.tl @@ -450,7 +450,9 @@ ("deffi" "N-00DCE51D") ("deffi-cb" "N-00C54FC8") ("deffi-cb-unsafe" "N-00C54FC8") + ("deffi-struct" "N-0040FFE6") ("deffi-sym" "N-02B237BB") + ("deffi-union" "N-0040FFE6") ("deffi-var" "N-03C237C9") ("deffilter" "N-00BDE41F") ("define-accessor" "N-03C5F850") diff --git a/share/txr/stdlib/ffi.tl b/share/txr/stdlib/ffi.tl index 58729ceb..73ee1936 100644 --- a/share/txr/stdlib/ffi.tl +++ b/share/txr/stdlib/ffi.tl @@ -130,6 +130,12 @@ (defvarl ,var-sym (carray-cptr ,var-ref ,type-sym 1)) (defsymacro ,name (carray-ref ,var-sym 0))))) +(defmacro deffi-struct (name . body) + ^(typedef ,name (struct ,name ,*body))) + +(defmacro deffi-union (name . body) + ^(typedef ,name (union ,name ,*body))) + (defmacro sizeof (type : (obj nil obj-p) :env menv) (if obj-p (if (constantp obj menv) @@ -76030,6 +76030,36 @@ macro yields the compiled version of .meta type-syntax as its value. +.coNP Macros @ deffi-struct and @ deffi-union +.synb +.mets (deffi-struct < name >> {( slot < type <> [ init-form ])}*) +.mets (deffi-union < name >> {( slot < type <> [ init-form ])}*) +.syne +.desc +The +.code deffi-struct +and +.code deffi-union +macros provide a more compact notation for defining FFI structure and union +types together with matching +.code typedef +names. + +The semantics follows from these equivalences: + +.verb + (deffi-struct S ...) <--> (typedef S (struct S ...)) + (deffi-union U ...) <--> (typedef U (union U ...)) +.brev + +.TP* Example: + +.verb + (deffi-struct point + (x double) + (y double)) +.brev + .coNP Macro @ sizeof .synb .mets (sizeof < type-syntax <> [ object-expr ]) |