Fable: Fable2の開発を支揎する

䜜成日 2018幎03月21日  Â·  37コメント  Â·  ゜ヌス: fable-compiler/Fable

dev2.0ブランチがすでに助けを求め始めるこずができる状態にあるかどうかはわかりたせんが、ずにかくやりたすwinkそのブランチで起こっおいる䞻な倉曎を以䞋にリストしたす。すぐにテストしお、最初のアルファリリヌスで保留䞭のタスクを確認できたすか。 それらのいずれかを支揎するこずに興味がある堎合は、以䞋にコメントしおください。䞀緒に䜜業するための詳现を提䟛したす💪

䞻な倉曎点の包括的でないリスト

  • Fable ASTには、Fで最も䞀般的な構造リスト、オプション...がいく぀か含たれおいるため、必芁に応じおJSでの衚珟を簡単に倉曎できたす。 たた、ASTはFコンパむラからの型情報を保持するようになりたした。
  • レコヌドず共甚䜓は、JS _classes_ずしおではなく、それぞれプレヌンオブゞェクトず配列ずしおコンパむルされたす。
  • すべおの型メ゜ッドは、ツリヌシェむクずの互換性を高めるためにJSモゞュヌル関数ずしおコンパむルされるようになりたしたJS゚ンゞンがコヌドを最適化するのにも圹立぀こずを願っおいたす。 唯䞀の䟋倖は、プロトタむプにアタッチされおいるオヌバヌラむドメ゜ッドToString、Equalsです。 たた、ネストされたモゞュヌル関数は、名前がマングルされたファむルルヌトモゞュヌルの関数ずしおコンパむルされたす。
  • むンスタンスをむンタヌフェむスにキャストするず、むンタヌフェむス関数を含むオブゞェクトでラップされたす。これにより、むンタヌフェむス間の名前の競合が防止されたすたた、メ゜ッドがプロトタむプにアタッチされなくなったため、むンスタンスも必芁になりたす。
  • Fable-Coreの䞀郚のモゞュヌルリストや配列などがFで蚘述されるようになりたした
  • Fable ASTに適甚される最適化は、 FableTransforms分離パスになりたした。 これにより、コヌドは通垞耇数の堎所で最適化が適甚されるFable 1よりも保守しやすくなりたす特に、Fable 2ではるかにうたく機胜する可胜性のある䞍確実な最適化。 ただし、䞀郚の最適化は、最埌のFable2Babelパスで実行する必芁がありたす。末尟呌び出しず決定朚パタヌンマッチングです。

簡単に詊しおみおください

  • ただ行っおいない堎合は、リポゞトリのクロヌンを䜜成したす
  • git checkout dev2.0
  • cd src/tools
  • bash quicktest.sh --build-core

これにより、同じフォルダヌ内のQuickTest.fsファむルがコンパむルおよび実行されたす。 Fable 2の機胜をテストするための遊び堎ずしお自由に䜿甚しおくださいただし、PRには含めないでください。 2回目は、 src/js/fable-coreファむルが倉曎されおいない堎合は、 bash quicktest.sh実行できたす src/dotnet/Fable.Compilerファむルが倉曎されおいない堎合は、 bash quicktest.sh --no-buildも実行できたすが2.1.300-preview1を䜿甚するず、倉曎なしでプロゞェクトを構築するのは、ずにかく非垞に高速であるはずです。

Windowsでは、Gitbashを䜿甚しおスクリプトを実行できるはずです。

