[Cython] [ENH] Compile-time code execution (macros / templates)

da-woods dw-git at d-woods.co.uk
Wed Feb 24 17:20:39 EST 2021


A few things to point out:
1) Because Cython is mainly a is code translation tool it doesn't 
currently have an overview of how things would eventually be evaluated - 
it leaves a lot for the C compiler to sort out. Your suggestion would 
presumably add a dependency on a C compiler at the .pyx -> .c stage 
(currently the only dependencies are Python+Cython itself).
2) Presumably `twice` and `make_ptr_class` would also have to work at 
run-time? They are regular `def` functions after all? That seems like a 
big change to now have to dynamically create `cdef` functions and 
classes at both Cythonization-time and runtime. And also a 
Python-runtime representation of every C type (so that you can call 
`make_ptr_class` at runtime)

I totally get the appeal of being able to wrap template-types quickly 
and easily. However, to me this idea actually seems a lot harder than 
something which creates new syntax, because you don't distinguish these 
special functions and so they have to work universally as Python 
functions too.

In summary: if it worked it'd be very nice, but I personally don't have 
any idea how you'd implement it within how Cython current works.

David



On 24/02/2021 14:29, Celelibi wrote:
> Le Tue, Feb 23, 2021 at 11:24:42AM -0500, Prakhar Goel a écrit :
>>     I had similar ideas in the past (assuming I understand your proposal). I'd
>>     love it if a decorator could link to some python function. This python
>>     function would get something that represents the cdef function (with the
>>     ast). It would then return a transformed ast that could be spliced into
>>     the original program.
> As I said, I'm not sure allowing AST manipulation would be that useful.
> I mean, it's rarely ever needed in python. Why would it be needed with
> cython?
> However, it would surely make the code much less readable, since the
> code that's executed is not the code that's written.
>
> The use-cases I have in mind are more like these. Which are common
> patterns in python.
>
> Compile-time implementation choice:
>
> if os == "Windows":
> 	cdef thread_something():
> 		# Handle Windows-specific behavior
> else:
> 	cdef thread_something():
> 		# Assume POSIX behavior
>
>
> Decorators on cdef functions:
> def twice(f):
> 	cdef fun(x):
> 		return f(2*x)
> 	return fun
>
> @twice
> cdef foo(x):
> 	# Do something math-y
>
>
>
> Creating cdef classes on demand:
>
> def make_ptr_class(T):
> 	cdef class C:
> 		cdef T *ptr
> 	return C
>
> IntPtr = make_ptr_class(int)
> FloatPtr = make_ptr_class(float)
>
> My current use-case is actually exactly this one. Creating wrappers
> classes for pointer types. Which I currently cannot make both generic
> and type safe.
>
>
> The python code run at compile-time would basically manipulate python
> objects representing cdef functions, classes and C types.
>
> Internally, the way it could be implemented is that cython could
> generate a python program that would produce the AST. But it doesn't
> mean the AST itself has to be visible.
>
> Best regards,
> Celelibi
> _______________________________________________
> cython-devel mailing list
> cython-devel at python.org
> https://mail.python.org/mailman/listinfo/cython-devel




More information about the cython-devel mailing list