KinkのドキュメンテーションシステムをKinkで作りました。Javadocとかgodocみたいなやつです。
いずれ 1) JSON出力 2) JSONから各種フォーマットへの変換 の2つに分けるつもりですが、今はまだJSONモジュールがないので、Sphinx用の.rstファイルを直接出力しています。
最終的な結果はこんな感じ。
http://doc.kink-lang.org/manual/api/kink-NUM.html
元となるソースは、典型的にはこんな感じ
## # Companion mod for atomic vals. :JAVA.require_from('kink/host_lang/java/') :AtomicReference_class <- JAVA.class('java.util.concurrent.atomic.AtomicReference') :Object_class <- JAVA.class('java.lang.Object') ## type atomic # # An atomic is a container of a single val, which provides serialization of # data access among multiple threads, # and atomic operations such as compare-and-set. # # Example: # # :ATOMIC.require_from('kink/thread/') # :THREAD.require_from('kink/thread/') # # # atomic reference with 0 as the initial val # :Counter <- ATOMIC.new(0) # # # thread-safe counter # :make_uniq_num <- {() # [:Cur :Next] = Counter.update{(:N) N + 1 } # Cur # } # # get, set, and compare_and_set operations are serialized for a single atomic. :Atomic_trait <- [ ## Atomic.get # # Atomic.get returns the val contained in the Atomic reference. 'get' {[:A]() A.Ref.call_method('get').unwrap } ...
「メソッド」や「型」に相当する要素が言語仕様上存在せず、静的解析では見出しが決定できないので、自分で書く必要があります。本文については、行頭の空白が3文字以上のブロックをコードとみなします。
他にマークアップ要素はありません。個条書きしたければ「•」とか「1)」とか自分で書いてください、という設計です。このあたりはgodocの影響を強く受けています。
データモデルはこんな感じ。