FluxML / MacroTools.jl

MacroTools provides a library of tools for working with Julia code and expressions.
https://fluxml.ai/MacroTools.jl/stable/
Other
308 stars 77 forks source link

`isdef`with `quote` seems giving incorrect result #204

Open mmikhasenko opened 1 month ago

mmikhasenko commented 1 month ago

I need to convert a mathematical function in a string into Julia lambda function. Just found the package, it seems very useful.

Just stumbled by a very basic example: expr = :(x -> x + 2) is recognized as a function by isdef, while quote x -> x + 2 end is not recognized.

MWE

julia> expr = quote
    x -> x + 2
end

julia> MacroTools.isdef(expr)
false

julia> eval(expr)(3)
5

julia v1.10 MacroTools v0.5.13

cstjean commented 1 month ago

Ah, that's slightly awkward. On one hand, we could do striplines here (and/or remove the begin block) and it would work fine. On the other hand, expr is technically a block that contains a function definition; not a function definition.

I would lean towards lining up the behaviour with splitdef. Does splitdef(expr) work?

mmikhasenko commented 1 month ago

yes, splitdef works. It correctly identifies the body and args

cstjean commented 1 month ago

Then let's fix isdef! Thank you for the bug report. I think it's basically just to remove the block. There's already a function for it in utils.jl IIRC