保留䞭のタスク

  • コヌド党䜓にTODO!!!コメントが倚数ありたすが、おそらく自分で凊理する必芁がありたす。

  • プラグむンは最初のアルファリリヌスに含たれないため、テストではExpecto APIを䜿甚するようになりたした。これは、JSテストランナヌずの共有がはるかに簡単です。 私はすでにいく぀かのファむルArithmeticTests、ArrayTests、ListTestsを倉換したしたが、それらのほずんどはただいく぀かの愛を埅っおいたす。 正芏衚珟を䜿甚しおメ゜ッドのシグネチャをtestCaseいたしたが、スクリプトを䜜成するこずをお勧めしたす。 䞻な課題の1぀は、テストが珟圚リスト内の倀である堎合、ファむルの䞭倮に衚瀺される远加の関数を䞀番䞊に移動する必芁があるこずです。これにより、堎合によっおは他の倀がシャドりされる可胜性がありたす。

  • Fable-CoreのSetモゞュヌルずMapモゞュヌルはFに移怍する必芁がありたす。 私は郚分的にSetのためにそれを行いたしたマップは、むンスピレヌションを埗お最初に盗んだFunScriptリポゞトリからも取埗できたす。 それらがJSに正しくコンパむルされおいるこず、パブリック関数名が正しく公開されおいるこず、以前の.tsファむル src/tools/old保存されおいるからメ゜ッドを移怍する必芁があるかどうか、テストが正しく機胜しおいるかどうかを確認する必芁がありたす。 。

  • ASTが倧幅に倉曎されたため、Replacementsモゞュヌルのほずんどを曞き盎す必芁がありたす。 私はすでに玄1000行を実行したしたが、あず1000行ありたす。 これは少し退屈な䜜業ですが、誰かがそれに倢䞭になっおいる堎合は、私に知らせおください。 おそらく最速の方法は、画面共有セッションを開いお䜕をする必芁があるかを瀺し、残りのコヌドを分割しお、より早く終了できるようにするこずです。

最初のアルファリリヌスに含たれないものbigint、reflection、plugins。

今のずころ十分な情報であるこずを願っおいたす。事前にご協力いただきありがずうございたす。

dev2.0 help wanted

最も参考になるコメント

ちなみに、誰かがテストファむルを移怍しおいる堎合は、 SetTests.fsずMapTests.fsを移怍する必芁はありたせん。モゞュヌルの統合をテストするために行いたす。

たた、VSCodeを䜿甚する堎合は、耇数遞択を䜿甚しお、ファむル内ですべおの䜜業を䞀床に実行できたす。 スクリプトを曞くこずは、ここで少し゚ンゞニアリングしすぎおいるようです:)。

2018-04-18 15 14 27

党おのコメント37件

@alfonsogarciacaroSetモゞュヌルずMapモゞュヌルをfable-coreタスクで䜿甚するず思いたす。 ここからむンスピレヌションを埗るこずができるように、ガむダンスを教えおください。たたは、郚分的に移怍されたSet教えおください:)

ただ、リマむンダヌ、私たちからむンスピレヌションを盗んだこずを倚くのレポ取匕があり、

  1. Visualfsharpの公匏コアラむブラリであるマップの実装は、FunScriptの実装ず非垞によく䌌おいたす。
    https://github.com/Microsoft/visualfsharp/blob/master/src/fsharp/FSharp.Core/map.fs
  2. OCaml / BucleScriptの堎合、FずOCamlのコア構文の間に倚くの違いはありたせん。Fに簡単に移怍できるず思いたす。
    https://github.com/BuckleScript/bucklescript/blob/master/jscomp/stdlib/map.ml

ありがずう、@ zaaack。 はい、FunScriptファむルは元々FSharp.Coreから取埗されたした。 叀くなっおいるかどうかはわかりたせんが、すでに機胜しおいるため Map.tsも元々は翻蚳されおいたため、私はそれを奜む傟向がありたす。 JSでの必芁性。 Bucklescriptに぀いおは、モゞュヌルがOCamlの倀であるずいう事実が問題になる可胜性があるかどうかはわかりたせん。たた、FのMapはいく぀かのむンタヌフェむスに準拠する必芁がありたす。最も時間がかかったのは、カスタム比范を䜿甚した型をキヌずしお適切に機胜させるこずです。 OCamlでも倚少違うず思いたす。

ずころで、Bigintは確かにFSharp.Coreから取埗されおいたすが、埌のリリヌスで移怍するず思いたす。

@zaaackに感謝したす。ポヌトで䜜業するずきは、そのこずを念頭に眮いおおきたす。

こんにちはアルフォン゜私はexpectoテストの郚分を手䌝いたいです

それは玠晎らしい@EdouardMです、ありがずう 倉換の倧郚分を自動的に行うスクリプトを䜜成できれば玠晎らしいず思いたす。 必芁に応じお、短い画面共有セッションを行っお、䜕をする必芁があるかを瀺すこずができたす:)

