2016-03-24 12 views
1

@evalマクロで定義された関数にドキュメントストリングを関連付けようとしています。また、シンボルを使ってドキュメントストリングを動的に生成したいと思っています。@evalを使用してdocstring内でメタプログラミングする

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

私は成功し@evalステートメント内から$nameを参照することができますが、私はドキュメンテーション文字列自体から$nameを参照することはできません。エラーUndefVarError: name not definedが返されます。

1)これを動作させる方法はありますか?私は@docスコープから抜け出し、周囲のスコープの変数にアクセスするためにいくつかの方法を試しましたが、成功しませんでした。

2)->構文の性質は何ですか?
私はGithubから->という構文を得ましたが、Juliaのドキュメントでそれについては言及されていませんし、Juliaを使い慣れていても、私は前に遭遇しませんでした。

+0

ようになるはずです(:追加、追加)、(:サブ、 "減算"))のためのジュリア0.5 'で) @eval begin @doc - ユーズ/ docstrings/julia-users/fuEQCbLULSk/e67MVJcWBAAJ – jverzani

答えて

3

@jverzaniにリンクされているため、必要なものはすべて$です。式補間には$が必要で、もう1つは文字列補間に必要です。次のように最終的なコードは次のとおりです。

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

スーパーシンプルなあなたが答えを知っていれば...

+0

"" " これは関数$($ name) " "" 関数$ f() ##機能体系 終了 end end' raise 'ERROR:LoadError:無効な@var構文'これは関数 'です。' @docを削除するとこれを修正しますが、docstring '?add'は表示されません。何か案が? – scls

1

@sclsが、これは少しジュリア0.5用に変更する必要が指摘したように。ドキュメントのAdvanced Usageセクション上記の例から、今これはhttps://groups.google.com/forum/?fromgroups#!searchin/juliaを助けるかもしれない

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

`` `

関連する問題