Skip to main content

C-Py-Py

from cpp import *

x = (cpp)[std::vector<int>v({1, 2, 3})]
x.push_back(4)
(cpp)[std::cout] << "Vector x: " << x << (cpp)[std::endl]
# -> prints 'Vector x: [1, 2, 3]'
for i in auto& x:
    (cpp)[std::cout] << "Incrementing " << i << "..." << (cpp)[std::endl]
    # -> prints 'Incrementing 1...', 'Incrementing 2...', etc.
    i += 1

(cpp)[std::cout] << "Vector after: " << x << (cpp)[std::endl]
# -> prints 'Vector after: [2, 3, 4, 5]'

How?

Template notation

The <> template notation was quite difficult to pull off. Python has a weird concept of multiple-boolean-operators, so the following:

x = (cpp)[std::vector<int>v({1, 2, 3})]

is equivalent to

x = (cpp)[std::((vector < int) and (int > v({1, 2, 3})))]

We can then overwrite the less than operator for the object vector to simply return True, so that it's negligible:

x = (cpp)[std::(True and (int > v({1, 2, 3})))]
x = (cpp)[std::(int > v({1, 2, 3}))]

Now we can overwrite the less than operator on a different class (v, in this case) so that it simply takes in a fully formed vector object as self and a type as the comparison, then tries to transform that into a new vector of the type in the comparison. This would be equivalent to:

x = (cpp)[std::(v({1, 2, 3}))]

C++-style namespacing

Nearly there. For the namespacing (::), we turn to the only place in the Python syntax where adjacent colons are allowed: slice notation. The code above is equivalent to:

x = cpp[slice(std, None, v({1, 2, 3}))]

We can define cpp to be an instance of a class that overrides the __getitem__ method to simply return the rightmost part of the slice:

class cpp:
    def __getitem__(self, other: slice):
        return other.step
cpp = cpp()

Now the code is equivalent to just:

x = v({1, 2, 3})

where v is essentially a thin wrapper around list.

cout

cout performs a small sleight-of-hand. Since Python is evaluated left-to-right, we have to have the << operator reduce each of the expressions down into a single format string, then pass that to endl to actually do the printing. We do this by making cout.lshift() return a Coutable:

class _Coutable:
    def __init__(self, o) -> None:
        self._total_str: str = format(o)

    def __lshift__(self, other: Any) -> Self:
        if other is endl:
            print(self._total_str)
        self._total_str = self._total_str + format(other)
        return self

This class will just keep accumulating objects' formatted representations until it hits endl, when it will print everything out.

Taking references

Unfortunately, Python's for _ in _: syntax is pretty rigid, and won't allow any operations in-between for and in, so we have to stick the auto& on the right side. This

Why?

Scientists are hard at work trying to come up with an answer to that question.

Release files for c-py-py 0.1.5

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for c-py-py 0.1.5
File Size Uploaded
c-py-py-0.1.5.tar.gz 4.4 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for c-py-py 0.1.5
File Interpreter ABI Platform
c_py_py-0.1.5-py3-none-any.whl Python 3 none any Details

Total release size: 8.4 kB

Release files / c-py-py-0.1.5.tar.gz

Download URL c-py-py-0.1.5.tar.gz
Size 4.4 kB
Tags Source
SHA-256 checksum
How to use checksums
908d8aabe911e184622e7babf764bb3ce9e78dcd5c424102612896da6e6bfb0b
BLAKE2b-256 checksum
How to use checksums
368961b71039022199f43aa2166c8ed559716259d160b0733d134b8b6774e8fc
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via poetry/1.1.14 CPython/3.11.0b3 Windows/10

Release files / c_py_py-0.1.5-py3-none-any.whl

Download URL c_py_py-0.1.5-py3-none-any.whl
Size 3.9 kB
Tags Python 3
SHA-256 checksum
How to use checksums
633c0837523c0a881e2fee039aec2909c2b7e9faa9589b74e0726482d8bdc0ad
BLAKE2b-256 checksum
How to use checksums
4d2bc5a28277d28fabdd211d6163bddad057e840a0256e5f222e564927268c8d
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via poetry/1.1.14 CPython/3.11.0b3 Windows/10

Release history Release notifications | RSS feed

This release

0.1.5 This release

2 release files

0.1.4

2 release files

0.1.3

2 release files

0.1.2

2 release files

0.1.1

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page