${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 \
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
/* By: agilliar <agilliar@student.42mulhouse.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* 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 */
/* */
/* ************************************************************************** */
{
t_value res;
- (void) self;
errdefer(value_drop, &arg);
res = value_new_int(*value_int(&arg));
__builtin_add_overflow(res.val.v_int,
{
t_value res;
- (void) self;
errdefer(value_drop, &arg);
res = value_new_uint(*value_uint(&arg));
__builtin_add_overflow(res.val.v_uint,
/* By: agilliar <agilliar@student.42mulhouse.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* 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 */
/* */
/* ************************************************************************** */
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)));
}
--- /dev/null
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* builtin_lte.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: agilliar <agilliar@student.42mulhouse.fr> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* 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");
+}
/* By: agilliar <agilliar@student.42mulhouse.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* 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 */
/* */
/* ************************************************************************** */
{
t_value res;
- (void) self;
errdefer(value_drop, &arg);
res = value_new_int(*value_int(&arg));
__builtin_mul_overflow(res.val.v_int,
{
t_value res;
- (void) self;
errdefer(value_drop, &arg);
res = value_new_uint(*value_uint(&arg));
__builtin_mul_overflow(res.val.v_uint,
/* By: agilliar <agilliar@student.42mulhouse.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* 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 */
/* */
/* ************************************************************************** */
{
t_value res;
- (void) self;
errdefer(value_drop, &arg);
res = value_new_int(*value_int(&arg));
__builtin_sub_overflow(self.val.v_int,
{
t_value res;
- (void) self;
errdefer(value_drop, &arg);
res = value_new_uint(*value_uint(&arg));
__builtin_sub_overflow(self.val.v_uint,
/* By: agilliar <agilliar@student.42mulhouse.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* 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 <stdio.h>
bool step_extract(t_value *exprs, uintptr_t *i, t_value *eval, t_value *arg)
{
/* By: agilliar <agilliar@student.42mulhouse.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* 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 */
/* */
/* ************************************************************************** */
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,
};
/* By: agilliar <agilliar@student.42mulhouse.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* 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 */
/* */
/* ************************************************************************** */
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)
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)
{
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);