aboutsummaryrefslogtreecommitdiff
path: root/guile-zig-local/my.zig
diff options
context:
space:
mode:
Diffstat (limited to 'guile-zig-local/my.zig')
-rw-r--r--guile-zig-local/my.zig79
1 files changed, 79 insertions, 0 deletions
diff --git a/guile-zig-local/my.zig b/guile-zig-local/my.zig
new file mode 100644
index 0000000..dabfccb
--- /dev/null
+++ b/guile-zig-local/my.zig
@@ -0,0 +1,79 @@
+//! This zig module provides functionality for binding guile against zig
+
+
+const std = @import("std");
+const mem = @import("std").mem;
+const guile = @import("test-include.zig");
+const SCM = guile.SCM;
+const expectEqual = @import("std").testing.expectEqual;
+const expect = @import("std").testing.expect;
+const ArrayList = std.ArrayList;
+const StringList = ArrayList([] const u8);
+const Allocator = std.mem.Allocator;
+const p = @import("std").debug.print;
+
+const hello = "Hello World from Zig";
+
+pub export fn ping_zig(i: SCM) SCM {
+ return i;
+}
+
+export fn hello_zig() void {
+ p("Hello world", .{});
+}
+
+fn hello_zig2(msg: [] const u8) []const u8 {
+ const result = msg;
+ return result;
+}
+
+export fn my_incrementing_zig_function(testi: SCM, flag: SCM) SCM {
+ var result = testi;
+ var vflag = guile.scm_to_bool(flag);
+ if (vflag != 0)
+ result = guile.scm_sum(testi, guile.scm_from_int (1))
+ else
+ result = testi;
+
+ return result;
+}
+
+// Increment the first value that is 2 in a list
+export fn my_increment_in_list_zig(lst: SCM) SCM {
+ var lst2 = guile.scm_memv(guile.scm_from_int(2), lst);
+ lst2 = guile.scm_list_set_x(lst2, guile.scm_from_int(0), guile.scm_from_int(3));
+ return lst; // note original is updated!
+}
+
+// Increment the second value in the unboxed vector
+export fn my_increment_in_f64vector_zig(vec: SCM) SCM {
+ // _ = guile.scm_f64vector_set_x(vec, guile.scm_from_int(1), guile.scm_from_double(3.7));
+ var handle: guile.scm_t_array_handle = undefined;
+ var lenp: usize = undefined;
+ var incp: isize = undefined;
+ var data = guile.scm_f64vector_writable_elements(vec, &handle, &lenp, &incp);
+ p("\nZig says {any},{any},{any}\n",.{data[0],data[1],data[2]});
+ data[1] += 1.0;
+ guile.scm_array_handle_release(&handle);
+ return vec; // note original is updated!
+}
+
+test "hello zig" {
+ try expectEqual(hello_zig2(hello),hello);
+}
+
+// ---- Guile
+
+// pub const scm_t_subr = *anyopaque;
+
+export fn init_module() void {
+ // var t = @ptrCast(*anyopaque,&ping_zig);
+ var c_ping_zig = @intToPtr(*anyopaque, @ptrToInt(&ping_zig));
+ var c_incr_zig = @intToPtr(*anyopaque, @ptrToInt(&my_incrementing_zig_function));
+ var c_incr_list_zig = @intToPtr(*anyopaque, @ptrToInt(&my_increment_in_list_zig));
+ var c_incr_f64vector_zig = @intToPtr(*anyopaque, @ptrToInt(&my_increment_in_f64vector_zig));
+ var res = guile.scm_c_define_gsubr("ping_zig", 1, 0, 0, c_ping_zig);
+ res = guile.scm_c_define_gsubr("incr_zig", 2, 0, 0, c_incr_zig);
+ res = guile.scm_c_define_gsubr("incr_list_zig", 1, 0, 0, c_incr_list_zig);
+ res = guile.scm_c_define_gsubr("incr_f64vector_zig", 1, 0, 0, c_incr_f64vector_zig);
+}