nosami / FSharpApiSearch

F# API search engine

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

FSharpApiSearch

F# API Search Engineはシグネチャや名前でF#のAPIを検索できる検索エンジンです。

ベータ版なので仕様が不安定です。

プロジェクト一覧

プロジェクト名 概要
FSharpApiSearch 検索エンジン本体
FSharpApiSearch.Database 検索エンジンのデータベース作成ツール
FSharpApiSearch.Console 検索エンジンのフロントエンド(コンソールアプリケーション)

導入方法

リリースページからzipファイルをダウンロードし、展開してください。

使い方

まず最初にFSharpApiSearch.Database.exeを実行してデータベースを作成します。

FSharpApiSearch.Database.exe

FSharpApiSearch.Console.exeにクエリを与えずに実行するとインタラクティブモードで起動します。 インタラクティブモードを終了するには#qを入力してください。

FSharpApiSearch.Console.exe

引数にクエリを渡すと一度だけ検索を行います。

FSharpApiSearch.Console.exe "int -> int"

デフォルトで検索できるアセンブリはFSharp.CoremscorlibSystemSystem.Coreです。 データベース作成時にアセンブリを指定すると検索対象を追加できます。--libオプションでアセンブリを検索するディレクトリを指定できます。 指定するアセンブリが依存するアセンブリも指定して下さい。

FSharpApiSearch.Database.exe --lib:TargetAssemblyDirectory TargetAssembly1 TargetAssembly2 DependentAssembly

データベースを作成した後、実際に検索で使用するには--targetオプションを使用します。 FSharpApiSearch.Console.exeの--targetオプションを使用するとデータベースを作成したアセンブリを検索対象に指定できます。

FSharpApiSearch.Console.exe --target:TargetAssembly1 --target:TargetAssembly2

--targetオプションを使用するとデフォルトのFSharp.CoremscorlibSystemSystem.Coreは検索対象に含まれなくなるため、 検索対象に含めたい場合は明示的に指定します。

FSharpApiSearch.Console.exe --target:TargetAssembly1 --target:TargetAssembly2 --target:FSharp.Core --target:mscorlib --target:System --target:System.Core

クエリ仕様

基本的にはF# のシグネチャと同じです。FSharpApiSearchの拡張のみ詳細を説明します。 また、> はFSharpApiSearch.Console.exeをインタラクティブモードで起動したときのプロンプトです。

検索可能なAPI

API クエリ例
モジュールの関数と値 int -> string
レコード、構造体のフィールド Ref<'a> => 'a
メソッド、プロパティ 'a list => int
コンストラクタ string -> Uri
型略称 string means System.String
名前 (関数名、メソッド名等) head : 'a list -> 'a
型制約 検索対象に型制約が指定されている場合にエミュレートします

名前検索

name : signatureと書きます。シグネチャを指定しない場合は、シグネチャ部分に_を指定します。

> id : 'a -> 'a
Microsoft.FSharp.Core.Operators.id: 'T -> 'T, module value, distance: 0

> choose : _
Microsoft.FSharp.Collections.Array.choose: ('T -> option<'U>) -> 'T[] -> 'U[], module value, distance: 0
Microsoft.FSharp.Collections.ArrayModule.Parallel.choose: ('T -> option<'U>) -> 'T[] -> 'U[], module value, distance: 0
Microsoft.FSharp.Collections.List.choose: ('T -> option<'U>) -> list<'T> -> list<'U>, module value, distance: 0
Microsoft.FSharp.Collections.Seq.choose: ('T -> option<'U>) -> seq<'T> -> seq<'U>, module value, distance: 0
Microsoft.FSharp.Control.Event.choose: ('T -> option<'U>) -> IEvent<'Del, 'T> -> IEvent<'U>, module value, distance: 0
Microsoft.FSharp.Control.Observable.choose: ('T -> option<'U>) -> IObservable<'T> -> IObservable<'U>, module value, distance: 0

ワイルドカード

通常、'aなどの型変数とintなどの型名はマッチしません。 しかし、どちらのケースもまとめて検索したい場合があります。 このような場合に、ワイルドカード?が使えます。

> ? -> list<?> -> ?
Microsoft.FSharp.Collections.List.Cons: 'T * list<'T> -> list<'T>, static method, distance: 0
Microsoft.FSharp.Collections.List.append: list<'T> -> list<'T> -> list<'T>, module value, distance: 0
Microsoft.FSharp.Collections.List.averageBy: ('T -> 'U) -> list<'T> -> 'U, module value, distance: 0
Microsoft.FSharp.Collections.List.choose: ('T -> option<'U>) -> list<'T> -> list<'U>, module value, distance: 0
Microsoft.FSharp.Collections.List.chunkBySize: int -> list<'T> -> list<list<'T>>, module value, distance: 0
...