確かに、軌道に乗るには短いキックオフが必芁です。

今倜、パリのマドリッド時間の午埌6時30分からご利甚いただけたすか。
たたは日曜日に

よろしければ、スカむプ通話の招埅状を送っおください。

ありがずう
゚ドゥアヌル

Leven。 23の火星2018幎11時43分à、アルフォン゜・ガルシア・カロ[email protected]
゚クリット

それは玠晎らしい@EdouardMhttps //github.com/edouardm 、ありがずう それは
倉換を最倧限に掻甚するためのスクリプトを曞くこずができれば玠晎らしいです
自動的。 必芁に応じお、短い画面共有セッションを行うこずができたす
䜕をする必芁があるかを瀺しおください:)

—
あなたが蚀及されたのであなたはこれを受け取っおいたす。
このメヌルに盎接返信し、GitHubで衚瀺しおください
https://github.com/fable-compiler/Fable/issues/1370#issuecomment-375619541 、
たたはスレッドをミュヌトしたす
https://github.com/notifications/unsubscribe-auth/AG_t3dil59Mz38u4cCN9f0JEZMyK7OLRks5thNHPgaJpZM4S03ig
。

私のメヌルアドレスはedouardです。 [email protected]

Leven。 23の火星2018幎11時43分à、アルフォン゜・ガルシア・カロ[email protected]
゚クリット

それは玠晎らしい@EdouardMhttps //github.com/edouardm 、ありがずう それは
倉換を最倧限に掻甚するためのスクリプトを曞くこずができれば玠晎らしいです
自動的。 必芁に応じお、短い画面共有セッションを行うこずができたす
䜕をする必芁があるかを瀺しおください:)

—
あなたが蚀及されたのであなたはこれを受け取っおいたす。
このメヌルに盎接返信し、GitHubで衚瀺しおください
https://github.com/fable-compiler/Fable/issues/1370#issuecomment-375619541 、
たたはスレッドをミュヌトしたす
https://github.com/notifications/unsubscribe-auth/AG_t3dil59Mz38u4cCN9f0JEZMyK7OLRks5thNHPgaJpZM4S03ig
。

最初のアルファリリヌスに含たれないものbigint、reflection、plugins。

ただ奜奇心が匷いですが、アルファの埌にこれらのものを含めるためのロヌドマップ/蚈画はありたすか

@jgrund特定のロヌドマップはありたせんが、bigintは簡単に远加できFSharp.Coreからコヌドを移怍するだけ、リフレクションも安定リリヌスの準備ができおいる必芁がありたす。 プラグむンに぀いおは、プラグむンの䜿甚状況に関する情報を収集し、プラグむンをどのように導入するか、たたはプラグむンが必芁かどうかをたずめお決定したいず思いたす。

これをありがずう Git-Bashで機胜させるには、 quicktest.shに小さな倉曎を加える必芁がありたした。
https://github.com/fable-compiler/Fable/blob/07ddd104cbeb6ad7adf98b6600ac3fe4d1fcfd70/src/tools/quicktest.sh#L30 -L33
32行目を次のように倉曎したした。
./quickfsbuild.sh --no-build
そこにあるbash ずにかく必芁ではないず思いたすかが原因で、WSLが代わりに起動しようずしたため、私は蚭定しおいたせん。

こんにちは@EdouardM これは、テストの曎新に぀いおfsharpXで話し合ったこずです。

  • Expecto APIの䜿甚実際にはJSのmochaに倉換されたす
  • 正芏衚珟let ``(.*)``.*=ず眮換testCase "$1" <| fun () ->を䜿甚しお、テストの眲名を倉曎したす
  • 属性[<Test>] 、 [<TestFixture>]削陀したす
  • ファむルをMain.fsprojずtests / Main / Main.fsのallTestsに远加したす
  • テストの途䞭で非同期ず機胜に特別な泚意が必芁です。これに぀いおは埌で説明したす。

@alfonsogarciacaro私はdev2.0ブランチの゜ヌスコヌドを読んでいお、他の2぀が䞡方ずも取られおいるので、残りのReplacement.fsで䜜業するための「クレむゞヌなもの」になろうずしおいたす😄。 叀いReplacement.fsからparse関数を移怍するずきに、いく぀かの問題が発生したした。 parse関数は、FableのFable.ApplyInfoに存圚するreturnType䟝存したす。 1.0ですが、 CallInfoで芋぀かりたせん。これを凊理する方法がわかりたせん。助けおいただけたせんか

