#! /usr/bin/env python # -*- coding: utf-8 -*- # vim:fenc=utf-8 # # Copyright © 2017 lafrite # # Distributed under terms of the MIT license. """ Minus MO: take the opposit """ from ..tree import Tree from ..operator import OPERATORS from ..MO.mo import MO, MOnumber, MOstr from ..MO.fraction import MOFraction from .exceptions import MinusError from .arithmetic import lcm def minus(left, right): """ Perform the minusition of left and right :param left: left MO :param right: right MO :returns: Tree or MO >>> a = MOnumber(4) >>> minus(None, a) >>> a = MOnumber(-4) >>> minus(None, a) >>> b = MOnumber(0) >>> minus(None, b) """ if not left is None: raise MinusError(f"'-' is a 1 arity operator, left should be None (got {left})") return MINUSFUNCTIONS[type(right)](right) def monumber(right): """ Minusing monumber :param right: right MOnumber :returns: MONumber >>> a = MOnumber(4) >>> monumber(a) """ return MO.factory(- right.value) def mofraction(right): """ Minusing a mofraction :param right: a mofraction :returns: Tree with the number converted into a mofraction >>> a = MOFraction(6, 5) >>> print(mofraction(a)) - > None > / | > 6 | > 5 >>> a = MOFraction(6, 5, True) >>> print(mofraction(a)) / > 6 > 5 """ if right.negative: return MOFraction(right._numerator, right._denominator) try: if right._numerator < 0: return MOFraction(-right._numerator, right._denominator) except TypeError: pass try: if right._denominator < 0: return MOFraction(right._numerator, -right._denominator) except TypeError: pass return MOFraction(right._numerator, right._denominator, True) # TODO: Faire un décorateur pour un enregistrement automatique |dim. mars 11 18:24:32 EAT 2018 MINUSFUNCTIONS = { MOnumber: monumber, MOFraction: mofraction, } # ----------------------------- # Reglages pour 'vim' # vim:set autoindent expandtab tabstop=4 shiftwidth=4: # cursor: 16 del