我有一组重复的样板代码,如下所示:
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)
,但我不能复制这个。有没有办法在这种情况下生成所需的符号?
谢谢。
答案 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)
但这似乎是一个明确的宏应用程序!