[Python-ideas] unify usage of mutable and immutable objects

语言破碎处 mlet_it_bew at 126.com
Tue Feb 28 08:59:51 EST 2017

    I write a '<'-based immutable set class.
    But it is quit different from the standard set class.
    I wish collections.abc.Set be more friendly to immutable tree sets or
    Python add new syntax to unify such difference.

good example:
    a = []
    a += a  # "a" is the original list

    a = ()
    a += a  # "a" is a new tuple

bad example:
    a = set()
    a.add(1)        # return None; "a" changed
    e = a.pop();

    a = frozen_tree_set()
    a = a.add(1)    # return another set;
    e, a = a.ipop() # return two objects instead of one!

solution I used:
    a <<= 1         # <==> a = a.add(1)
    but "a.ipop()" ....
my current solution is to write a wrapper class
    to turn immutable set into mutable set,
    but it is so noisy to box and unbox.

solution that I wish:
    a :=.add(1)      # "=." mimic "+="; return the result object
    e ~ a :=.pop()

    d[key] :=.add(1) # in dict

if only python add following features:
1) modify the original object
        1) define:
        def .method(self):...
        # "." means "intend to modify self"
        #       return any thing
        # to avoid immutable method
        #       which was intended to return new object
        #       leave self unchanged

        2) invoke:
        r = a..method();
    1-1) ignore result
        # no matter what returned, discard it
        a.-.method();           # <==> [a..method(), None][-1]
    1-2) return self
        # no matter what returned, return self
        a.>.method().>.method();# <==> [a..method(), a..method(), a][-1]

2) create new object
        1) define
        # intend to return (result, new object)
        def ^method():...

        r, a' = a.^method();
    2-1) return other, discard result
        a.-^method().-^method();# <==> a.^method()[1].^method()[1];
    2-2) assign other to original variable
        a=^method();            # <==> a = a.^method()[1];

3) unify both:
    a :=.method();
    # if   defined ".method" then "a..method();"
    # elif defined "^method" then "a = a.^method()[1];"
    # elif defined  "method" then "a.method();"
    # else error

    r ~ a :=.method();
    # if   defined ".method" then "r = a..method();"
    # elif defined "^method" then "r, a = a.^method();"
    # elif defined  "method" then "r = a.method();"
    # else error

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-ideas/attachments/20170228/9c30affa/attachment-0001.html>

More information about the Python-ideas mailing list