Fix builtin types methods

This commit is contained in:
Shunsuke Shibayama 2023-02-03 02:17:44 +09:00
parent 8cdc735486
commit d5e9649172
5 changed files with 107 additions and 101 deletions

View file

@ -10,29 +10,29 @@ class Float(float):
def mutate(self):
return FloatMut(self)
def __add__(self, other):
return then__(super().__add__(other), Float)
return then__(float.__add__(self, other), Float)
def __radd__(self, other):
return then__(super().__radd__(other), Float)
return then__(float.__add__(other, self), Float)
def __sub__(self, other):
return then__(super().__sub__(other), Float)
return then__(float.__sub__(self, other), Float)
def __rsub__(self, other):
return then__(super().__rsub__(other), Float)
return then__(float.__sub__(other, self), Float)
def __mul__(self, other):
return then__(super().__mul__(other), Float)
return then__(float.__mul__(self, other), Float)
def __rmul__(self, other):
return then__(super().__rmul__(other), Float)
return then__(float.__mul__(other, self), Float)
def __div__(self, other):
return then__(super().__div__(other), Float)
return then__(float.__div__(self, other), Float)
def __rdiv__(self, other):
return then__(super().__rdiv__(other), Float)
return then__(float.__div__(other, self), Float)
def __floordiv__(self, other):
return then__(super().__floordiv__(other), Float)
return then__(float.__floordiv__(self, other), Float)
def __rfloordiv__(self, other):
return then__(super().__rfloordiv__(other), Float)
return then__(float.__floordiv__(other, self), Float)
def __pow__(self, other):
return then__(super().__pow__(other), Float)
return then__(float.__pow__(self, other), Float)
def __rpow__(self, other):
return then__(super().__rpow__(other), Float)
return then__(float.__pow__(other, self), Float)
class FloatMut(): # inherits Float
value: Float

View file

@ -14,29 +14,29 @@ class Int(int):
def mutate(self):
return IntMut(self)
def __add__(self, other):
return then__(super().__add__(other), Int)
return then__(int.__add__(self, other), Int)
def __radd__(self, other):
return then__(super().__radd__(other), Int)
return then__(int.__add__(other, self), Int)
def __sub__(self, other):
return then__(super().__sub__(other), Int)
return then__(int.__sub__(self, other), Int)
def __rsub__(self, other):
return then__(super().__rsub__(other), Int)
return then__(int.__sub__(other, self), Int)
def __mul__(self, other):
return then__(super().__mul__(other), Int)
return then__(int.__mul__(self, other), Int)
def __rmul__(self, other):
return then__(super().__rmul__(other), Int)
return then__(int.__mul__(other, self), Int)
def __div__(self, other):
return then__(super().__div__(other), Int)
return then__(int.__div__(self, other), Int)
def __rdiv__(self, other):
return then__(super().__rdiv__(other), Int)
return then__(int.__div__(other, self), Int)
def __floordiv__(self, other):
return then__(super().__floordiv__(other), Int)
return then__(int.__floordiv__(self, other), Int)
def __rfloordiv__(self, other):
return then__(super().__rfloordiv__(other), Int)
return then__(int.__floordiv__(other, self), Int)
def __pow__(self, other):
return then__(super().__pow__(other), Int)
return then__(int.__pow__(self, other), Int)
def __rpow__(self, other):
return then__(super().__rpow__(other), Int)
return then__(int.__pow__(other, self), Int)
class IntMut(): # inherits Int
value: Int

View file

@ -1,5 +1,6 @@
from _erg_result import Error
from _erg_int import Int, IntMut
from _erg_int import Int
from _erg_int import IntMut # don't unify with the above line
from _erg_control import then__
class Nat(Int):

View file

@ -20,13 +20,13 @@ class Str(str):
def to_int(self):
return Int(self) if self.isdigit() else None
def __add__(self, other):
return then__(super().__add__(other), Str)
return then__(str.__add__(self, other), Str)
def __radd__(self, other):
return then__(super().__radd__(other), Str)
return then__(str.__add__(other, self), Str)
def __mul__(self, other):
return then__(super().__mul__(other), Str)
return then__(str.__mul__(self, other), Str)
def __mod__(self, other):
return then__(super().__mod__(other), Str)
return then__(str.__mod__(other, self), Str)
class StrMut(): # Inherits Str
value: Str

View file

