Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
wants to merge 2 commits into
base: master
Choose a base branch
from

Conversation

AlexeyMK
Copy link

@AlexeyMK AlexeyMK commented Jun 9, 2015

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
Copy link
Author

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant