From 982fed7f0e1e52479151c3e43d78d6cf35684250 Mon Sep 17 00:00:00 2001 From: Gryfenfer97 Date: Sat, 1 Feb 2025 19:43:32 +0100 Subject: Add C++ language --- languages/c/c++/README.md | 13 ++++++++ languages/c/c++/lambda-core.cpp | 67 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 80 insertions(+) create mode 100644 languages/c/c++/README.md create mode 100644 languages/c/c++/lambda-core.cpp (limited to 'languages/c/c++') diff --git a/languages/c/c++/README.md b/languages/c/c++/README.md new file mode 100644 index 0000000..41b7129 --- /dev/null +++ b/languages/c/c++/README.md @@ -0,0 +1,13 @@ +# C++ Lambda Core + +## Requirements + +- GCC 14 or above + +## Compile and run + +```sh +g++ lambda-core.cpp -std=c++23 -o app +./app +``` + diff --git a/languages/c/c++/lambda-core.cpp b/languages/c/c++/lambda-core.cpp new file mode 100644 index 0000000..3c1ae20 --- /dev/null +++ b/languages/c/c++/lambda-core.cpp @@ -0,0 +1,67 @@ +#include + +namespace logic { +constexpr auto _true = [](const auto &x) { + return [&x](const auto &) { return x; }; +}; + +constexpr auto _false = [](const auto &) { + return [](const auto &y) { return y; }; +}; + +constexpr auto _not = [](const auto &x) { return x(_false)(_true); }; + +constexpr auto _and = [](const auto &x) { + return [&x](const auto &y) { return x(y)(_false); }; +}; + +constexpr auto _or = [](const auto &x) { + return [&x](const auto &y) { return x(_true)(y); }; +}; + +namespace test { +constexpr bool convert(const auto &x) { return x(true)(false); } + +void print(const auto &x) { std::println("{}", convert(x)); } +} // namespace test +} // namespace logic + +namespace church { +constexpr auto zero = [](const auto &) { + return [](const auto &x) { return x; }; +}; + +constexpr auto succ = [](const auto &n) { + return [&n](const auto &f) { + return [&n, &f](const auto &x) { return f(n(f)(x)); }; + }; +}; + +constexpr auto one = succ(zero); + +namespace test { +constexpr unsigned int convert(const auto &n) { + return n([](const auto &x) { return x + 1; })(0); +} + +void print(const auto &n) { std::println("{}", convert(n)); } +} // namespace test +} // namespace church + +int main() { + using namespace logic; + using namespace church; + + static_assert(logic::test::convert(_true) == true); + static_assert(logic::test::convert(_false) == false); + static_assert(logic::test::convert(_and(_true)(_true)) == true); + static_assert(logic::test::convert(_and(_true)(_false)) == false); + static_assert(logic::test::convert(_or(_true)(_true)) == true); + static_assert(logic::test::convert(_or(_true)(_false)) == true); + logic::test::print(_true); + + static_assert(church::test::convert(zero) == 0); + static_assert(church::test::convert(succ(zero)) == 1); + // static_assert(church::test::convert(pred(succ(one))) == 1); + church::test::print(one); +} -- cgit v1.2.3 From 3d7b2ecc046b1c8c57766eef325590fd66cb5032 Mon Sep 17 00:00:00 2001 From: Gryfenfer97 Date: Sat, 1 Feb 2025 19:55:25 +0100 Subject: add pred function --- languages/c/c++/lambda-core.cpp | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) (limited to 'languages/c/c++') diff --git a/languages/c/c++/lambda-core.cpp b/languages/c/c++/lambda-core.cpp index 3c1ae20..a6ce614 100644 --- a/languages/c/c++/lambda-core.cpp +++ b/languages/c/c++/lambda-core.cpp @@ -39,6 +39,16 @@ constexpr auto succ = [](const auto &n) { constexpr auto one = succ(zero); +constexpr auto pred(const auto &n) { + return [&n](const auto &f) { + return [&n, &f](auto x) { + return n([&f](const auto &g) { + return [&f, g](const auto &h) { return h(g(f)); }; + })([x](const auto &u) { return x; })([](const auto &a) { return a; }); + }; + }; +} + namespace test { constexpr unsigned int convert(const auto &n) { return n([](const auto &x) { return x + 1; })(0); @@ -62,6 +72,6 @@ int main() { static_assert(church::test::convert(zero) == 0); static_assert(church::test::convert(succ(zero)) == 1); - // static_assert(church::test::convert(pred(succ(one))) == 1); + static_assert(church::test::convert(pred(succ(one))) == 1); church::test::print(one); } -- cgit v1.2.3 From ac45c34c705dc2114d1155b66545d2b3a7ed5613 Mon Sep 17 00:00:00 2001 From: Gryfenfer97 Date: Sat, 1 Feb 2025 19:59:12 +0100 Subject: transform pred in a lambda function --- languages/c/c++/lambda-core.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'languages/c/c++') diff --git a/languages/c/c++/lambda-core.cpp b/languages/c/c++/lambda-core.cpp index a6ce614..c9e73b9 100644 --- a/languages/c/c++/lambda-core.cpp +++ b/languages/c/c++/lambda-core.cpp @@ -39,7 +39,7 @@ constexpr auto succ = [](const auto &n) { constexpr auto one = succ(zero); -constexpr auto pred(const auto &n) { +constexpr auto pred = [](const auto &n) { return [&n](const auto &f) { return [&n, &f](auto x) { return n([&f](const auto &g) { @@ -47,7 +47,7 @@ constexpr auto pred(const auto &n) { })([x](const auto &u) { return x; })([](const auto &a) { return a; }); }; }; -} +}; namespace test { constexpr unsigned int convert(const auto &n) { -- cgit v1.2.3