@ -305,56 +305,79 @@ impl ScriptGenerator {
.replace("from _erg_range import Range", "")
.replace("from _erg_result import Error", "")
.replace("from _erg_result import is_ok", "")
.replace("from _erg_control import then__", "")
}
fn load_namedtuple(&mut self) {
self.prelude += "from collections import namedtuple as NamedTuple__\n";
}
// TODO: name escaping
fn load_range_ops(&mut self) {
self.prelude += &Self::replace_import(include_str!("lib/std/_erg_result.py"));
self.prelude += &Self::replace_import(include_str!("lib/std/_erg_int.py"));
self.prelude += &Self::replace_import(include_str!("lib/std/_erg_nat.py"));
self.prelude += &Self::replace_import(include_str!("lib/std/_erg_str.py"));
self.prelude += &Self::replace_import(include_str!("lib/std/_erg_range.py"));
}
fn load_in_op(&mut self) {
self.prelude += &Self::replace_import(include_str!("lib/std/_erg_result.py"));
self.prelude += &Self::replace_import(include_str!("lib/std/_erg_range.py"));
self.prelude += &Self::replace_import(include_str!("lib/std/_erg_in_operator.py"));
}
fn load_mutate_op(&mut self) {
self.prelude += &Self::replace_import(include_str!("lib/std/_erg_mutate_operator.py"));
}
fn load_builtin_types(&mut self) {
if self.range_ops_loaded {
self.prelude += &Self::replace_import(include_str!("lib/std/_erg_array.py"));
} else if self.in_op_loaded {
self.prelude += &Self::replace_import(include_str!("lib/std/_erg_int.py"));
self.prelude += &Self::replace_import(include_str!("lib/std/_erg_nat.py"));
self.prelude += &Self::replace_import(include_str!("lib/std/_erg_bool.py"));
self.prelude += &Self::replace_import(include_str!("lib/std/_erg_str.py"));
self.prelude += &Self::replace_import(include_str!("lib/std/_erg_array.py"));
} else {
self.prelude += &Self::replace_import(include_str!("lib/std/_erg_result.py"));
self.prelude += &Self::replace_import(include_str!("lib/std/_erg_int.py"));
self.prelude += &Self::replace_import(include_str!("lib/std/_erg_nat.py"));
self.prelude += &Self::replace_import(include_str!("lib/std/_erg_bool.py"));
self.prelude += &Self::replace_import(include_str!("lib/std/_erg_str.py"));
self.prelude += &Self::replace_import(include_str!("lib/std/_erg_array.py"));
fn load_namedtuple_if_not(&mut self) {
if !self.namedtuple_loaded {
self.prelude += "from collections import namedtuple as NamedTuple__\n";
self.namedtuple_loaded = true;
}
}
fn load_builtin_controls(&mut self) {
self.prelude += include_str!("lib/std/_erg_control.py");
// TODO: name escaping
fn load_range_ops_if_not(&mut self) {
if !self.range_ops_loaded {
self.prelude += &Self::replace_import(include_str!("lib/std/_erg_result.py"));
self.prelude += &Self::replace_import(include_str!("lib/std/_erg_int.py"));
self.prelude += &Self::replace_import(include_str!("lib/std/_erg_nat.py"));
self.prelude += &Self::replace_import(include_str!("lib/std/_erg_str.py"));
self.prelude += &Self::replace_import(include_str!("lib/std/_erg_range.py"));
self.range_ops_loaded = true;
}
}
fn load_convertors(&mut self) {
self.prelude += &Self::replace_import(include_str!("lib/std/_erg_convertors.py"));
fn load_in_op_if_not(&mut self) {
if !self.in_op_loaded {
self.prelude += &Self::replace_import(include_str!("lib/std/_erg_result.py"));
self.prelude += &Self::replace_import(include_str!("lib/std/_erg_range.py"));
self.prelude += &Self::replace_import(include_str!("lib/std/_erg_in_operator.py"));
self.in_op_loaded = true;
}
}
fn load_mutate_op_if_not(&mut self) {
if !self.mutate_op_loaded {
self.prelude += &Self::replace_import(include_str!("lib/std/_erg_mutate_operator.py"));
self.mutate_op_loaded = true;
}
}
fn load_builtin_types_if_not(&mut self) {
if !self.builtin_types_loaded {
self.load_builtin_controls_if_not();
if self.range_ops_loaded {
self.prelude += &Self::replace_import(include_str!("lib/std/_erg_array.py"));
} else if self.in_op_loaded {
self.prelude += &Self::replace_import(include_str!("lib/std/_erg_int.py"));
self.prelude += &Self::replace_import(include_str!("lib/std/_erg_nat.py"));
self.prelude += &Self::replace_import(include_str!("lib/std/_erg_bool.py"));
self.prelude += &Self::replace_import(include_str!("lib/std/_erg_str.py"));
self.prelude += &Self::replace_import(include_str!("lib/std/_erg_array.py"));
} else {
self.prelude += &Self::replace_import(include_str!("lib/std/_erg_result.py"));
self.prelude += &Self::replace_import(include_str!("lib/std/_erg_int.py"));
self.prelude += &Self::replace_import(include_str!("lib/std/_erg_nat.py"));
self.prelude += &Self::replace_import(include_str!("lib/std/_erg_bool.py"));
self.prelude += &Self::replace_import(include_str!("lib/std/_erg_str.py"));
self.prelude += &Self::replace_import(include_str!("lib/std/_erg_array.py"));
}
self.builtin_types_loaded = true;
}
}
fn load_builtin_controls_if_not(&mut self) {
if !self.builtin_control_loaded {
self.prelude += include_str!("lib/std/_erg_control.py");
self.builtin_control_loaded = true;
}
}
fn load_convertors_if_not(&mut self) {
if !self.convertors_loaded {
self.prelude += &Self::replace_import(include_str!("lib/std/_erg_convertors.py"));
self.convertors_loaded = true;
}
}
fn escape_str(s: &str) -> String {
@ -455,10 +478,7 @@ impl ScriptGenerator {
&lit.value,
ValueObj::Bool(_) | ValueObj::Int(_) | ValueObj::Nat(_) | ValueObj::Str(_)
) {
if !self.builtin_types_loaded {
self.load_builtin_types();
self.builtin_types_loaded = true;
}
self.load_builtin_types_if_not();
format!("{}({escaped})", lit.value.class())
} else {
escaped
@ -466,10 +486,7 @@ impl ScriptGenerator {
}
fn transpile_record(&mut self, rec: Record) -> String {
if !self.namedtuple_loaded {
self.load_namedtuple();
self.namedtuple_loaded = true;
}
self.load_namedtuple_if_not();
let mut attrs = "[".to_string();
let mut values = "(".to_string();
for mut attr in rec.attrs.into_iter() {
@ -494,10 +511,7 @@ impl ScriptGenerator {
fn transpile_binop(&mut self, bin: BinOp) -> String {
match bin.op.kind {
TokenKind::Closed | TokenKind::LeftOpen | TokenKind::RightOpen | TokenKind::Open => {
if !self.range_ops_loaded {
self.load_range_ops();
self.range_ops_loaded = true;
}
self.load_range_ops_if_not();
let mut code = match bin.op.kind {
TokenKind::Closed => "ClosedRange(",
TokenKind::LeftOpen => "LeftOpenRange(",
@ -513,10 +527,7 @@ impl ScriptGenerator {
code
}
TokenKind::InOp => {
if !self.in_op_loaded {
self.load_in_op();
self.in_op_loaded = true;
}
self.load_in_op_if_not();
let mut code = "in_operator(".to_string();
code += &self.transpile_expr(*bin.lhs);
code.push(',');
@ -540,10 +551,7 @@ impl ScriptGenerator {
fn transpile_unaryop(&mut self, unary: UnaryOp) -> String {
let mut code = "".to_string();
if unary.op.kind == TokenKind::Mutate {
if !self.mutate_op_loaded {
self.load_mutate_op();
self.mutate_op_loaded = true;
}
self.load_mutate_op_if_not();
code += "mutate_operator(";
} else {
code += "(";
@ -558,17 +566,14 @@ impl ScriptGenerator {
match acc {
Accessor::Ident(ident) => {
match &ident.inspect()[..] {
"Str" | "Bool" | "Nat" | "Array" if !self.builtin_types_loaded => {
self.load_builtin_types();
self.builtin_types_loaded = true;
"Str" | "Bool" | "Nat" | "Array" => {
self.load_builtin_types_if_not();
}
"if" | "if!" | "for!" | "while" | "discard" if !self.builtin_control_loaded => {
self.load_builtin_controls();
self.builtin_control_loaded = true;
"if" | "if!" | "for!" | "while" | "discard" => {
self.load_builtin_controls_if_not();
}
"int" | "nat" if !self.convertors_loaded => {
self.load_convertors();
self.convertors_loaded = true;
"int" | "nat" | "float" | "str" => {
self.load_convertors_if_not();
}
_ => {}
}