summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lisplib.c3
-rw-r--r--share/txr/stdlib/doc-syms.tl2
-rw-r--r--share/txr/stdlib/ffi.tl6
-rw-r--r--txr.130
4 files changed, 40 insertions, 1 deletions
diff --git a/lisplib.c b/lisplib.c
index 26367cba..21c1ac59 100644
--- a/lisplib.c
+++ b/lisplib.c
@@ -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)
diff --git a/txr.1 b/txr.1
index 9cb01efb..d6a016ca 100644
--- a/txr.1
+++ b/txr.1
@@ -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 ])