また、ワイルドカードに名前を付けることで、同じ名前を持つワイルドカードの位置には同一の型名が入るという条件を追加できます。 例えば、? -> ?は以下のすべての関数にマッチします。

  • 'a -> 'a
  • int -> int
  • 'a -> int
  • int -> string

しかし、?a -> ?aのように名前を付けると、上の例では'a -> intint -> stringにはマッチしなくなります。

メンバ検索

インスタンスメンバ

receiver => signatureと書きます。

メソッドを検索する場合はreceiver => arg -> returnTypeと書きます。

多引数のメソッドを検索するにはreceiver => arg1 -> arg2 -> returnTypeまたはreceiver => arg1 * arg2 -> returnTypeと書きます。 通常ではメソッドの引数がタプル形式(arg1 * arg2)とカリー化形式(arg1 -> arg2)を区別せずに検索します。 引数の形式を区別して検索したい場合はignore-argstyleオプションを無効にします。

プロパティを検索する場合はreceiver => propertyTypeと書きます。 インデックス付きプロパティはreceiver => index -> propertyTypeと書きます。

インスタンスメンバの検索は次の特別規則があります。

  1. arg -> receiver -> returnType という形式の関数にマッチします。
  2. 引数なしの検索(receiver => propertyType)は、receiver => unit -> propertyTypeという形式のインスタンスメソッドともマッチします。

例は次の通りです。

> string => int
System.String.Length: int, instance property with get, distance: 0
Microsoft.FSharp.Core.LanguagePrimitives.ParseInt32: string -> int32, module value, distance: 1
Microsoft.FSharp.Core.String.length: string -> int, module value, distance: 1
System.String.GetHashCode: unit -> int, instance method, distance: 1

System.String.Lengthintを返すプロパティなのでマッチしていますが、 それに加えてMicrosoft.FSharp.Core.String.lengthもマッチしています。 これは、特別規則1に該当するため返されています。

また、System.String.GetHashCodeは特別規則2に該当するため返されています。

静的メンバ

モジュール内の値や関数と同じクエリで検索できます。多引数メソッドはインスタンスメソッドと同様にarg1 -> arg2 -> returnTypeまたはarg1 * arg2 -> returnTypeと書きます。

検索オプション

strictオプション : 厳密な変数

FSharpApiSearch.Console.exeに--strict[+|-]オプションを付けて起動するか、 インタラクティブモードで#strict [enable|disable]を実行すると設定できます。 デフォルトは有効です。

strictオプションが有効の場合は、クエリ中の型変数または名前付きワイルドカードを使用した場合に、違う名前同士が同じ型にマッチしません。 例えば、?a -> ?aというクエリはint -> intというシグネチャにマッチしますが、?a -> ?bというクエリはint -> intにマッチしません。

このオプションに無効にした場合は、?a -> ?bというクエリでint -> intにマッチします。

similarityオプション : 類似検索

FSharpApiSearch.Console.exeに--similarity[+|-]オプションを付けて起動するか、 インタラクティブモードで#similarity [enable|disable]を実行すると設定できます。 デフォルトは無効です。

similarityオプションが有効の場合は、型変数と他の型がそれぞれマッチするようになり、一致度が高い順に並び替えられて表示されます。 また、検索に型制約が考慮されるようになります。

ignore-argstyleオプション : 引数形式を無視

FSharpApiSearch.Console.exeに--ignore-argstyle[+|-]オプションを付けて起動するか、 インタラクティブモードで#ignore-argstyle [enable|disable]を実行すると設定できます。 デフォルトは有効です。

関数、メソッドの引数の形式には、カリー化形式(arg1 -> arg2 -> returnType)とタプル形式(arg1 * arg2 -> returnType)の2種類があります。 ignore-argstyleオプションが有効の場合は、カリー化形式とタプル形式を無視してマッチします。

対応予定のAPI

  • 型名
  • 判別共用体
  • アクティブパターン
  • 関数の型略称
  • 拡張メソッド
  • 測定単位
  • 可視性
  • コンピュテーション式

FSharp.Compiler.Service の制限により対応できないAPI

  • C# で定義されたクラス、構造体のフィールド

動作環境

  • Windows
  • .Net Framework 4.5
  • F# 4.0

使用ライブラリ

About

F# API search engine

License:MIT License


Languages

Language:F# 98.3%Language:C# 1.4%Language:Shell 0.2%Language:Batchfile 0.1%