朱莉娅:建立符号表达式

时间:2014-10-16 19:38:08

标签: metaprogramming julia

我有一组重复的样板代码,如下所示:

type Object
    ptr::Ptr{Void}

    function Object()
        ptr = ccall( (:createObject, LIB_SMILE), Ptr{Void}, ())
        smart_p = new(ptr)
        finalizer(smart_p, obj -> ccall( (:freeObject, LIB_SMILE), Void, (Ptr{Void},), obj.ptr ))
        smart_p
    end
end

我想自动生成一组这些类型定义:

for str = ("Obj1","Obj2","Obj3")
    op_fname = symbol(str)
    op_create = ???
    op_free   = ???

    @eval begin
        type $op_fname
            ptr::Ptr{Void}

            function ($fname)()
                ptr = ccall( ($op_create, LIB_SMILE), Ptr{Void}, ())
                smart_p = new(ptr)
                finalizer(smart_p, obj -> ccall( ($op_free, LIB_SMILE), Void, (Ptr{Void},), obj.ptr ))
                smart_p
            end
        end
    end
end

我还没想出如何生成正确的"符号符号"对于op_create和op_free。如同,我需要op_create = :(:createObj),但我不能复制这个。有没有办法在这种情况下生成所需的符号?

谢谢。

1 个答案:

答案 0 :(得分:4)

更新:原始答案有效(见下文),但正如@mlubin指出的那样,QuoteNode是一个内部实现功能。 quot中的Base.Meta功能更好:

import Base.Meta.quot
str = "Obj1"
quot(symbol("create$str"))

返回:(:createObj1)。但我不认为Meta.quot也有记录。

原始答案: 您正在寻找QuoteNode

str = "Obj1"
QuoteNode(symbol("create$str"))

返回:(:createObj1)但这似乎是一个明确的宏应用程序!