2014-10-16 51 views
3

我有一個重複的一組樣板代碼,看起來像這樣:朱莉婭:建築符號表達式

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),但我不能複製這個。有沒有辦法在這種情況下生成所需的符號?

謝謝。

回答

4

更新:原始答案有效(見下文),但是@mlubin指出,QuoteNode是一個內部實現函數。在Base.Metaquot功能更好:

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

回報:(:createObj1)。但我不認爲Meta.quot也有記錄。

原來的答覆: 您正在尋找QuoteNode

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

回報:(:createObj1)但是,這似乎是一個宏觀明確的應用程序!

+0

不錯!有趣的是'QuoteNode'在Julia文檔中不存在 – Mageek 2014-10-16 21:31:50

+0

我碰到它正在玩表達式:'typeof(:(a + b +:c).args [4])'給出'QuoteNode'。這與我所掌握的信息一樣多。 – Gray 2014-10-16 21:34:15

+0

更好的方法是使用''Meta.quot''來替代''QuoteNode'',這是一個Julia內部。 – mlubin 2014-10-17 19:40:21