Skip to content

Commit 96408e2

Browse files
committed
feat(Imag): impl Imag class
1 parent 454e376 commit 96408e2

File tree

2 files changed

+89
-1
lines changed

2 files changed

+89
-1
lines changed

crates/erg_compiler/context/initialize/classes.rs

Lines changed: 88 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -289,9 +289,96 @@ impl Context {
289289
);
290290
float.register_trait(Float, float_show);
291291

292+
/* Imag */
293+
let mut imag = Self::builtin_mono_class(IMAG, 2);
294+
imag.register_superclass(Complex, &complex);
295+
imag.register_builtin_py_impl(
296+
COMPLEX,
297+
Ratio,
298+
Const,
299+
Visibility::BUILTIN_PUBLIC,
300+
Some(COMPLEX),
301+
);
302+
imag.register_marker_trait(self, mono(NUM)).unwrap();
303+
imag.register_marker_trait(self, mono(ORD)).unwrap();
304+
let mut imag_ord = Self::builtin_methods(Some(mono(ORD)), 2);
305+
imag_ord.register_builtin_erg_impl(
306+
OP_CMP,
307+
fn1_met(Imag, Imag, mono(ORDERING)),
308+
Const,
309+
Visibility::BUILTIN_PUBLIC,
310+
);
311+
imag.register_trait(Imag, imag_ord);
312+
let mut imag_eq = Self::builtin_methods(Some(mono(EQ)), 2);
313+
imag_eq.register_builtin_erg_impl(
314+
OP_EQ,
315+
fn1_met(Imag, Imag, Bool),
316+
Const,
317+
Visibility::BUILTIN_PUBLIC,
318+
);
319+
imag.register_trait(Imag, imag_eq);
320+
let op_t = fn1_met(Imag, Imag, Imag);
321+
let mut imag_add = Self::builtin_methods(Some(poly(ADD, vec![ty_tp(Imag)])), 2);
322+
imag_add.register_builtin_erg_impl(OP_ADD, op_t.clone(), Const, Visibility::BUILTIN_PUBLIC);
323+
imag_add.register_builtin_const(
324+
OUTPUT,
325+
Visibility::BUILTIN_PUBLIC,
326+
ValueObj::builtin_class(Imag),
327+
);
328+
imag.register_trait(Imag, imag_add);
329+
let mut imag_sub = Self::builtin_methods(Some(poly(SUB, vec![ty_tp(Imag)])), 2);
330+
imag_sub.register_builtin_erg_impl(OP_SUB, op_t.clone(), Const, Visibility::BUILTIN_PUBLIC);
331+
imag_sub.register_builtin_const(
332+
OUTPUT,
333+
Visibility::BUILTIN_PUBLIC,
334+
ValueObj::builtin_class(Imag),
335+
);
336+
imag.register_trait(Imag, imag_sub);
337+
let mut imag_mul = Self::builtin_methods(Some(poly(MUL, vec![ty_tp(Imag)])), 2);
338+
imag_mul.register_builtin_erg_impl(OP_MUL, op_t.clone(), Const, Visibility::BUILTIN_PUBLIC);
339+
imag_mul.register_builtin_const(
340+
OUTPUT,
341+
Visibility::BUILTIN_PUBLIC,
342+
ValueObj::builtin_class(Imag),
343+
);
344+
imag_mul.register_builtin_const(
345+
POW_OUTPUT,
346+
Visibility::BUILTIN_PUBLIC,
347+
ValueObj::builtin_class(Imag),
348+
);
349+
imag.register_trait(Imag, imag_mul);
350+
let mut imag_div = Self::builtin_methods(Some(poly(DIV, vec![ty_tp(Imag)])), 2);
351+
imag_div.register_builtin_erg_impl(OP_DIV, op_t, Const, Visibility::BUILTIN_PUBLIC);
352+
imag_div.register_builtin_const(
353+
OUTPUT,
354+
Visibility::BUILTIN_PUBLIC,
355+
ValueObj::builtin_class(Imag),
356+
);
357+
imag_div.register_builtin_const(
358+
MOD_OUTPUT,
359+
Visibility::BUILTIN_PUBLIC,
360+
ValueObj::builtin_class(Imag),
361+
);
362+
imag.register_trait(Imag, imag_div);
363+
let mut imag_mutizable = Self::builtin_methods(Some(mono(MUTIZABLE)), 2);
364+
imag_mutizable.register_builtin_const(
365+
MUTABLE_MUT_TYPE,
366+
Visibility::BUILTIN_PUBLIC,
367+
ValueObj::builtin_class(mono(MUT_IMAG)),
368+
);
369+
imag.register_trait(Imag, imag_mutizable);
370+
let mut imag_show = Self::builtin_methods(Some(mono(SHOW)), 1);
371+
let t = fn0_met(Imag, Str);
372+
imag_show.register_builtin_erg_impl(TO_STR, t, Immutable, Visibility::BUILTIN_PUBLIC);
373+
imag.register_trait(Imag, imag_show);
374+
imag.register_py_builtin(OP_GT, fn1_met(Imag, Imag, Bool), Some(OP_GT), 0);
375+
imag.register_py_builtin(OP_GE, fn1_met(Imag, Imag, Bool), Some(OP_GE), 0);
376+
imag.register_py_builtin(OP_LT, fn1_met(Imag, Imag, Bool), Some(OP_LT), 0);
377+
imag.register_py_builtin(OP_LE, fn1_met(Imag, Imag, Bool), Some(OP_LE), 0);
378+
292379
/* Ratio */
293380
let mut ratio = Self::builtin_mono_class(RATIO, 2);
294-
ratio.register_superclass(Obj, &obj);
381+
ratio.register_superclass(Complex, &complex);
295382
ratio.register_builtin_py_impl(REAL, Ratio, Const, Visibility::BUILTIN_PUBLIC, Some(REAL));
296383
ratio.register_builtin_py_impl(IMAG, Ratio, Const, Visibility::BUILTIN_PUBLIC, Some(IMAG));
297384
ratio.register_marker_trait(self, mono(NUM)).unwrap();

crates/erg_compiler/context/initialize/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,7 @@ const MUT_FLOAT: &str = "Float!";
128128
const EPSILON: &str = "EPSILON";
129129
const REAL: &str = "real";
130130
const IMAG: &str = "imag";
131+
const MUT_IMAG: &str = "imag!";
131132
const FUNC_AS_INTEGER_RATIO: &str = "as_integer_ratio";
132133
const FUNC_CONJUGATE: &str = "conjugate";
133134
const FUNC_IS_INTEGER: &str = "is_integer";

0 commit comments

Comments
 (0)