summaryrefslogtreecommitdiffstats
path: root/share
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2017-07-02 16:53:35 -0700
committerKaz Kylheku <kaz@kylheku.com>2017-07-02 16:53:35 -0700
commitdb8aeddade93adde5c9e4e14888fb53a64bdc377 (patch)
tree6dfd4da1fe1b21f3e57053e19ebfe49a6d7bd0da /share
parent3d85925c3f209bed8703e4901ce3a28de89deea4 (diff)
downloadtxr-db8aeddade93adde5c9e4e14888fb53a64bdc377.tar.gz
txr-db8aeddade93adde5c9e4e14888fb53a64bdc377.tar.bz2
txr-db8aeddade93adde5c9e4e14888fb53a64bdc377.zip
ffi: new make-zstruct function and znew macro.
* ffi.c (make_zstruct): New function. (ffi_init): Register make-zstruct instrinsic. * ffi.h (make_zstruct): Declared. * lisplib.c (ffi_set_entries): Add znew to autload list. * share/txr/stdlib/ffi.tl (znew): New macro. * txr.1: Documented make-zstruct and znew.
Diffstat (limited to 'share')
-rw-r--r--share/txr/stdlib/ffi.tl7
1 files changed, 7 insertions, 0 deletions
diff --git a/share/txr/stdlib/ffi.tl b/share/txr/stdlib/ffi.tl
index a430f777..6cf1bf5a 100644
--- a/share/txr/stdlib/ffi.tl
+++ b/share/txr/stdlib/ffi.tl
@@ -148,3 +148,10 @@
(define-place-macro carray-sub (carray : (from 0) (to t))
^(sub ,carray ,from ,to))
+
+(defmacro znew (type . pairs)
+ (if (oddp (length pairs))
+ (throwf 'eval-error "~s: slot initform arguments must occur pairwise"
+ 'znew))
+ (let ((qpairs (mappend (aret ^(',@1 ,@2)) (tuples 2 pairs))))
+ ^(make-zstruct (ffi ,type) ,*qpairs)))