@@ -23,6 +23,24 @@ PyJuliaAnyValue_Type() = begin
2323 ass_subscript = pyjlany_setitem,
2424 ),
2525 as_sequence = (contains = pyjlany_contains,),
26+ as_number = (
27+ positive = pyjlany_positive,
28+ negative = pyjlany_negative,
29+ absolute = pyjlany_absolute,
30+ power = pyjlany_power,
31+ add = pyjlany_binop (+ ),
32+ subtract = pyjlany_binop (- ),
33+ multiply = pyjlany_binop (* ),
34+ truedivide = pyjlany_binop (/ ),
35+ divmod = pyjlany_binop ((x, y) -> (fld (x, y), mod (x, y))),
36+ floordivide = pyjlany_binop (fld),
37+ remainder = pyjlany_binop (mod),
38+ lshift = pyjlany_binop (<< ),
39+ rshift = pyjlany_binop (>> ),
40+ and = pyjlany_binop (& ),
41+ xor = pyjlany_binop (xor),
42+ or = pyjlany_binop (| ),
43+ ),
2644 methods = [
2745 (name = " __dir__" , flags = Py_METH_NOARGS, meth = pyjlany_dir),
2846 (name = " _repr_mimebundle_" , flags = Py_METH_VARARGS | Py_METH_KEYWORDS, meth = pyjlany_repr_mimebundle),
@@ -458,3 +476,79 @@ pyjlany_help(xo::PyPtr, ::PyPtr) =
458476 PyErr_SetJuliaError (err)
459477 PyNULL
460478 end
479+
480+ pyjlany_positive (xo:: PyPtr ) =
481+ try
482+ PyObject_From (+ (PyJuliaValue_GetValue (xo)))
483+ catch err
484+ PyErr_SetJuliaError (err)
485+ PyNULL
486+ end
487+
488+ pyjlany_negative (xo:: PyPtr ) =
489+ try
490+ PyObject_From (- (PyJuliaValue_GetValue (xo)))
491+ catch err
492+ PyErr_SetJuliaError (err)
493+ PyNULL
494+ end
495+
496+ pyjlany_absolute (xo:: PyPtr ) =
497+ try
498+ PyObject_From (abs (PyJuliaValue_GetValue (xo)))
499+ catch err
500+ PyErr_SetJuliaError (err)
501+ PyNULL
502+ end
503+
504+ struct pyjlany_binop{F}
505+ f:: F
506+ end
507+ (f:: pyjlany_binop )(xo:: PyPtr , yo:: PyPtr ) = begin
508+ PyJuliaValue_Check (xo) || return PyNotImplemented_New ()
509+ PyJuliaValue_Check (yo) || return PyNotImplemented_New ()
510+ x = PyJuliaValue_GetValue (xo)
511+ y = PyJuliaValue_GetValue (yo)
512+ try
513+ PyObject_From (f. f (x, y))
514+ catch err
515+ if err isa MethodError && err. f === f. f
516+ PyNotImplemented_New ()
517+ else
518+ PyErr_SetJuliaError (err)
519+ PyNULL
520+ end
521+ end
522+ end
523+
524+ pyjlany_power (xo:: PyPtr , yo:: PyPtr , zo:: PyPtr ) = begin
525+ PyJuliaValue_Check (xo) || return PyNotImplemented_New ()
526+ PyJuliaValue_Check (yo) || return PyNotImplemented_New ()
527+ x = PyJuliaValue_GetValue (xo)
528+ y = PyJuliaValue_GetValue (yo)
529+ if PyNone_Check (zo)
530+ try
531+ PyObject_From (x^ y)
532+ catch err
533+ if err isa MethodError && err. f === ^
534+ PyNotImplemented_New ()
535+ else
536+ PyErr_SetJuliaError (err)
537+ PyNULL
538+ end
539+ end
540+ else
541+ PyJuliaValue_Check (zo) || return PyNotImplemented_New ()
542+ z = PyJuliaValue_GetValue (zo)
543+ try
544+ PyObject_From (powermod (x, y, z))
545+ catch err
546+ if err isa MethodError && err. f === powermod
547+ PyNotImplemented_New ()
548+ else
549+ PyErr_SetJuliaError (err)
550+ PyNULL
551+ end
552+ end
553+ end
554+ end
0 commit comments