generates setter lens for all struct members

This commit is contained in:
Erik 2016-03-09 08:10:39 +01:00
parent c8a48b79ee
commit 5523fd022f
2 changed files with 11 additions and 2 deletions

View File

@ -26,7 +26,8 @@
"ARG_LIST" arg-list-c
"SETTERS" (join "\n " (map (fn [n] (str "new_struct->" n " = " n ";")) c-member-names))}
c-program-string (template
"#include \"functions.h\"\n\nAPI STRUCT-NAME *CONSTRUCTOR-NAME(ARG_LIST) {
"
#include \"functions.h\"\n\nAPI STRUCT-NAME *CONSTRUCTOR-NAME(ARG_LIST) {
STRUCT-NAME *new_struct = malloc(sizeof(STRUCT-NAME));
SETTERS
return new_struct;
@ -52,7 +53,11 @@
(let [getter-signature (list :fn (list struct-type) member-type)
getter-proto (str member-t " get_" (c-ify-name member-name) "(" struct-t " x)")
getter-c (str getter-proto "{ return x->" c-member-name "; }")]
(bake-struct-lens-function (new-builder) (str "get-" member-name) getter-signature getter-proto getter-c '()))))))
(bake-struct-lens-function (new-builder) (str "get-" member-name) getter-signature getter-proto getter-c '()))
(let [setter-signature (list :fn (list struct-t member-t) struct-type)
setter-proto (str struct-t " set_" (c-ify-name member-name) "(" struct-t " x, " member-t " value)")
setter-c (str setter-proto "{ x->" c-member-name " = value; return x; }")]
(bake-struct-lens-function (new-builder) (str "set-" member-name) setter-signature setter-proto setter-c '()))))))
(defn bake-struct-lens-function [builder func-name func-signature proto c deps]
(let [c-func-name (c-ify-name func-name)

View File

@ -18,3 +18,7 @@
(defn f [x] (Vector x (+ x 10)))
(defn g [] (map-copy f [100 200 300]))
(defn h []
(let [v (Vector 100 100)]
(set-x v 666)))