如何避免解析宏中字符串的内容

How to avoid parsing the contents of strings in a macro

我很懒惰,厌倦了使用这样的代码(在 0.4 RC 上)在数据框中选择行:

using DataFrames
data = DataFrame(num=[1,2,3,4], let=["A", "B", "A", "B"])
subset = data[(data[:num].>1)&(data[:let].=="B"),:]

所以我写了下面的宏

# Need to import SubstitutionString from Base
macro sel(dt, conditions) 
    dtstr=string(dt)
    str = string(conditions)
    out_str = replace(str, r":\w+",SubstitutionString(string(dtstr, "[", "\g<0>", "]"))) 
    out_str = string(dtstr, "[", out_str, ",:]")
    eval(parse(out_str))
end

这样我就可以写

subset = @sel data (:num.>1)&(:let.=="B")

这很好用,除非我想将列与 "Turtles::Leonardo" 或“12:25:00”等字符串匹配。有什么方法可以避免在此处将字符串的内容错误地识别为列名,或者这是这种草率的转换为字符串并在该元编程上工作的限制?

有帮助吗?

out_str = replace(str, r"(\()(:\w)",SubstitutionString(string(dtstr, "[", "\g<2>", "]"))) 

您还可以查看 DataFramesMeta,您可以在其中找到一个类似的宏,它应该适用于您提到的有问题的情况。宏是这样工作的:

subset = @where(data, (:num.>1)&(:let.=="B"))