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.
Metadata
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)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| c-py-py-0.1.5.tar.gz | 4.4 kB | Without provenance | Details for c-py-py-0.1.5.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| c_py_py-0.1.5-py3-none-any.whl | Python 3 | none | any | Details for c_py_py-0.1.5-py3-none-any.whl |
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
|
Security for c-py-py 0.1.5
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.