2016-03-24 12 views
1

Bir docstring'i bir @eval makrosu ile tanımlanan bir işlevle ilişkilendirmeyi deniyorum; Ayrıca, dinamik olarak docstrings oluşturmak için sembolleri kullanmak istiyorum. Ben başarıyla @eval deyimi içinden $name başvuruda mümkün olmakla birlikte@eval ile belgeleme içinde meta programlama

for (f, name) in ((:add, :addition), ...) 
    @eval begin 
     @doc "Documentation for $name" -> 
     function f(args) 
      ## FUNCTION BODY 
     end 
    end 
end 

, ben docstringe kendi içinde $name başvuramaz. UndefVarError: name not defined hatasını verir.

1) Bunu çalışması için bir yolu var mı? @doc kapsamından çıkmak ve çevreleyen alandaki değişkenlere erişmek için birçok yol denedim, ancak başarılı olmadım.

2) -> sözdiziminin yapısı nedir?
Github'dan -> sözdizimini aldım, ancak Julia belgelerinde bundan bahsetmiyorum ve Julia'yı terbiyeli bir süre kullandım, daha önce hiç karşılaşmadım.

+0

gibi bir şey https://groups.google.com/forum/?fromgroups#!searchin/julia görünmelidir -users/docstrings/julia-users/fuEQCbLULSk/e67MVJcWBAAJ – jverzani

cevap

3

@jverzani tarafından bağlı olarak, gereken tüm ek bir $ olduğunu. İfade enterpolasyonu için bir $'a ihtiyaç vardır ve diğeri string enterpolasyonu için gereklidir. @scls bu biraz Julia 0.5 için değiştirilmesi gereken kaydetti

for (f, name) in ((:add, "addition"), (:sub, "subtraction"), ...) 
    @eval begin 
     @doc """ 
     This is the function $($name) 
     """ 
     function $f() 
      ## FUNCTION BODY 
     end 
    end 
end 

Cevabı biliyor kez Süper basit ...

+0

Julia 0.5 'ile (f, name) içinde ((ekle," ekleme "), (: sub," çıkarma ")) @eval başlangıç ​​ @doc "" " Bu, $ ($ name) işlevi " "" işlevi $ f() ## FUNCTION BODY sonuişlevidir.end end 'raises' HATA: LoadError: Geçersiz @var sözdizimi 'Bu işlev'. 'Kaldırılıyor @doc bunu düzelt ... ancak docstring '? Add' görünmez. Herhangi bir fikir? – scls

1

olarak şöyledir: nihai kodudur. dokümanlarınızdan Advanced Usage bölümünden Yukarıdaki örnek şimdi bu yardımcı olabilecek

for (f,n) in ((:foo, "foo"), (:bar, "bar")) 
    @eval begin 
       @doc "This is the function $($n)" $f 
     function $f() 
      println($n) 
     end 
    end 
end 

`` `