これが私のコミットです
https://github.com/fable-compiler/Fable/compare/dev2.0...zaaackdev2.0expand = 1diff-a34e57b30a53951ff9b99ce4076feaa4R1390

それは玠晎らしい@zaaackでしょう、どうもありがずう。 はい、申し蚳ありたせんが、眮換の関数のシグネチャを少し倉曎しお、他のモゞュヌルの関数のように芋せたす。最初の3぀の匕数は通垞、次のようになりたすコンテキストは2番目に続く堎合もありたす。

let myFableHelper (com: ICompiler) (range: SourceLocation option) (typ: Type) ... =

そのため、戻り倀の型および範囲をCallInfoから関数の最初の匕数に移動したした。 let parse com r t info thisArg args =ようなものを䜿甚できたすはい、私は通垞tだけを䜿甚したすが、あたり意味がないこずに同意したす。

私はReplacementsモゞュヌルでも働いおいたす。 他の関数を完了しおいる間、コレクションSeq、List、Arrayに取り組むこずができたすが、どう思いたすか

最近、オプションのパラメヌタヌで静的メンバヌを䜿甚するために、 Helper静的タむプを远加したした。 InstanceCall 、 CoreCall ...ヘルパヌがどのように䜿甚されおいるかを確認するには、既存のコヌドをご芧ください。 その他の泚意事項

  • 埌の段階で行われる䞍確実な最適化のために、匕数の型を正しく枡すこずが重芁です特に関数がある堎合。 匕数が倉曎されおいない堎合は、 CallInfoから盎接枡したす。 そうである堎合は、arg型を再蚈算する必芁がありたす。
  • ThisArgはオプションです。 存圚する堎合は、そもそも合栌したす。 Fable 2では、型むンスタンスメンバヌは実際には静的関数ずしおコンパむルされるため、 thisが匕数ずしお枡されたす。 ArgTypesはThisArgは含たれたせん。
  • ただし、 InstanceCall皮類が指定されおいる堎合、 ThisArg匏は実際のむンスタンス呌び出しずしおコンパむルされたす thisArg.member(arg1, arg2...) 。

今のずころこれで十分です:)質問があれば私に確認しおください。たた、助けおくれおありがずう

迅速で詳现な返信をありがずうございたす。明日詊しおみたす。

私はReplacementsモゞュヌルでも働いおいたす。 他の関数を完了しおいる間、コレクションSeq、List、Arrayに取り組むこずができたすが、どう思いたすか

玠晎らしいです。ほずんどの堎合、平日は2時間、週末は1日を過ごすこずができるず思いたす。

ちなみに、誰かがテストファむルを移怍しおいる堎合は、 SetTests.fsずMapTests.fsを移怍する必芁はありたせん。モゞュヌルの統合をテストするために行いたす。

たた、VSCodeを䜿甚する堎合は、耇数遞択を䜿甚しお、ファむル内ですべおの䜜業を䞀床に実行できたす。 スクリプトを曞くこずは、ここで少し゚ンゞニアリングしすぎおいるようです:)。

2018-04-18 15 14 27

Maximeに感謝したす。テストファむルの倉換を凊理したす。
゚ドゥアヌル

2018幎4月18日15:16、「MaximeMangel」 [email protected]は次のように曞いおいたす。

情報のために、誰かがテストファむルを移怍しおいる堎合は移怍する必芁はありたせん
SetTests.fsずMapTests.fsモゞュヌルの統合をテストするために行いたす。

たた、VSCodeを䜿甚する堎合は、耇数遞択を䜿甚しおすべおの䜜業を行うこずができたす
ファむル内で䞀床に。 スクリプトを曞くこずは、゚ンゞニアリングを少しやり過ぎおいるようです
ここ 。

[画像2018-04-18 15 14 27]
https://user-images.githubusercontent.com/4760796/38934173-59a5fc84-431b-11e8-81be-13f624e72817.gif

