]> Untitled Git - axy/ft/c-cera.git/commitdiff
Factorial implemented woohoo
authorAxy <gilliardmarthey.axel@gmail.com>
Wed, 27 May 2026 14:12:59 +0000 (16:12 +0200)
committerAxy <gilliardmarthey.axel@gmail.com>
Wed, 27 May 2026 14:12:59 +0000 (16:12 +0200)
.deps
Makefile
src/builtin_add.c
src/builtin_list_get.c
src/builtin_lte.c [new file with mode: 0644]
src/builtin_mul.c
src/builtin_sub.c
src/eval.c
src/value_types.h
test.c

diff --git a/.deps b/.deps
index 9b8bb574f57705cb3fea88a53daa0151029921bf..c143355f4e3290d8b0e3fe86d6ad659a344d9bbc 100644 (file)
--- 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 \
index c9333732899f24be6490c211c269d45578734a5d..4dc184e848d4adb096df8aa9e8ee31b569baf833 100644 (file)
--- 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
 
index d6681806b6c5927b3569fa1fbeeab5f3c23ba2bb..045a9279b54f35dafd2dfe257a98138a78f07a96 100644 (file)
@@ -6,7 +6,7 @@
 /*   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       */
 /*                                                                            */
 /* ************************************************************************** */
 
@@ -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,
index 02362d6679e1faa8c19194dde56c6b5388d3b125..8cfd291900f001bc3a1bffb140feb041a06027ce 100644 (file)
@@ -6,7 +6,7 @@
 /*   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       */
 /*                                                                            */
 /* ************************************************************************** */
 
@@ -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 (file)
index 0000000..29a93f5
--- /dev/null
@@ -0,0 +1,58 @@
+/* ************************************************************************** */
+/*                                                                            */
+/*                                                        :::      ::::::::   */
+/*   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");
+}
index dacd7764ff54e39dde9dc0960c41ecbc1f5f383f..32da4762753fca112a46bb6ba96b759a80952f8b 100644 (file)
@@ -6,7 +6,7 @@
 /*   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       */
 /*                                                                            */
 /* ************************************************************************** */
 
@@ -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,
index c86e9de48a2038e6c7b82da81a69a64c62ca4a57..6bcc9bd75a40c6ad8dda4c2f4435447733c90147 100644 (file)
@@ -6,7 +6,7 @@
 /*   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       */
 /*                                                                            */
 /* ************************************************************************** */
 
@@ -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,
index 4ecfc2cb3de2e39f27670a256e33110c4fd22a9a..debbb04794119ff0fc63c0f0838643b0f0f13453 100644 (file)
@@ -6,11 +6,12 @@
 /*   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)
 {
index 83769b2e48ae7e781d340f1c998f5019fed3e1be..51681fb27076058f0e26b348d0149d2196d040fd 100644 (file)
@@ -6,7 +6,7 @@
 /*   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       */
 /*                                                                            */
 /* ************************************************************************** */
 
@@ -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 fa7c9b8df132aea4bc691359addfdf7c48e2211f..04c4429a20c78632e6010afc5c7783aa912ea15f 100644 (file)
--- a/test.c
+++ b/test.c
@@ -6,7 +6,7 @@
 /*   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       */
 /*                                                                            */
 /* ************************************************************************** */
 
@@ -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);