From 4302ca199cc37c3adfdf04b38396335eeab7faf1 Mon Sep 17 00:00:00 2001 From: Axy Date: Wed, 27 May 2026 16:12:59 +0200 Subject: [PATCH] Factorial implemented woohoo --- .deps | 4 +++ Makefile | 2 +- src/builtin_add.c | 4 +-- src/builtin_list_get.c | 3 +- src/builtin_lte.c | 58 +++++++++++++++++++++++++++++++++++++ src/builtin_mul.c | 4 +-- src/builtin_sub.c | 4 +-- src/eval.c | 3 +- src/value_types.h | 22 +++++++++++++- test.c | 66 +++++++++++++++++++++++++++++++----------- 10 files changed, 139 insertions(+), 31 deletions(-) create mode 100644 src/builtin_lte.c diff --git a/.deps b/.deps index 9b8bb57..c143355 100644 --- a/.deps +++ b/.deps @@ -17,6 +17,10 @@ ${BUILDDIR}/builtin_list_set.o: src/builtin_list_set.c src/builtin_register.h \ ${BUILDDIR}/builtin_list_set_drop.o: src/builtin_list_set_drop.c src/value.h \ src/value_get.h src/value_types.h src/panic.h src/jmp.h \ src/value_new.h src/arc.h src/memutils.h src/arith.h +${BUILDDIR}/builtin_lte.o: src/builtin_lte.c src/builtin_register.h src/value_types.h \ + src/value.h src/value_get.h src/panic.h src/jmp.h src/value_new.h \ + src/defer.h src/framealloc.h src/align.h src/stacktrack.h \ + src/memutils.h ${BUILDDIR}/builtin_mul.o: src/builtin_mul.c src/builtin_register.h src/value_types.h \ src/value.h src/value_get.h src/panic.h src/jmp.h src/value_new.h \ src/defer.h src/framealloc.h src/align.h src/stacktrack.h \ diff --git a/Makefile b/Makefile index c933373..4dc184e 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,6 @@ NAME=ccera.a -SRCS=src/arc.c src/builtin_add.c src/builtin.c src/builtin_list_get.c src/builtin_list_set.c src/builtin_list_set_drop.c src/builtin_mul.c src/builtin_noop.c src/builtin_register.c src/builtin_sub.c src/defer.c src/eval.c src/framealloc.c src/panic.c src/stacktrack.c src/value_debug.c src/value_lifetime.c src/value_list.c src/value_move.c src/value_new.c src/value_new_utils.c +SRCS=src/arc.c src/builtin_add.c src/builtin.c src/builtin_list_get.c src/builtin_list_set.c src/builtin_list_set_drop.c src/builtin_lte.c src/builtin_mul.c src/builtin_noop.c src/builtin_register.c src/builtin_sub.c src/defer.c src/eval.c src/framealloc.c src/panic.c src/stacktrack.c src/value_debug.c src/value_lifetime.c src/value_list.c src/value_move.c src/value_new.c src/value_new_utils.c HEADERS=src/align.h src/arc.h src/arith.h src/atomic.h src/builtin_register.h src/ccera.h src/defer.h src/framealloc.h src/jmp.h src/memutils.h src/panic.h src/stacktrack.h src/value_get.h src/value.h src/value_new.h src/value_types.h diff --git a/src/builtin_add.c b/src/builtin_add.c index d668180..045a927 100644 --- a/src/builtin_add.c +++ b/src/builtin_add.c @@ -6,7 +6,7 @@ /* By: agilliar +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2026/05/25 14:49:44 by agilliar #+# #+# */ -/* Updated: 2026/05/25 14:50:50 by agilliar ### ########.fr */ +/* Updated: 2026/05/27 13:48:14 by agilliar ### ########.fr */ /* */ /* ************************************************************************** */ @@ -29,7 +29,6 @@ t_value builtin_iadd1_impl(t_value self, t_value arg) { t_value res; - (void) self; errdefer(value_drop, &arg); res = value_new_int(*value_int(&arg)); __builtin_add_overflow(res.val.v_int, @@ -52,7 +51,6 @@ t_value builtin_uadd1_impl(t_value self, t_value arg) { t_value res; - (void) self; errdefer(value_drop, &arg); res = value_new_uint(*value_uint(&arg)); __builtin_add_overflow(res.val.v_uint, diff --git a/src/builtin_list_get.c b/src/builtin_list_get.c index 02362d6..8cfd291 100644 --- a/src/builtin_list_get.c +++ b/src/builtin_list_get.c @@ -6,7 +6,7 @@ /* By: agilliar +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2026/05/25 15:18:16 by agilliar #+# #+# */ -/* Updated: 2026/05/25 15:58:14 by agilliar ### ########.fr */ +/* Updated: 2026/05/27 13:48:48 by agilliar ### ########.fr */ /* */ /* ************************************************************************** */ @@ -27,7 +27,6 @@ t_value builtin_list_get_impl(t_value self, t_value arg) t_value builtin_list_get1_impl(t_value self, t_value arg) { - (void) self; defer(value_drop, &arg); return (value_copy(*value_list_get(arg, self.val.v_uint))); } diff --git a/src/builtin_lte.c b/src/builtin_lte.c new file mode 100644 index 0000000..29a93f5 --- /dev/null +++ b/src/builtin_lte.c @@ -0,0 +1,58 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* builtin_lte.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: agilliar +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2026/05/27 13:40:13 by agilliar #+# #+# */ +/* Updated: 2026/05/27 13:51:26 by agilliar ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "builtin_register.h" +#include "value.h" +#include "defer.h" + +t_value builtin_ilte_impl(t_value self, t_value arg) +{ + t_value res; + + (void) self; + errdefer(value_drop, &arg); + res = value_new_builtin(BUILTIN_ILTE1); + res.val.v_int = *value_int(&arg); + return (res); +} + +t_value builtin_ilte1_impl(t_value self, t_value arg) +{ + errdefer(value_drop, &arg); + return (value_new_uint(self.val.v_int <= *value_int(&arg))); +} + +t_value builtin_ulte_impl(t_value self, t_value arg) +{ + t_value res; + + (void) self; + errdefer(value_drop, &arg); + res = value_new_builtin(BUILTIN_ULTE1); + res.val.v_uint = *value_uint(&arg); + return (res); +} + +t_value builtin_ulte1_impl(t_value self, t_value arg) +{ + errdefer(value_drop, &arg); + return (value_new_uint(self.val.v_uint <= *value_uint(&arg))); +} + +__attribute__((constructor)) +void builtin_lte_register(void) +{ + builtin_register(BUILTIN_ILTE, &builtin_ilte_impl, "ilte"); + builtin_register(BUILTIN_ILTE1, &builtin_ilte1_impl, "ilte1"); + builtin_register(BUILTIN_ULTE, &builtin_ulte_impl, "ulte"); + builtin_register(BUILTIN_ULTE1, &builtin_ulte1_impl, "ulte1"); +} diff --git a/src/builtin_mul.c b/src/builtin_mul.c index dacd776..32da476 100644 --- a/src/builtin_mul.c +++ b/src/builtin_mul.c @@ -6,7 +6,7 @@ /* By: agilliar +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2026/05/20 14:53:21 by agilliar #+# #+# */ -/* Updated: 2026/05/20 15:23:05 by agilliar ### ########.fr */ +/* Updated: 2026/05/27 13:48:34 by agilliar ### ########.fr */ /* */ /* ************************************************************************** */ @@ -29,7 +29,6 @@ t_value builtin_imul1_impl(t_value self, t_value arg) { t_value res; - (void) self; errdefer(value_drop, &arg); res = value_new_int(*value_int(&arg)); __builtin_mul_overflow(res.val.v_int, @@ -52,7 +51,6 @@ t_value builtin_umul1_impl(t_value self, t_value arg) { t_value res; - (void) self; errdefer(value_drop, &arg); res = value_new_uint(*value_uint(&arg)); __builtin_mul_overflow(res.val.v_uint, diff --git a/src/builtin_sub.c b/src/builtin_sub.c index c86e9de..6bcc9bd 100644 --- a/src/builtin_sub.c +++ b/src/builtin_sub.c @@ -6,7 +6,7 @@ /* By: agilliar +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2026/05/25 14:59:29 by agilliar #+# #+# */ -/* Updated: 2026/05/25 15:02:24 by agilliar ### ########.fr */ +/* Updated: 2026/05/27 13:48:25 by agilliar ### ########.fr */ /* */ /* ************************************************************************** */ @@ -29,7 +29,6 @@ t_value builtin_isub1_impl(t_value self, t_value arg) { t_value res; - (void) self; errdefer(value_drop, &arg); res = value_new_int(*value_int(&arg)); __builtin_sub_overflow(self.val.v_int, @@ -52,7 +51,6 @@ t_value builtin_usub1_impl(t_value self, t_value arg) { t_value res; - (void) self; errdefer(value_drop, &arg); res = value_new_uint(*value_uint(&arg)); __builtin_sub_overflow(self.val.v_uint, diff --git a/src/eval.c b/src/eval.c index 4ecfc2c..debbb04 100644 --- a/src/eval.c +++ b/src/eval.c @@ -6,11 +6,12 @@ /* By: agilliar +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2026/05/04 01:21:34 by agilliar #+# #+# */ -/* Updated: 2026/05/20 15:18:00 by agilliar ### ########.fr */ +/* Updated: 2026/05/27 15:05:44 by agilliar ### ########.fr */ /* */ /* ************************************************************************** */ #include "ccera.h" +#include bool step_extract(t_value *exprs, uintptr_t *i, t_value *eval, t_value *arg) { diff --git a/src/value_types.h b/src/value_types.h index 83769b2..51681fb 100644 --- a/src/value_types.h +++ b/src/value_types.h @@ -6,7 +6,7 @@ /* By: agilliar +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2026/05/13 22:04:36 by agilliar #+# #+# */ -/* Updated: 2026/05/25 16:39:10 by agilliar ### ########.fr */ +/* Updated: 2026/05/27 13:46:22 by agilliar ### ########.fr */ /* */ /* ************************************************************************** */ @@ -49,6 +49,26 @@ enum e_builtin: uint16_t BUILTIN_LIST_SET, BUILTIN_LIST_SET1, BUILTIN_LIST_SET2, + BUILTIN_ILTE, + BUILTIN_ILTE1, + BUILTIN_ULTE, + BUILTIN_ULTE1, + BUILTIN_ILT, + BUILTIN_ILT1, + BUILTIN_ULT, + BUILTIN_ULT1, + BUILTIN_IGTE, + BUILTIN_IGTE1, + BUILTIN_UGTE, + BUILTIN_UGTE1, + BUILTIN_IGT, + BUILTIN_IGT1, + BUILTIN_UGT, + BUILTIN_UGT1, + BUILTIN_IEQ, + BUILTIN_IEQ1, + BUILTIN_UEQ, + BUILTIN_UEQ1, _BUILTIN_MAX, }; diff --git a/test.c b/test.c index fa7c9b8..04c4429 100644 --- a/test.c +++ b/test.c @@ -6,7 +6,7 @@ /* By: agilliar +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2026/04/30 17:19:58 by agilliar #+# #+# */ -/* Updated: 2026/05/27 13:23:35 by agilliar ### ########.fr */ +/* Updated: 2026/05/27 16:12:48 by agilliar ### ########.fr */ /* */ /* ************************************************************************** */ @@ -77,11 +77,24 @@ t_value compose(void) value_new_nil(), value_new_nil(), value_new_step(0, true, 2, true), - value_new_step(3, true, 1, true) + value_new_step(1, true, 3, true) ); return (value_new_va(2, res, value_new_uint(0))); } +// (a -> b -> c) -> b -> a -> c +t_value arg_swap(void) +{ + t_value res = value_new_va( + 5, + value_new_nil(), + value_new_nil(), + value_new_nil(), + value_new_step(0, true, 2, true), + value_new_step(3, true, 1, true) + ); + return (value_new_va(2, res, value_new_uint(0))); +} // (f: f -> a) -> a t_value make_rec(void) @@ -94,22 +107,41 @@ t_value make_rec(void) return (value_new_va(2, comb, value_new_uint(0))); } -/* -t_value fib(void) +// f: f' f' +// f': f -> curr: uint -> uint +// f' = (ite (ulte curr 1) (true 1) (compose (arg_swap f (usub curr 1)) (umul curr))) f +t_value fact(void) { - t_value comb = value_new_va( - _, - make_rec(), - ite(), - value_new_builtin(BUILTIN_UADD), - value_new_builtin(BUILTIN_NOOP), - value_new_nil(), - value_new_nil(), - value_new_nil(), + t_value res = value_new_va( + 25, + make_rec(), // 0 + ite(), // 1 + compose(), // 2 + arg_swap(), // 3 + value_true(), // 4 + value_new_uint(1), // 5 + value_new_builtin(BUILTIN_UMUL), // 6 + value_new_builtin(BUILTIN_USUB), // 7 + value_new_builtin(BUILTIN_ULTE), // 8 + value_new_nil(), // 9 f + value_new_nil(), // 10 curr + value_new_step(8, true, 10, false), // 11 ulte curr + value_new_step(11, true, 5, false), // 12 ulte curr 1 + value_new_step(1, true, 12, true), // 13 ite (ulte curr 1) + value_new_step(4, true, 5, false), // 14 true 1 + value_new_step(13, true, 14, true), // 15 ite (ulte curr 1) (true 1) + value_new_step(3, true, 9, false), // 16 arg_swap f + value_new_step(7, true, 10, false), // 17 usub curr + value_new_step(17, true, 5, true), // 18 usub curr 1 + value_new_step(16, true, 18, true), // 19 arg_swap f (usub curr 1) + value_new_step(2, true, 19, true), // 20 compose (arg_swap f (usub curr 1)) + value_new_step(6, true, 10, true), // 21 umul curr + value_new_step(20, true, 21, true), // 22 compose (arg_swap f (usub curr 1)) (umul curr) + value_new_step(15, true, 22, true), // 23 ite ... + value_new_step(23, true, 9, false) // res ); - return (expr_eval(make_rec(), value_new_va(2, comb, value_new_uint(0)))); + return (expr_eval(make_rec(), value_new_va(2, res, value_new_uint(9)))); } -*/ t_value test_expr(void) { @@ -134,8 +166,8 @@ void main2(void *_orig) char *s2 = malloc(strlen(orig) + 1); defer(free, s2); strcpy(s2, orig); - t_value res = expr_eval(test_expr(), value_new_uint(0)); - //t_value res = expr_eval(fib(), value_new_uint(10)); + //t_value res = expr_eval(test_expr(), value_new_uint(0)); + t_value res = expr_eval(fact(), value_new_uint(100)); value_debug(0, &res); defer(value_drop, &res); printf("%s\n", s2); -- 2.53.0