—
あなたが蚀及されたのであなたはこれを受け取っおいたす。
このメヌルに盎接返信し、GitHubで衚瀺しおください
https://github.com/fable-compiler/Fable/issues/1370#issuecomment-382382463 、
たたはスレッドをミュヌトしたす
https://github.com/notifications/unsubscribe-auth/AG_t3YjH5jvU1CXc-27gpz4-tGQNC7AHks5tpzyegaJpZM4S03ig
。

こんにちは src / js / fable-core / List.fsに次のメ゜ッドを実装する必芁がありたすJSで配垃されたすが、Fファむルであるこずに泚意しおください。

  • [x]切り捚お
  • [x]連結
  • [] findBack
  • [] findIndexBack
  • [] tryFindBack
  • [] tryFindIndexBack
  • [x]むンデックス付き
  • [] mapFold
  • [] mapFoldBack
  • [x] tryItem
  • [x]展開
  • [x] splitAt

これらは実装されおいたすが、テストは合栌しおいたせん。

  • [x] foldBack2
  • [x]パヌティション

Fableは远加の匕数ずしおIEqualityComparerを挿入する必芁があるため、これらは少し特殊です。 私は自分でそれを行うこずができたすが、あなたが十分に勇敢であるならば、あなたは䟋ずしおsortを取るこずができたす

  • [x]明確
  • [x] distinctBy
  • [] groupBy
  • [] countBy
  • []が含たれおいたす
  • [ ] それ倖

倱敗したテストをQuickTest.fsファむルに入れたので、Fable + fable-coreを再コンパむルしお、次のように入力するだけでテストを実行できるはずです。

cd src/tools
sh quicktest.sh --build-core

ボランティアはいたすか ;@ valery-vitko @zaaack

今週末に䜕ができるか芋おいきたす。

残念ながら、私は今埌数週間は満員です。 そしおほずんどの堎合、プログラミングに関連しないものがありたす😢。 みんな、私なしで楜しんでください。

1405のpartitionずfoldBack2を修正したした。
truncateずindexedを実行しお、他のいく぀かの簡単な機胜を実行しおみたす。

unfold 、 tryItem 、 splitAt 、 concat実装したした。

やあ 䞊蚘のリストにはただいく぀かの欠萜しおいるメ゜ッド

@alfonsogarciacaro党郚取られたず思っおすみたせん、残りは取りたす。

PR https 

メ゜ッドずむンタヌフェヌスを扱う新しい方法を怜蚎する質問。 以䞋はどのように凊理されたすか

type Base () =
  abstract M: unit -> string
  default __.M () = "base"

type A () =
  inherit Base ()
  member __.M () = "a" // NOTE: Not override, hides parent M

type B () =
  inherit Base ()
  override __.M () = "b"

let a = A ()
let b = B ()

printfn "%s" <| (a :> Base).M ()
printfn "%s" <| (b :> Base).M ()

Fable 2は、モゞュヌル関数ずしお独自のメンバヌを実装し、コンパむル時に参照を解決したす。 ただし、仮想メ゜ッドはJSプロトタむプにアタッチされおいるため、オブゞェクトをアップキャストした埌でも呌び出すこずができたす。 したがっお、このわずかに拡匵されたバヌゞョンのコヌドオブゞェクトが芪メンバヌを呌び出す方法を瀺すため

type Base () =
  abstract M: unit -> string
  default __.M () = "base"

type A () =
  inherit Base ()
  member __.M () = base.M() + " + a" // NOTE: Not override, hides parent M

type B () = 
  inherit Base ()
  override __.M () = base.M() + " + b"

let a = A ()
let b = B ()

printfn "A:        %s" <| a.M ()
printfn "A upcast: %s" <| (a :> Base).M ()
printfn "B:        %s" <| b.M ()
printfn "B upcast: %s" <| (b :> Base).M ()

最新のdotnet-fable2.0.0-alphaでコンパむルするず、次のようになりたす。

function Base() {}

function Base$$$$002Ector() {
  return this != null ? Base.call(this) : new Base();
}

Base.prototype.M = function () {
  return "base";
};

function A() {
  Base$$$$002Ector.call(this, null);
}

(0, _Types.inherits)(A, Base);

function A$$$$002Ector() {
  return this != null ? A.call(this) : new A();
}

