lihaoyi / macropy

Macros in Python: quasiquotes, case classes, LINQ and more!
3.28k stars 176 forks source link

New base macro: d, for dictionary literal shorthand #66

Open AlexeyMK opened 9 years ago

AlexeyMK commented 9 years ago

Adding support for CoffeeScript/ES6-style dictionaries in python.

Example & Explanation

name = "Bob"
age = 24

# traditional python ways
person = {"name": name, "age": age, "version": 1}
person2 = dict(name=name, age=age, version=2)

But in CoffeeScript, you can just do

cs_person = {name, age, version: "cs"}

The feature is known as the Object Literal Property Value Shorthand, and is coming to Javascript as of ES6

Now you can use it in python, too, with MacroPy.

from macropy.d import macros, d

person3 = d(name, age, version=3)
> {"name": "Bob", "age": 24, version: 3}  

Implementation

This was a bit of a pain to implement without MacroPy, since the Python call stack doesn't include the expressions passed, and inspect is slow.

Even with MacroPy, without forking the project I'd need to use a lookup and a slice, a la

d[dict(name, age, version=3)]
# or, and I thought this was clever
d[ct(name, age, version=3)]

I showed d[ct to an unbiased python programmer and they said versions 1/2 looked way cleaner and they'd probably not use it. Fair enough. So I needed to make d(...) work directly.

I ended up needing to fork and slightly modify MacroPy to support changing the syntax tree to support function calls. Hopefully this is an acceptable addition.

AlexeyMK commented 9 years ago

Let me know if this looks interesting, @lihaoyi, and I'll get some tests & more documentation as well.