@@ -23,6 +23,24 @@ PyJuliaAnyValue_Type() = begin
23
23
ass_subscript = pyjlany_setitem,
24
24
),
25
25
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
+ ),
26
44
methods = [
27
45
(name = " __dir__" , flags = Py_METH_NOARGS, meth = pyjlany_dir),
28
46
(name = " _repr_mimebundle_" , flags = Py_METH_VARARGS | Py_METH_KEYWORDS, meth = pyjlany_repr_mimebundle),
@@ -458,3 +476,79 @@ pyjlany_help(xo::PyPtr, ::PyPtr) =
458
476
PyErr_SetJuliaError (err)
459
477
PyNULL
460
478
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