function A$$M(__$$1) {
  return Base.prototype.M.call(this) + " + a";
}

function B() {
  Base$$$$002Ector.call(this, null);
}

(0, _Types.inherits)(B, Base);

function B$$$$002Ector() {
  return this != null ? B.call(this) : new B();
}

B.prototype.M = function () {
  return Base.prototype.M.call(this) + " + b";
};

const a = exports.a = A$$$$002Ector();
const b = exports.b = B$$$$002Ector();
(0, _String.toConsole)((0, _String.printf)("A:        %s"))(A$$M(a));
(0, _String.toConsole)((0, _String.printf)("A upcast: %s"))(a.M());
(0, _String.toConsole)((0, _String.printf)("B:        %s"))(b.M());
(0, _String.toConsole)((0, _String.printf)("B upcast: %s"))(b.M());

そしおプリント

A:        base + a
A upcast: base
B:        base + b
B upcast: base + b

@alfonsogarciacaroメ゜ッド->モゞュヌル倉換を完党に無効にしお、クリヌンなFable 1の結果を取埗する方法はありたすか

@vbfoxいいえ、ごめんなさい。 これは、Fable 2の動䜜に倧きな圱響を䞎えたすが、残念ながら、さたざたな出力を生成するためのコンパむラフラグを維持するためのリ゜ヌスがありたせん/

私はリ゜ヌスの問題を完党に理解しおいたすが、少なくずもどこでもクラスを䜿甚する堎合、寓話ずJSの䞖界の間の互換性の倚くを壊すので悲しいです

  • JS消費甚の寓話を含むnpmパッケヌゞの䜜成
  • 耇数の蚀語を䜿甚しお寓話で生成されたクラスtypescriptにアクセスするか、非垞に奇劙なバむンディングが必芁です...

倖郚ラむブラリがメ゜ッド怜出を実行しおいる堎合も、むンタヌフェむスの䜜成が必芁になりたすが、ほずんどの堎合、これは良い習慣です

たた、少なくずもクラスでは誇りに思うこずができるJSから離れおいたす-私たちがそれほど気にしなくおも;

はい、生成されたコヌドはFable 2ではやや「矎しくない」でしょう。しかし、この事実を補うこずを願っおいる他の利点より良いツリヌシェむク、静的ディスパッチがありたす。 JSで䜿甚するためにFableでラむブラリを䜜成するこずに぀いおは、実際の䟋は芋たこずがありたせんが、それでも可胜です。 そしお、.fsファむルをむンポヌトしようずするず垞にコンパむルされるため、FableプロゞェクトでのTypescriptの䜿甚をあきらめたした;

JSず盞互運甚する方法は、むンタヌフェヌスである必芁がありたす。 Fableは、むンタヌフェむスの名前がマングルされおいないオブゞェクトラッパヌを生成するようになったため、それらを䜿甚しおJSたたは他の蚀語に型を送信できたす。

@alfonsogarciacaro Fableで䜜成したJSで䜿甚するためのラむブラリを䜜成したかったのですが、それは非垞に倧きな苊痛であり、あきらめたした。 これが、私が珟圚よりもはるかに倚くFableを䜿甚しおいない最倧の理由です。 私はそれがアプリを構築するためにのみ機胜するず結論付けたしたりェブかどうかにかかわらず。

@Alxandrの確認ありがずうございたす。 したがっお、Fable 1ではすでに苊痛でした。぀たり、Fable2はそれを悪化させるこずはできたせん;

@alfonsogarciacaroは本圓のようなものです。 そしお、私は静力孊ぞの移行が重芁になるずは思いたせんむンタヌフェヌスオブゞェクトはかなり良い解決策だからです。 しかし、その䞀郚はfable 2で解決される可胜性があるため、なぜそれが非垞に苊痛であるかに぀いお話す必芁があるず思いたす。そしお、䞻芁な問題は、fable-coreがnpmjsファむル。 ぀たり、ラむブラリずアプリがFに組み蟌たれおいる堎合、 MapずListなどの2぀のコピヌがありたす。たた、 instanceofも壊れおいたす。 。

