Python Macros: Use Cases?

后端 未结 17 2282
甜味超标
甜味超标 2021-01-30 18:37

If Python had a macro facility similar to Lisp/Scheme (something like MetaPython), how would you use it?

If you are a Lisp/Scheme programmer, what sorts of things do y

17条回答
  •  轮回少年
    2021-01-30 18:43

    Currently, the only way features can be added to Python the language is through a PEP (Python Enhancement Proposal). This can be slow, and doesn't help you in the cases when you want to add a feature to the language that is only useful for your use case.

    For example, there's a PEP to add a do-while loop. This will probably be added to Python, but the PEP was created in 2003. I'd like to write do-while loops today, and I could do that if Python had macros.

    Similarly, there was a PEP to add labelled break and continue but this was rejected. If labelled break statements would make my code clearer, I could implement them with a macro.

    PEPs aside, I would also like an unless macro. Rather than writing:

    if not is_superman():
        dodge_bullet()
    

    I could write:

    unless is_superman():
        dodge_bullet()
    

    I'd like a case macro (often called cond in Lisp). Rather than writing:

    if x == FOO:
        do_stuff_with_foos()
    elif x == BAR:
        do_stuff_with_bars()
    elif x == BAZ:
        do_stuff_with_bazs()
    

    I could write:

    switch x:
       case FOO:
           do_stuff_with_foos()
       case BAR:
           do_stuff_with_bars()
       case BAZ:
           do_stuff_with_bazs()
    

    These would be straightforward to implement as macros. More complex, useful macros would include:

    • Ruby style string interpolation e.g. "hello there {user}" (probably best implemented as a reader macro)
    • Pattern matching

    Currently, these are only features in other languages. With macros, I could add them to Python. I could even write PEPs that included an example implementation. (Some PEPs already do this, but they are forced to modify the C source of the interpreter itself.)

提交回复
热议问题