F# API Search Engine هو محرك بحث يسمح لك بالبحث عن F# APIs عن طريق التوقيع أو الاسم.
اسم المشروع | ملخص |
---|---|
FSharpApiSearch | هيئة محرك البحث |
FSharpApiSearch.Database | أداة إنشاء قاعدة بيانات محرك البحث |
FSharpApiSearch.Console | الواجهة الأمامية لمحرك البحث (تطبيق وحدة التحكم) |
قم بتنزيل الملف المضغوط من صفحة الإصدار واستخرجه.
أولاً، قم بتشغيل FSharpApiSearch.Database.exe لإنشاء قاعدة بيانات.
FSharpApiSearch.Database.exe
التجميعات التي يمكن البحث فيها بشكل افتراضي هي FSharp.Core
، mscorlib
، و System
، و System.Core
. يمكنك إضافة أهداف البحث عن طريق تحديد التجميع عند إنشاء قاعدة بيانات. يمكنك تحديد الدليل للبحث عن التجميعات باستخدام خيار --lib
. الرجاء أيضًا تحديد التجميعات التي يعتمد عليها التجميع المحدد.
FSharpApiSearch.Database.exe --lib:TargetAssemblyDirectory TargetAssembly1 TargetAssembly2 DependentAssembly
إذا قمت بتشغيل FSharpApiSearch.Console.exe دون إعطائه استعلامًا، فسيبدأ في الوضع التفاعلي. اكتب #q
للخروج من الوضع التفاعلي.
FSharpApiSearch.Console.exe
إذا قمت بتمرير استعلام كوسيطة، فسيتم إجراء البحث مرة واحدة فقط.
FSharpApiSearch.Console.exe "int -> int"
استخدم خيار --target
لاستخدام قاعدة البيانات التي تم إنشاؤها فعليًا للبحث.
FSharpApiSearch.Console.exe --target:TargetAssembly1 --target:TargetAssembly2
إذا استخدمت خيار --target
، فلن يتم تضمين FSharp.Core
و mscorlib
و System
و System.Core
الافتراضية في هدف البحث، لذلك إذا كنت تريد تضمينها في هدف البحث، فحددها بشكل صريح.
FSharpApiSearch.Console.exe --target:TargetAssembly1 --target:TargetAssembly2 --target:FSharp.Core --target:mscorlib --target:System --target:System.Core
respect-name-difference
إذا تم تمكين خيار respect-name-difference
، فإن البحث يحترم الاختلافات في أسماء متغيرات النوع المختلفة وأحرف البدل المسماة في الاستعلام. الأسماء المختلفة لا تتطابق مع نفس النوع. على سبيل المثال، الاستعلام ?a -> ?a
يطابق التوقيع int -> int
, لكن الاستعلام ?a -> ?b
لا يطابق int -> int
.
إذا تم تعطيل هذا الخيار، فإن الاستعلام ?a -> ?b
سيطابق int -> int
.
greedy-matching
إذا تم تمكين خيار greedy-matching
، فستتم مطابقة متغيرات النوع والأنواع الأخرى بشكل فردي، وسيتم فرز النتائج وعرضها بترتيب تنازلي للمطابقة. كما يتم الآن أخذ قيود الكتابة في الاعتبار في عمليات البحث.
ignore-param-style
هناك نوعان من تنسيقات الوسائط للوظائف والأساليب: التنسيق المتعرج ( arg1 -> arg2 -> returnType
) وتنسيق tuple ( arg1 * arg2 -> returnType
). إذا تم تمكين خيار ignore-param-style
، فإن المطابقة تتجاهل التنسيقات المتعرجة والصفوف.
ignore-case
إذا تم تمكين خيار ignore-case
، فسيتم تجاهل الحالة عند مطابقة أسماء API وأسماء النوع.
substring
إذا تم تمكين خيار substring
، فسيتم البحث حسب السلسلة الفرعية.
swap-order
إذا تم تمكين خيار swap-order
، فسيقوم البحث بتبديل ترتيب الوسائط والصفوف. على سبيل المثال، الاستعلام a -> b -> c
يطابق b -> a -> c
.
complement
إذا تم تمكين الخيار complement
، فسيتم إكماله والبحث عن الوسائط المفقودة وعناصر المجموعة. على سبيل المثال، الاستعلام a * c
يطابق a * b * c
.
single-letter-as-variable
إذا تم تمكين خيار single-letter-as-variable
، فسيتم التعامل مع أسماء الأنواع ذات الحرف المفرد كأسماء متغيرات الكتابة. على سبيل المثال، t list
هي نفسها 't list
.
language
يقوم بتبديل الاستعلامات وعمليات البحث وعرض النتائج إلى لغة البرمجة المحددة بواسطة خيار language
. يقبل هذا الخيار F# وC#.
xmldoc
إذا تم تمكين خيار xmldoc
، فسيتم عرض مستندات XML في نتائج البحث.
استعلامات F# هي في الأساس نفس توقيعات F#. سيتم شرح امتداد FSharpApiSearch فقط بالتفصيل.
>
هي المطالبة عند بدء تشغيل FSharpApiSearch.Console.exe في الوضع التفاعلي.
واجهة برمجة التطبيقات | مثال الاستعلام |
---|---|
وظائف وقيم الوحدة | int -> string |
سجل، مجال الهيكل | Ref<'a> -> 'a |
اتحاد التمييز | 'a -> Option<'a> |
عضو | 'a list -> int |
منشئ | Uri : _ Uri.new : _ Uri..ctor : _ |
الاسم (اسم الوظيفة، اسم العضو، وما إلى ذلك) | head : 'a list -> 'a head |
نمط نشط | (||) : ... -> Expr -> ? |
أنواع، اكتب الاختصارات، والوحدات | List<'T> |
التعبير الحسابي | { let! } : Async<'T> |
بحث النوع الفرعي | #seq<'a> -> 'a |
للبحث بالاسم اكتب name : signature
أو name
. إذا لم تحدد توقيعًا، فحدد _
في جزء التوقيع.
> id : 'a -> 'a
Microsoft.FSharp.Core.Operators.id: 'T -> 'T, module value, FSharp.Core
> choose
Microsoft.FSharp.Collections.Array.Parallel.choose: ('T -> option<'U>) -> 'T[] -> 'U[], module value, FSharp.Core
Microsoft.FSharp.Collections.Array.choose: ('T -> option<'U>) -> 'T[] -> 'U[], module value, FSharp.Core
Microsoft.FSharp.Collections.List.choose: ('T -> option<'U>) -> list<'T> -> list<'U>, module value, FSharp.Core
Microsoft.FSharp.Collections.Seq.choose: ('T -> option<'U>) -> seq<'T> -> seq<'U>, module value, FSharp.Core
Microsoft.FSharp.Control.Event.choose: ('T -> option<'U>) -> IEvent<'Del, 'T> -> IEvent<'U>, module value, FSharp.Core
when 'Del : delegate and 'Del :> Delegate
Microsoft.FSharp.Control.Observable.choose: ('T -> option<'U>) -> IObservable<'T> -> IObservable<'U>, module value, FSharp.Core
> choose : _
Microsoft.FSharp.Collections.Array.Parallel.choose: ('T -> option<'U>) -> 'T[] -> 'U[], module value, FSharp.Core
Microsoft.FSharp.Collections.Array.choose: ('T -> option<'U>) -> 'T[] -> 'U[], module value, FSharp.Core
Microsoft.FSharp.Collections.List.choose: ('T -> option<'U>) -> list<'T> -> list<'U>, module value, FSharp.Core
Microsoft.FSharp.Collections.Seq.choose: ('T -> option<'U>) -> seq<'T> -> seq<'U>, module value, FSharp.Core
Microsoft.FSharp.Control.Event.choose: ('T -> option<'U>) -> IEvent<'Del, 'T> -> IEvent<'U>, module value, FSharp.Core
when 'Del : delegate and 'Del :> Delegate
Microsoft.FSharp.Control.Observable.choose: ('T -> option<'U>) -> IObservable<'T> -> IObservable<'U>, module value, FSharp.Core
استخدم العلامة النجمية ( *
) للبحث عن التطابقات الجزئية. على سبيل المثال، FSharp.Core.String.* : _
يعرض كافة واجهات برمجة التطبيقات الخاصة بوحدة FSharp.Core.String
.
> FSharp.Core.String.* : _
Microsoft.FSharp.Core.String.collect: (char -> string) -> string -> string, module value, FSharp.Core
Microsoft.FSharp.Core.String.concat: string -> seq<string> -> string, module value, FSharp.Core
Microsoft.FSharp.Core.String.exists: (char -> bool) -> string -> bool, module value, FSharp.Core
Microsoft.FSharp.Core.String.filter: (char -> bool) -> string -> string, module value, FSharp.Core
...
عادةً، اكتب المتغيرات مثل 'a
وأسماء النوع مثل int
غير متطابقة. ومع ذلك، قد ترغب في البحث عن كلتا الحالتين في وقت واحد. في مثل هذه الحالات، يمكنك استخدام حرف البدل ?
_
.
> ? -> list<?> -> ?
Microsoft.FSharp.Collections.List.append: list<'T> -> list<'T> -> list<'T>, module value, FSharp.Core
Microsoft.FSharp.Collections.List.averageBy: ('T -> 'U) -> list<'T> -> 'U, module value, FSharp.Core
when 'U : (static member op_Addition : 'U * 'U -> 'U) and 'U : (static member DivideByInt : 'U * int -> 'U) and 'U : (static member get_Zero : unit -> 'U)
Microsoft.FSharp.Collections.List.choose: ('T -> option<'U>) -> list<'T> -> list<'U>, module value, FSharp.Core
Microsoft.FSharp.Collections.List.chunkBySize: int -> list<'T> -> list<list<'T>>, module value, FSharp.Core
...
أيضًا، من خلال تسمية أحرف البدل، يمكنك إضافة شرط بأن يظهر نفس اسم النوع في مواضع أحرف البدل بنفس الاسم. على سبيل المثال، ? -> ?
يطابق جميع الوظائف التالية:
'a -> 'a
int -> int
'a -> int
int -> string
ومع ذلك، إذا قمت بتسميته مثل ?a -> ?a
، فلن يتطابق المثال أعلاه مع 'a -> int
أو int -> string
.
يعد البحث عن النوع الفرعي قيدًا يحدد الأنواع المتوافقة مع نوع أساسي محدد أو واجهة محددة.
لاستخدام بحث النوع الفرعي في استعلام، اكتب #type
. يمكنك تحديد اسم النوع واسم الواجهة في جزء type
. لا يمكن تحديد معلمات النوع وأحرف البدل في اسم النوع.
على سبيل المثال، يمكن لـ ? -> #seq<'T>
البحث عن الوظائف التي ترث من seq<'T>
وإرجاع أنواع مثل List<'T>
و IList<'T>
و 'T[]
.
للبحث عن أعضاء المثيل، اكتب receiver -> signature
.
عند البحث عن طريقة، اكتب receiver -> arg -> returnType
.
للبحث عن أساليب متعددة الوسائط، اكتب receiver -> arg1 -> arg2 -> returnType
أو receiver -> arg1 * arg2 -> returnType
. عادةً، يتم البحث عن وسيطات الطريقة دون التمييز بين تنسيق المجموعة ( arg1 * arg2
) والتنسيق المتدرج ( arg1 -> arg2
). إذا كنت تريد البحث حسب تنسيق الوسيطة، فقم بتعطيل خيار ignore-param-style
.
للبحث عن عقار اكتب receiver -> propertyType
. تتم كتابة الخصائص المفهرسة كـ receiver -> index -> propertyType
.
يمكن البحث عن الأعضاء الثابتين بنفس الاستعلامات مثل القيم والوظائف في الوحدات النمطية. تتم كتابة الأساليب متعددة الوسائط مثل أساليب المثيل arg1 -> arg2 -> returnType
أو arg1 * arg2 -> returnType
.
للبحث عن نمط نشط، اكتب (||) : (args ->) inputType -> returnType
. للبحث عن نمط نشط جزئيًا، اكتب (|_|) : (args ->) inputType -> returnType
.
في الجزء inputType
، حدد النوع الذي يعالجه النمط النشط. على سبيل المثال، إذا كنت تريد البحث عن أنماط نشطة لـ Expr
فاكتب (||) : ... -> Expr -> ?
حدد وسيطات النمط النشطة في args
. إذا كنت تريد البحث عن الأنماط النشطة باستخدام الوسائط، فاكتب (||) : arg1 -> arg2 -> inputType -> returnType
. إذا كنت تريد البحث عن أنماط نشطة بدون وسيطات، فاكتب (||) : inputType -> returnType
. إذا كنت تريد البحث دون التمييز بين وجود أو عدم وجود الوسائط، فاستخدم الكلمة الأساسية ...
في جزء الوسيطة واكتب (||) : ... -> inputType -> returnType
.
يحدد الجزء retyrnType
النوع الذي يتم إرجاعه بواسطة الدالة، وهو النمط النشط الفعلي. تختلف قيمة الإرجاع لوظيفة النمط النشط بالنسبة للأنماط الفردية والمتعددة والنشطة جزئيًا. يرجى تحديد أي نوع مطابق، option<_>
, Choice<_,...,_>
. يوصى عادةً باستخدام أحرف البدل ( ?
).
للبحث عن تعبير حسابي، اكتب { syntax } : type
. يتم العثور على منشئ يمكنه التعامل مع بناء الجملة والنوع المحددين.
يمكنك تحديد أي اسم عملية مخصص في syntax
: let!
yield
، yield!
، return
return!
use
use!
if/then
، for
، while
try/with
، try/finally
. إذا كنت تريد تحديد syntax
متعددة، فافصل بينها باستخدام ;
واكتب { s1; s2 } : type
.
استعلامات C# لها بناء جملة مختلف عن توقيعات C#.
واجهة برمجة التطبيقات | مثال الاستعلام |
---|---|
عضو | object -> () -> string string -> int |
منشئ | Uri : _ Uri..ctor : _ |
معلمة النوع | List<T> -> int Dictionary<tkey, tvalue> <TKey, TValue> : Dictionary<TKey, TValue> |
الاسم (اسم العضو، الخ.) | Length : string -> int Length |
قالب | List |
بحث النوع الفرعي | <T> : #IEnumerable<T> -> T |
للبحث عن عضو أو الكتابة بالاسم اكتب name : signature
أو name
. إذا لم تحدد توقيعًا، فحدد _
في جزء التوقيع.
> Length : string -> int
System.String.Length : int, instance property with get, mscorlib
> Length
int Array.Length { get; }, instance property, mscorlib
int BitArray.Length { get; set; }, instance property, mscorlib
long BufferedStream.Length { get; }, instance property, mscorlib
long FileInfo.Length { get; }, instance property, mscorlib
...
> Length : _
int Array.Length { get; }, instance property, mscorlib
int BitArray.Length { get; set; }, instance property, mscorlib
long BufferedStream.Length { get; }, instance property, mscorlib
long FileInfo.Length { get; }, instance property, mscorlib
...
استخدم العلامة النجمية ( *
) للبحث عن التطابقات الجزئية. على سبيل المثال، System.String.* : _
يعرض كافة واجهات برمجة التطبيقات من النوع System.String
.
> System.String.* : _
System.Array.Length : int, instance property with get, mscorlib
System.Collections.BitArray.Length : int, instance property with get set, mscorlib
System.ComponentModel.DataObjectFieldAttribute.Length : int, instance property with get, System
System.ComponentModel.MaskedTextProvider.Length : int, instance property with get, System
...
هناك ثلاثة أنواع من أوصاف معلمات النوع:
شكل | مثال | معلمة النوع | ملاحظات |
---|---|---|---|
<t> : signature | <TKey, TValue> : Dictionary<TKey, TValue> | TKey ، TValue | يمكن استخدام الأحرف الكبيرة في معلمات الكتابة بشكل مطول |
جميع الأحرف الصغيرة | Dictionary<tkey, tvalue> | tkey tvalue | إذا كانت جميع الأحرف صغيرة، فيمكنك حذف الجزء <T> . |
حرف واحد | List<T> -> int | T | إذا كان حرفًا واحدًا، فيمكن حذف الجزء <T> . |
ومع ذلك، حتى لو كانت جميعها بأحرف صغيرة، لا يتم التعامل مع الأنواع المضمنة مثل int وstring كمعلمات كتابة.
لا يلزم أن يتطابق اسم معلمة النوع في الاستعلام مع اسم معلمة النوع الذي يتم البحث عنه. على سبيل المثال، يتطابق الاستعلام List<A>
مع النوع System.Collections.Generics.List<T>
.
عادةً، لا تتطابق معلمات الكتابة مثل T
وأسماء الكتابة مثل int
. ومع ذلك، قد ترغب في البحث عن كلتا الحالتين في وقت واحد. في مثل هذه الحالات، يمكنك استخدام ?
.
> <T> : List<T> -> ? -> int
System.Collections.Generic.List<T>.BinarySearch(T item) : int, instance method, mscorlib
System.Collections.Generic.List<T>.FindIndex(Predicate<T> match) : int, instance method, mscorlib
System.Collections.Generic.List<T>.FindLastIndex(Predicate<T> match) : int, instance method, mscorlib
System.Collections.Generic.List<T>.IndexOf(T item) : int, instance method, mscorlib
...
أيضًا، من خلال تسمية أحرف البدل، يمكنك إضافة شرط يظهر نفس اسم النوع في مواضع أحرف البدل التي تحمل نفس الاسم. على سبيل المثال، ? -> ?
يطابق كل ما يلي:
static T F1<T>(T x)
static int F2 (int x)
static T F3<T>(int x)
static int F4 (string x)
ومع ذلك، إذا قمت بتسميته مثل ?a -> ?a
، فلن يتطابق المثال أعلاه مع F2
أو F4
.
يعد البحث عن النوع الفرعي قيدًا يحدد الأنواع المتوافقة مع نوع أساسي محدد أو واجهة محددة.
لاستخدام بحث النوع الفرعي في استعلام، اكتب #type
. يمكنك تحديد اسم النوع واسم الواجهة في جزء type
. لا يمكن تحديد معلمات النوع وأحرف البدل في اسم النوع.
على سبيل المثال، يمكن لـ <T> : ? -> #IEnumerable<T>
البحث عن الأساليب التي ترث من IEnumerable<T>
وإرجاع أنواع مثل List<T>
و IList<T>
و T[]
.
للبحث عن طريقة، اكتب receiver -> (arg) -> returnType
. تتم كتابة الأساليب متعددة الوسائط كجهاز receiver -> (arg1, arg2) -> returnType
. يمكن حذف الأقواس الموجودة في جزء الوسيطة. إذا كنت تريد البحث عن واجهات برمجة التطبيقات التي لا تحتوي على وسيطات أو تقوم بإرجاع قيم، فاستخدم ()
و void
.
> <T> : List<T> -> T -> int
System.Collections.Generic.List<T>.BinarySearch(T item) : int, instance method, mscorlib
System.Collections.Generic.List<T>.IndexOf(T item) : int, instance method, mscorlib
...
للبحث عن عقار اكتب receiver -> propertyType
. تتم كتابة الخصائص المفهرسة كـ receiver -> index -> propertyType
.
> <T> : List<T> -> int
System.Collections.Generic.List<T>.Capacity : int, instance property with get set, mscorlib
System.Collections.Generic.List<T>.Count : int, instance property with get, mscorlib
...
للبحث عن طريقة، اكتب (arg) -> returnType
. عند البحث عن عقار اكتب propertyType
.
> string -> int
System.Convert.ToInt32(string value) : int, static method, mscorlib
System.Int32.Parse(string s) : int, static method, mscorlib
...
بهذه الطريقة، لا يتم ذكر النوع الذي ينتمي إليه العضو في استعلام العضو الثابت.