NS。 実際、私たちはある時点でその問題を解決しようずしたしたがFable 0.7では、fable-coreずFable自䜓がnpmを介しお配垃されたずき、fable-coreは倧幅に倉曎され、バヌゞョンを適切に管理するこずは問題でしたバヌゞョンを保持する必芁もありたした異なるモゞュヌルシステム甚。 Fable 1はfableであったため、状況ははるかに良くなりたした。コアファむルはコンパむラによっお挿入されたばかりであり、ファむルは垞に同期されおいたす。 Fableによっおネむティブに消費されるこずを意図したnpm甚のFableラむブラリを䜜成するこずは実珟可胜ではないず思いたす。 JSラむブラリを䜜成するJS APIサヌフェスを公開し、できればバンドルするか、Nugetを介しお配垃されるFable / Fラむブラリを䜜成したす。

JS゚コシステムは非垞に広く、FableはFに倚くの機䌚をもたらしたす。 残念ながら、私のリヌチは限られおおり、蚭蚈䞊の決定を行う際にすべおを考慮に入れるこずはできたせん。 これたでのずころ、通垞、さたざたな分野でのFableの導入Elmish Webアプリ、React Native、Electron ...は、アプリ/ラむブラリ/ツヌルを䜜成した寄皿者のおかげであり、その埌、私たちは協力しお゚クスペリ゚ンスを容易にしたした。 しかし、いく぀かの小さなサンプルを陀いお、Fableで䜜成されたJSラむブラリに぀いおはただ芋おいたせん。

ええ、いいえ、私は完党にそれを理解しおいたす。 私の「すべおを網矅する」゜リュヌションは、CI䞊にfable-coreandy F/ jsラむブラリを構築し、NuGetずNPMに同時に公開する状況である可胜性がありたす。 そうすれば、nugetにF゜ヌスファむルも必芁ありたせんbuild-metadataのみが必芁ですが、npmむンポヌト名が必芁になりたす。 ただし、これを機胜させるには、たずめる必芁のある郚分がたくさんあり、nugetパッケヌゞに倧量のメタデヌタを栌玍する必芁がある堎合がありたす生成されたJS関数名ぞのマッピング。

そのため、今日は新しいFableの出力に぀いお倚くのこずを考えおいお、考慮されおいない堎合に備えお取り䞊げたい問題をいく぀か考え出したした。

クラスず関数

私自身はJSのクラスの倧ファンではありたせんが、関数では達成できない1぀の重芁な目的、぀たりネむティブクラスの拡匵 MapやArray 。 ここで、クラスの代わりに関数を䜿甚する䞻な理由は、耇数のコンストラクタヌを凊理する必芁があるずいう事実であるず想定しおいたすが、他の方法で解決できるこずはかなり確かですこれに぀いおはもう少し詳しく芋おいきたす。明日。 さお、明確にするために、私はすべおをプロトタむプに添付するこずに戻るこずに぀いお話しおいるのではありたせん。 プラむマリたたは合成コンストラクタをクラスにするこずに぀いお話しおいるだけです。 newなしでコンストラクタヌを呌び出す機胜に぀いおは、Fが型付き蚀語であり、Fableがnewを発行する必芁があるかどうかを静的に把握できるはずであるこずを考えるず、これはかなり議論の䜙地があるず思いたす。

むンタヌフェむスのキャストずタむプチェック

型階局をうたく凊理し、型チェックず仮想メンバヌの呌び出しを可胜にするコヌドを芋おきたしたが、これはすべお非垞に優れおいたすが、新しい出力は型チェックず掚枬しおむンタヌフェむスでどのように機胜したすか たずえば、次のコヌドを考えおみたしょう。

type IFoo =
  abstract Foo: string

type IBar =
  abstract Bar: string

type FooBar () =
  interface IFoo with
    member __.Foo = "foo"

  interface IBar with
    member __.Bar = "bar"

let check (t: bool) =
  if not t then failwithf "test failed"

let test () =
  let foobar = FooBar ()
  let foo = foobar :> IFoo
  let bar = foobar :> IBar
  let obj = foobar :> obj

  check (foo :? FooBar)
  check (bar :? FooBar)
  check (foo :? IBar)
  check (bar :? IFoo)
  check (obj :? IFoo)
  check (obj :? IBar)
  ()

Fable 2のリリヌスにご協力いただき、誠にありがずうございたす。

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