[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH] Add arithmetic builtin functions
From: |
Pete Dietl |
Subject: |
Re: [PATCH] Add arithmetic builtin functions |
Date: |
Mon, 9 Dec 2024 17:18:58 -0800 |
I could also use some help with autotools and the Perl test scripts <
I am a novice at both :) >
Here is a bit of test code I came up with. Do you think this is
necessary and or the right approach for testing with extreme values of
double and long long?
>From 4a6e84061fbf2180cf4efec45a215dd8af6481b1 Mon Sep 17 00:00:00 2001
From: Pete Dietl <petedietl@gmail.com>
Date: Mon, 9 Dec 2024 17:06:55 -0800
Subject: [PATCH] arith_tests
---
configure.ac | 34 ++++++++++++++++++++++++++++++
tests/config-flags.pm.in | 24 +++++++++++----------
tests/scripts/functions/add | 42 +++++++++++++++++++++++++++++++++++++
3 files changed, 89 insertions(+), 11 deletions(-)
create mode 100644 tests/scripts/functions/add
diff --git a/configure.ac b/configure.ac
index d9abc0d2..7b27dc21 100644
--- a/configure.ac
+++ b/configure.ac
@@ -555,6 +555,40 @@ AC_CONFIG_FILES([build.cfg tests/config-flags.pm \
# Put build.sh in the build directory so it's easy to find
AC_CONFIG_LINKS([build.sh:build.sh])
+AC_MSG_CHECKING([for LLONG_MAX and LLONG_MIN values])
+AC_LINK_IFELSE(
+ [AC_LANG_PROGRAM(
+[[
+#include <limits.h>
+#include <stdio.h>
+]],
+[[
+#ifdef LLONG_MAX
+ printf("%lld\n%lld\n", (long long)LLONG_MAX, (long long)LLONG_MIN);
+ return 0;
+#else
+ return 1;
+#endif
+]]
+ )],
+ [ # Linking succeeded
+ AC_MSG_RESULT([yes])
+ LLVALS=`./conftest`
+ rm -f conftest conftest.c
+ LONG_LONG_INT_MAX=`echo "$LLVALS" | sed -n '1p'`
+ LONG_LONG_INT_MIN=`echo "$LLVALS" | sed -n '2p'`
+ ],
+ [ # Linking failed
+ AC_MSG_RESULT([no])
+ LONG_LONG_INT_MAX=""
+ LONG_LONG_INT_MIN=""
+ ],
+AC_MSG_ERROR([This must succeed])
+)
+
+AC_SUBST([LONG_LONG_INT_MAX], [$LONG_LONG_INT_MAX])
+AC_SUBST([LONG_LONG_INT_MIN], [$LONG_LONG_INT_MIN])
+
# OK, do it!
AC_OUTPUT
diff --git a/tests/config-flags.pm.in b/tests/config-flags.pm.in
index 90cd9801..8e2a80f7 100644
--- a/tests/config-flags.pm.in
+++ b/tests/config-flags.pm.in
@@ -4,17 +4,19 @@
# during the tests.
%CONFIG_FLAGS = (
- AM_LDFLAGS => '@AM_LDFLAGS@',
- AR => '@AR@',
- CC => '@CC@',
- CFLAGS => '@CFLAGS@',
- CPP => '@CPP@',
- CPPFLAGS => '@CPPFLAGS@',
- GUILE_CFLAGS => '@GUILE_CFLAGS@',
- GUILE_LIBS => '@GUILE_LIBS@',
- LDFLAGS => '@LDFLAGS@',
- LIBS => '@LIBS@',
- USE_SYSTEM_GLOB => '@USE_SYSTEM_GLOB@'
+ AM_LDFLAGS => '@AM_LDFLAGS@',
+ AR => '@AR@',
+ CC => '@CC@',
+ CFLAGS => '@CFLAGS@',
+ CPP => '@CPP@',
+ CPPFLAGS => '@CPPFLAGS@',
+ GUILE_CFLAGS => '@GUILE_CFLAGS@',
+ GUILE_LIBS => '@GUILE_LIBS@',
+ LDFLAGS => '@LDFLAGS@',
+ LIBS => '@LIBS@',
+ USE_SYSTEM_GLOB => '@USE_SYSTEM_GLOB@',
+ LONG_LONG_INT_MAX => '@LONG_LONG_INT_MAX@',
+ LONG_LONG_INT_MIN => '@LONG_LONG_INT_MIN@'
);
1;
diff --git a/tests/scripts/functions/add b/tests/scripts/functions/add
new file mode 100644
index 00000000..3c5576f2
--- /dev/null
+++ b/tests/scripts/functions/add
@@ -0,0 +1,42 @@
+# -*-perl-*-
+
+use Math::BigInt;
+
+$description = "Test the add function.\n";
+
+$details = "Try various uses of add and ensure they all give the correct
+results.\n";
+
+
+$llong_max = get_config('LONG_LONG_INT_MAX');
+$llong_min = get_config('LONG_LONG_INT_MIN');
+
+run_make_test('# Identity
+.RECIPEPREFIX = >
+all:
+> @echo 0_1 $(add 0)
+> @echo 0_2 $(add 1)
+> @echo 0_3 $(add -4)
+> @echo 0_4 $(add ' . $llong_min . ')
+> @echo 0_5 $(add ' . $llong_max . ')
+', '', '0_1 0
+0_2 1
+0_3 -4
+0_4 ' . $llong_min . '
+0_5 ' . $llong_max . '
+');
+
+run_make_test('# Positive addition
+.RECIPEPREFIX = >
+all:
+> @echo 0_1 $(add 0,1)
+> @echo 0_2 $(add 1,0)
+> @echo 0_3 $(add 1, 2, 3,4)
+> @echo 0_4 $(add ' . $llong_min . ',1)
+', '', '0_1 1
+0_2 1
+0_3 10
+0_4 ' . Math::BigInt->new($llong_min)->badd(1)->bstr() . '
+');
+
+1;
--
2.43.0
On Mon, Dec 9, 2024 at 12:50 PM Paul Smith <psmith@gnu.org> wrote:
>
> On Mon, 2024-12-09 at 01:49 -0800, Pete Dietl wrote:
> > Mon, 9 Dec 2024 10:37:14 +0100, Jouke Witteveen wrote:
> > > What I remember from the original thread is that we first needed a
> > > good proposal. I'm afraid the existence of the implementation
> > > suggested now sidesteps the discussion on what functionality is
> > > actually desirable.
> >
> > Yeah I'm totally open to discussing a proposal further. I just felt
> > like having some working prototype implemented would be useful.
>
> In my opinion the patch is a proposal. If we decide it's best to do
> something completely different, then that's what we'll do. No doubt
> whatever we decide the user interface should be, at least big chunks of
> this code can be re-used anyway. Hopefully this won't be a shock to
> Pete :)
>
> I agree that the big open question from the previous discussion was,
> multiple individual functions versus one function that accepts a "math
> string". And if the latter, what is the syntax of that string. I
> liked the idea of a single function, as it seems simpler to use, but
> certainly it requires more decisions and discussion.
>
> > > I don't see the advantage in creating this special case. If someone
> > > wants the negation of a value, wouldn't they just write "-$V" instead
> > > of "$(sub $V)"?
> >
> > This feels similar to many concerns raised in the original thread
> > four years ago. In this particular case, "-$V" could result in two
> > consecutive minus signs, which is probably not what we want.
>
> I'm not sure why not, as long as the code handles it (I don't think
> this code does, admittedly). Can't you just consider --5 to be the
> same as -(-5), or 5, which is the same thing that $(sub -5) gives (I
> think)?
>
> > personally I still think arithmetic operators may be too much feature
> > creep altogether.
>
> I think I don't agree. For one thing we already have the concept of
> "numbers", because we provide the $(words ...) and, maybe less
> convincingly, $(word ...) functions. It's just that we can't really do
> much with them yet.
>
> I get the instinct to keep the language "clean" but in the end, people
> want to write build tools more than they want a clean language :).
> Being able to do basic math without having to shell out (not portable)
> or link with Guile or write some C code for a loadable module, doesn't
> seem like we're going out too far on the ledge.
>