Fable: рдХрд▓реНрдкрд┐рдд рдХреЗ рд▓рд┐рдП рдкрд╛рдпрдерди рд╕рдорд░реНрдерди

рдХреЛ рдирд┐рд░реНрдорд┐рдд 4 рдЬрдире░ 2021  ┬╖  54рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: fable-compiler/Fable

рд╡рд┐рд╡рд░рдг

рдпрд╣ рдореБрджреНрджрд╛ рдХрд▓реНрдкрд┐рдд рдХреЗ рд▓рд┐рдП рдкрд╛рдпрдерди рд╕рдорд░реНрдерди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдЪрд░реНрдЪрд╛ рд╣реИред рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдлреИрдмрд▓ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдиреЗ рд╡рд╛рд▓рд╛ рдмреИрдмреЗрд▓ рдПрдПрд╕рдЯреА рдкрд╛рдпрдерди рдХреЛрдб рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рдлреА рдХрд░реАрдм рд╣реИред рдЦрд╛рд╕рдХрд░ рдЕрдм рдЬрдм рдХрдХреНрд╖рд╛рдУрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдпрд╣ рд╕рдВрднрд╡ рд╣реИ рдпрд╣ рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреАрдУрд╕реА рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЗрд╕рдХреЗ рд▓рд┐рдП рдХрд╛рдлреА рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:

  1. рдкрд╛рдпрдерди рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫрд╛ рд╕рдорд░реНрдерди рдЬреЛрдбрд╝реЗрдВ
  2. Fable рдХреЛ рдЕрдзрд┐рдХ JS рдЕрдЬреНрдЮреЗрдпрд╡рд╛рджреА рдмрдирд╛рдПрдВ рдФрд░ рдПрдХрд╛рдзрд┐рдХ рд▓рдХреНрд╖рд┐рдд рднрд╛рд╖рд╛рдУрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░реЗрдВред

рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдПрдл # рд╕реЗ рдкреНрд░реЗрд░рд┐рдд рдкрд╛рдпрдерди рдореЗрдВ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреЛ рд╕рдХреНрд╖рдо рдмрдирд╛рддрд╛ рд╣реИред рдпрд╣ option , result , seq , map , list (рдлреНрд░реЛрдЬрдирд▓рд┐рд╕реНрдЯ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ), рдореЗрд▓рдмреЙрдХреНрд╕ рдЬреИрд╕реЗ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдЕрдкрдирд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдкреНрд░реЛрд╕реЗрд╕рд░, ... рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдпрд╣ рдХрд▓реНрдкрд┐рдд рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рдкрд╛рдпрдерди рд╕рдордХрдХреНрд╖ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреБрдХреНрдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдкрд╛рдпрдерди рдореЗрдВ, рдЖрдк рдПрдл # 'рдЖрдИрдПрд╕рдПрдЪ рдХреЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред Fable рдореЗрдВ рдЖрдк рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрд╛рдпрдерди рдХреЛрдб рдЬреЗрдирд░реЗрдЯ рдХрд░рддреЗ рд╣реИрдВред

рдмрдХреНрд╕реЛрдВ рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░реЗрдВ:

  • F# рдЬреНрдпреВрдкрд┐рдЯрд░ рдиреЛрдЯрдмреБрдХ рдореЗрдВ рдкрд╛рдпрдерди рдХрд░реНрдиреЗрд▓ рдХреЗ рд╕рд╛рде рдЪрд▓ рд░рд╣рд╛ рд╣реИ, рдЕрд░реНрдерд╛рдд рдЬреЛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреИрд╕реЗ Hy рдФрд░ Calysto Hy рдХреЗ рд╕рд╛рде рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
  • F# рдХрдо рдШрд░реНрд╖рдг рдХреЗ рд▓рд┐рдП рдкрд╛рдпрдерди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реНрдХреНрд░рд┐рдкреНрдЯрд┐рдВрдЧ
  • рдорд╛рдЗрдХреНрд░реЛ: рдмрд┐рдЯ рдФрд░ рд░рд╛рд╕рдмреЗрд░реА рдкреАрдЖрдИ рдЬреИрд╕реЗ рдПрдореНрдмреЗрдбреЗрдб рд╡рд╛рддрд╛рд╡рд░рдг рдХрд╛ рдЕрдзрд┐рдХ рдЖрд╕рд╛рдиреА рд╕реЗ рд╕рдорд░реНрдерди рдХрд░рддреЗ рд╣реИрдВред
  • рдПрдл # рдФрд░ рдкрд╛рдпрдерди рдХреЛрдб рдХреЗ рдмреАрдЪ рдбреЗрдЯрд╛ рдореЙрдбрд▓ рд╕рд╛рдЭрд╛ рдХрд░рдирд╛

рдЪрд░реНрдЪрд╛ рдХрд░рдиреЗ рдФрд░ рдирд┐рд░реНрдгрдп рд▓реЗрдиреЗ рдХреЗ рд▓рд┐рдП рдЪреАрдЬреЗрдВ:

  • рдХреНрдпрд╛ рдПрдл # рдХреЗ рд▓рд┐рдП рдкрд╛рдпрдерди .NET рд╕реЗ рдЕрдзрд┐рдХ рдкрд╛рдЗрдереЛрдирд┐рдХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП? рдЬреБрдкрд┐рдЯрд░ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рд╕реЗ рд╣реА .NET рд╕рдорд░реНрдерди рд╣реИ рдЬрд┐рд╕реЗ рд╣рдореЗрдВ рдмрджрд▓рдиреЗ рдпрд╛ рдкреНрд░рддрд┐рд╕реНрдкрд░реНрдзрд╛ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдирд╣реАрдВ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдПред рдкрд╛рдпрдерди рдХреЗ рд▓рд┐рдП Fable рд╢рд╛рдпрдж .NET (рдпрджрд┐ рд╕рдВрднрд╡ рд╣реЛ) рдХреЗ рдмрдЬрд╛рдп рдкрд╛рдпрдерди рдХреЛ рд▓рдХреНрд╖рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ F# рдХреА рддрд▓рд╛рд╢ рдореЗрдВ рдкрд╛рдпрдерди рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ рдлрд┐рдЯ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
  • рдХреНрдпрд╛ рд╣рдореЗрдВ рдмреИрдмреЗрд▓ рдПрдПрд╕рдЯреА рдХреЗ рд╕рд╛рде рд╕рдВрдЧрдд рд╣реЛрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдпрд╛ рд╣рдореЗрдВ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдкрд╛рдпрдерди рдПрдПрд╕рдЯреА рдореЗрдВ рдмрджрд▓рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣ рд╢рд╛рдпрдж рдЕрдкрд░рд┐рд╣рд╛рд░реНрдп рд╣реИ, рд▓реЗрдХрд┐рди рдмреЗрдмреЗрд▓ рд╣рдореЗрдВ рдПрдХ рдЕрдЪреНрдЫреА рд╢реБрд░реБрдЖрдд рджреЗрддрд╛ рд╣реИред
  • рдХреНрдпрд╛ рд╣рдореЗрдВ Fable рдХреЗ рд▓рд┐рдП (рдЬреИрд╕реЗ Peeble рдХреЗ рд╕рд╛рде) рдпрд╛ рд╣рдореЗрдВ Fable рдХреЗ рднреАрддрд░ рд░рд╣рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ Fable рдХреЛ рдХрдИ рднрд╛рд╖рд╛рдУрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╣рдорд╛рд░рд╛ рдЕрдкрдирд╛ рд░реЗрдкреЛ рд╣реЛрдиреЗ рд╕реЗ рд╕реНрд╡рддрдВрддреНрд░рддрд╛ рдФрд░ рдЧрддрд┐ рдорд┐рд▓рддреА рд╣реИ (рдЬреЗрдПрд╕ рдХреА рдкрд░рд╡рд╛рд╣ рдХрд┐рдП рдмрд┐рдирд╛), рд▓реЗрдХрд┐рди рд╣рдо рд╕рдордп рдХреЗ рд╕рд╛рде рдкреАрдЫреЗ рдЫреВрдЯрдиреЗ рдФрд░ рдЕрдкреНрд░рдЪрд▓рд┐рдд рд╣реЛрдиреЗ рдХрд╛ рдЬреЛрдЦрд┐рдо рдЙрдард╛рдПрдВрдЧреЗред рдореЗрд░реА рднрд╛рд╡рдирд╛ рдпрд╣ рд╣реИ рдХрд┐ рд╣рдореЗрдВ Fable рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдмрдирдирд╛ рдЪрд╛рд╣рд┐рдПред
  • рдкрд╛рдпрдерди рдореВрд▓ рдкреНрд░рдХрд╛рд░ рднреА рдПрдл # рд╕реЗ рдЕрд▓рдЧ рд╣реИред рдЬреИрд╕реЗ int рдХреА рд▓рдВрдмрд╛рдИ рдордирдорд╛рдиреА рд╣реИред рдХреНрдпрд╛ рд╣рдореЗрдВ рд╕рдВрдЧрдд рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП .NET (рдорд╢реАрди) рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдЕрдиреБрдХрд░рдг рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдпрд╛ рдХреНрдпрд╛ рд╣рдореЗрдВ рдкрд╛рдпрдерди int рдкреНрд░рдХрд╛рд░ рдХреЛ F# int рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдЬрд╛рдЧрд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП?

рдкреАрдУрд╕реА рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛

POC рдХрд╛ рд╕реНрд░реЛрдд рдХреЛрдб рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдпрд╣рд╛рдБ рд░рд╣рддрд╛ рд╣реИ:

  1. рдореИрдХ рдкрд░ https://www.python.org рдпрд╛ brew install [email protected] рд╕реЗ рдирд╡реАрдирддрдо рдкрд╛рдпрдерди 3.9 рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░реЗрдВред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЕрдЬрдЧрд░ рдЖрдкрдХреЗ рд╕рд┐рд╕реНрдЯрдо рдкрд░ python , python3 рдпрд╛ рджреЛрдиреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
  2. рд░реЗрдкреЛ рджреЛрдиреЛрдВ рдХреЛ рдХреНрд▓реЛрди рдХрд░реЗрдВ рдФрд░ python рд╢рд╛рдЦрд╛ рдореЗрдВ рд╕реНрд╡рд┐рдЪ рдХрд░реЗрдВред
  3. рдкрд╛рдпрдерди рдХреЗ рд▓рд┐рдП рдХрд▓реНрдкрд┐рдд рдкреБрд╕реНрддрдХрд╛рд▓рдп рдмрдирд╛рдПрдБ: dotnet fsi build.fsx library-py
  4. рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП: dotnet fsi build.fsx test-py
  5. Fable рдореЗрдВ, QuickTest.fs рдХреЛ рдХреБрдЫ рдмрд╣реБрдд рд╣реА рд╕рд░рд▓ F# рдХреЛрдб рдореЗрдВ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВред рдлрд┐рд░ рд╢реАрд░реНрд╖ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рд╕реЗ dotnet fsi build.fsx quicktest рдЪрд▓рд╛рдПрдБред

рдЕрдм рдЖрдк рдлреИрдмрд▓ рдФрд░ рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рдХреЛрдб рджреЛрдиреЛрдВ рдХреЛ рдПрдбрд┐рдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЬрд░реВрд░рдд рдкрдбрд╝рдиреЗ рдкрд░ рдЙрджрд╛рд╣рд░рдг рдХреЛрдб рдлрд┐рд░ рд╕реЗ рдХрдВрдкрд╛рдЗрд▓ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ Fable рдХреЛрдб рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдкреБрди: рд╕рдВрдХрд▓рди рдХреЛ рдЯреНрд░рд┐рдЧрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ QuickTest.fs рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдмрдЪрдд рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдкрд╛рдпрдерди рдлрд╝рд╛рдЗрд▓ quicktest.py рд░реВрдк рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реЛрдЧреАред рдПрдХ рдЕрдЪреНрдЫрд╛ рдбреЗрдореЛ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдмрдирд╛рдордХреЛрдб рдореЗрдВ рдПрдл #, рдЬреЗрдПрд╕ рдФрд░ рдкрд╛рдпрдерди рджреЛрдиреЛрдВ рдХреЛ рджреЗрдЦрдирд╛ рд╣реИред рдлрд┐рд░ рдЖрдк рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдЬрдм рдЖрдк F# рдлрд╝рд╛рдЗрд▓ рд╕рд╣реЗрдЬрддреЗ рд╣реИрдВ рддреЛ рдХреЛрдб рдХреИрд╕реЗ рд░реВрдкрд╛рдВрддрд░рд┐рдд рд╣реЛрддрд╛ рд╣реИ:

Screenshot 2021-01-15 at 13 18 09

рдЖрдк рдЯрд░реНрдорд┐рдирд▓ рдореЗрдВ рдЙрддреНрдкрдиреНрди рдкрд╛рдпрдерди рдХреЛрдб рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ:

$ python3 quicktest.py

рд▓рд┐рдВрдХ

рдХреБрдЫ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд▓рд┐рдВрдХ:

рдЪрд░реНрдЪрд╛рдУрдВ, рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ, рд╡рд┐рдЪрд╛рд░реЛрдВ рдФрд░ рдХреЛрдб рдХреЗ рд╕рд╛рде рдпреЛрдЧрджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рддрдВрддреНрд░ рдорд╣рд╕реВрд╕ рдХрд░реЗрдВ

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рд╣реИ @dbrattli! Fable рдХреЗ рд╕рд╛рде рдореЗрд░рд╛ рдореВрд▓ рд╡рд┐рдЪрд╛рд░ F# рдХреЛ рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдЖрд╕рд╛рдиреА рд╕реЗ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдкреНрд░рджрд╛рди рдХрд░рдирд╛ рдерд╛ред рдмреЗрд╣рддрд░ рдпрд╛ рдмрджрддрд░ рдХреЗ рд▓рд┐рдП, Fable рдЬреЗрдПрд╕ рдХреЗ рд╕рд╛рде рдЗрд╕рдХреЗ рдореБрдЦреНрдп рдлреЛрдХрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд┐рдХрд╕рд┐рдд рд╣реБрдЖ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рдФрд░ рдЕрдзрд┐рдХ рднрд╛рд╖рд╛ рдЕрдЬреНрдЮреЗрдп рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдХрд╛рдо рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА рд▓реЗрдХрд┐рди рдореИрдВ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЦреБрд▓рд╛ рд░рд╣реВрдВрдЧрд╛ред рдЖрдкрдХреЗ рдкреНрд░рд╢реНрдиреЛрдВ рдкрд░ рдХреБрдЫ рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ:

  • рд╡рд╣реА рдпрд╛ рдЕрд▓рдЧ рд░реЗрдкреЛ? рдореИрдВ рдЬрд┐рддрдирд╛ рд╕рдВрднрд╡ рд╣реЛ рдЙрддрдирд╛ рд╕рд╛рдорд╛рдиреНрдп рдХреЛрдб рд░рдЦрдиреЗ рдХреЗ рдкрдХреНрд╖ рдореЗрдВ рд░рд╣реВрдВрдЧрд╛ред рдЕрд▓рдЧ-рдЕрд▓рдЧ рд░реЗрдкреЛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рд╡реЗ рдХрд╛рдлреА рддреЗрдЬреА рд╕реЗ рдЕрд▓рдЧ рд╣реЛ рдЬрд╛рдПрдВрдЧреЗ (рдЙрджреНрдзрд░рдг рд╕рдорд░реНрдерди рдХреЗ рд╕рд╛рде рд╢рд╛рдЦрд╛ рдХреЛ рд╕рд┐рдВрдХ рдореЗрдВ рд░рдЦрдирд╛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдореБрд╢реНрдХрд┐рд▓ рд╣реИ) рд▓реЗрдХрд┐рди рд╣рдореЗрдВ рдХреЛрдб рдХреЛ рдореЙрдбреНрдпреВрд▓рд░ рдмрдирд╛рдиреЗ рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ рд▓рдХреНрд╖реНрдп рднрд╛рд╖рд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╣рд░ рдЬрдЧрд╣ рд╕реНрдерд┐рддрд┐рдпрд╛рдВ рди рд╣реЛрдВред рдПрдХ рдордзреНрдпрд╡рд░реНрддреА рд╕рдорд╛рдзрд╛рди рдПрдХ рдХрд▓реНрдкрд┐рдд "рдиреНрдпреВрдХреНрд▓рд┐рдпрд╕" (рд╣рдо рдХреЛрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ) рдХреЗ рд▓рд┐рдП рдЬрд┐рддрдирд╛ рд╕рдВрднрд╡ рд╣реЛ рдЙрддрдирд╛ рдХреЛрдб рдирд┐рдХрд╛рд▓рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдлрд┐рд░ рднрд╛рд╖рд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ рд░реЗрдкреЛ рд╣реЛрдВрдЧреЗред

  • рдмреИрдмреЗрд▓ рдПрдПрд╕рдЯреА: рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЗрд╕рд▓рд┐рдП рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдХреНрдпреЛрдВрдХрд┐ рдореВрд▓ рд░реВрдк рд╕реЗ рд╣рдо рдХреЛрдб рдХреЛ рдкреНрд░рд┐рдВрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмреИрдмреЗрд▓ рдкрд░ рдирд┐рд░реНрднрд░ рдереЗред рдПрдХ рдЖрджрд░реНрд╢ рджреБрдирд┐рдпрд╛ рдореЗрдВ, рдЕрдм рдЬрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЕрдкрдирд╛ рдкреНрд░рд┐рдВрдЯрд░ рд╣реИ рддреЛ рдЗрд╕реЗ рд╣рдЯрд╛рдирд╛ рд╕рдВрднрд╡ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рд▓реЗрдХрд┐рди Fable-to-Babel рдЪрд░рдг рдореЗрдВ рдмрд╣реБрдд рдХрд╛рдо рд╣реЛ рд░рд╣рд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдХрдард┐рди рд╣реЛрдЧрд╛ред рдЗрд╕реА рдХрд╛рд░рдг рд╕реЗ, рдЗрд╕ рдЪрд░рдг рд╕реЗ рдЬрд┐рддрдирд╛ рд╕рдВрднрд╡ рд╣реЛ рдЙрддрдирд╛ рдХреЛрдб рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛, рд╢рд╛рдпрдж рдмреЗрдмреЗрд▓ рдПрдПрд╕рдЯреА рдХреЛ рдЧреИрд░-рдХрд╛рд░реНрдпрд╛рддреНрдордХ рднрд╛рд╖рд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдФрд░ рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдп рдмрдирд╛ рджреЗред рдХреБрдЫ рдЙрджрд╛рд╣рд░рдг:

    • рдПрдХреНрд╕рдкреНрд░реЗрд╢рди-рдЖрдзрд╛рд░рд┐рдд рдПрдПрд╕рдЯреА рд╕реЗ рдПрдХреНрд╕рдкреНрд░реЗрд╢рди/рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдПрдПрд╕рдЯреА рдкрд░ рдЬрд╛рдПрдВред рдЬреЗрдПрд╕ рдХреЗ рд▓рд┐рдП, рдЗрд╕рдореЗрдВ рдХрдИ рдЖрдИрдЖрдИрдПрдлрдИ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реЛрдиреЗ рдкрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдШреЛрд╖рдгрд╛рдПрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдкрд╛рдпрдерди рдХреЗ рд╕рд╛рде рдХреБрдЫ рдРрд╕рд╛ рд╣реА рд╣реЛрдЧрд╛ред
    • рдкреИрдЯрд░реНрди рдорд┐рд▓рд╛рди (рдбрд┐рд╕реАрдЬрдирдЯреНрд░реА) рдХреЛ рдЕрдЧрд░/рд╕реНрд╡рд┐рдЪ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдореЗрдВ рдмрджрд▓рдирд╛ред
    • рдкреВрдВрдЫ-рдХреЙрд▓ рдЕрдиреБрдХреВрд▓рдиред рдпрд╣ рдЬреЗрдПрд╕ рд▓реЗрдмрд▓ рд╡рд╛рд▓реЗ рд▓реВрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдкрд╛рдпрдерди рдореЗрдВ рд╣рдореЗрдВ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ рддрдХрдиреАрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА рдХрд┐ рд╣рдо рдиреЗрд╕реНрдЯреЗрдб рд▓реВрдк рд╕реЗ рди рдЯреВрдЯреЗрдВред
    • рдЖрдпрд╛рдд рдХреЛ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛рдУрдВ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдирд╛ (рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рддреЛ рдЗрд╕реЗ рд╕реАрдзреЗ Fable AST рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ)ред
  • рдПрдл # рдЕрдзрд┐рдХ рдкрд╛рдЗрдереЛрдирд┐рдХ рдмрдирд╛рдПрдВ? Fable рдХреЗ рд╕рд╛рде рдореИрдВрдиреЗ рд╣рдореЗрд╢рд╛ рдПрдХ рд╕рдВрддреБрд▓рди рдЦреЛрдЬрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рдЬрд╣рд╛рдВ рдУрд╡рд░рд╣реЗрдб рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдХрднреА-рдХрднреА .NET рд╢рдмреНрджрд╛рд░реНрде рдХрд╛ рддреНрдпрд╛рдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдо рдХреЗрд╡рд▓ JS рдирдВрдмрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рди рдХрд┐ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреНрд░рдХрд╛рд░ рдХреЗ ints рдХреЗ рд▓рд┐рдП (рд╣рд╛рд▓рд╛рдБрдХрд┐ рд╣рдо рдЗрд╕реЗ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдХрд░рддреЗ рд╣реИрдВ), рдпрд╣ Python int рд▓рд╛рдЧреВ рд╣реЛрдЧрд╛ рдЬреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рдкрд░рд┐рдгрд╛рдореЛрдВ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢рд┐рд╖реНрдЯ рдмрд┐рдВрджреБрдУрдВ рдкрд░ .NET рд╢рдмреНрджрд╛рд░реНрде рдХрд╛ рд╕рдореНрдорд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рдпреЛрдЧрджрд╛рди рдХрд┐рдП рдЧрдП рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдкреВрд░реНрдгрд╛рдВрдХ рд╡рд┐рднрд╛рдЬрди рдпрд╛ рд╕реНрдкрд╖реНрдЯ рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рд░реВрдкрд╛рдВрддрд░рдгред
    рд╡реИрд╕реЗ рднреА, рдЬрдм рдЖрдк "рдЕрдзрд┐рдХ рдкрд╛рдЗрдереЛрдирд┐рдХ" рдХрд╣рддреЗ рд╣реИрдВ рддреЛ рдЖрдкрдХрд╛ рдорддрд▓рдм рдХреЛрдб рд╢реИрд▓реА рдпрд╛ рджреЗрд╢реА рдПрдкреАрдЖрдИ рд╣реИ? Fable рдЕрдзрд┐рдХрд╛рдВрд╢ .NET BCL рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдВрдд рдореЗрдВ рд╣рдореЗрдВ рд╕рд╛рдорд╛рдиреНрдп рдлрд╝рдВрдХреНрд╢рди/рдСрдкрд░реЗрдЯрд░реЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рджреЗрд╡реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рдирд╡рд╛рдЧрдВрддреБрдХ, рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдореЗрдВ рдкрд╛рдПрдВрдЧреЗ)ред рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдореЗрдВ рджреЗрд╢реА рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рд╡рд┐рдХрд▓реНрдк рджреЗрдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реИ ( Fable.Extras рдЙрд╕ рдЕрд░реНрде рдореЗрдВ рдПрдХ рдЕрдЪреНрдЫрд╛ рдХрджрдо рд╣реИ)ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП JS.console.log рдЖрдорддреМрд░ рдкрд░ printfn рддреБрд▓рдирд╛ рдореЗрдВ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдЕрдзрд┐рдХ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдкреНрд░рд╛рд░реВрдкрд┐рдд рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдореЗрдВ рдмрд╛рдж рд╡рд╛рд▓реЗ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╡рд╣реА рд╣реИ рдЬреЛ рджреЗрд╡ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред

рд╕рднреА 54 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рд╣реИ @dbrattli! Fable рдХреЗ рд╕рд╛рде рдореЗрд░рд╛ рдореВрд▓ рд╡рд┐рдЪрд╛рд░ F# рдХреЛ рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдЖрд╕рд╛рдиреА рд╕реЗ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдкреНрд░рджрд╛рди рдХрд░рдирд╛ рдерд╛ред рдмреЗрд╣рддрд░ рдпрд╛ рдмрджрддрд░ рдХреЗ рд▓рд┐рдП, Fable рдЬреЗрдПрд╕ рдХреЗ рд╕рд╛рде рдЗрд╕рдХреЗ рдореБрдЦреНрдп рдлреЛрдХрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд┐рдХрд╕рд┐рдд рд╣реБрдЖ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рдФрд░ рдЕрдзрд┐рдХ рднрд╛рд╖рд╛ рдЕрдЬреНрдЮреЗрдп рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдХрд╛рдо рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА рд▓реЗрдХрд┐рди рдореИрдВ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЦреБрд▓рд╛ рд░рд╣реВрдВрдЧрд╛ред рдЖрдкрдХреЗ рдкреНрд░рд╢реНрдиреЛрдВ рдкрд░ рдХреБрдЫ рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ:

  • рд╡рд╣реА рдпрд╛ рдЕрд▓рдЧ рд░реЗрдкреЛ? рдореИрдВ рдЬрд┐рддрдирд╛ рд╕рдВрднрд╡ рд╣реЛ рдЙрддрдирд╛ рд╕рд╛рдорд╛рдиреНрдп рдХреЛрдб рд░рдЦрдиреЗ рдХреЗ рдкрдХреНрд╖ рдореЗрдВ рд░рд╣реВрдВрдЧрд╛ред рдЕрд▓рдЧ-рдЕрд▓рдЧ рд░реЗрдкреЛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рд╡реЗ рдХрд╛рдлреА рддреЗрдЬреА рд╕реЗ рдЕрд▓рдЧ рд╣реЛ рдЬрд╛рдПрдВрдЧреЗ (рдЙрджреНрдзрд░рдг рд╕рдорд░реНрдерди рдХреЗ рд╕рд╛рде рд╢рд╛рдЦрд╛ рдХреЛ рд╕рд┐рдВрдХ рдореЗрдВ рд░рдЦрдирд╛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдореБрд╢реНрдХрд┐рд▓ рд╣реИ) рд▓реЗрдХрд┐рди рд╣рдореЗрдВ рдХреЛрдб рдХреЛ рдореЙрдбреНрдпреВрд▓рд░ рдмрдирд╛рдиреЗ рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ рд▓рдХреНрд╖реНрдп рднрд╛рд╖рд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╣рд░ рдЬрдЧрд╣ рд╕реНрдерд┐рддрд┐рдпрд╛рдВ рди рд╣реЛрдВред рдПрдХ рдордзреНрдпрд╡рд░реНрддреА рд╕рдорд╛рдзрд╛рди рдПрдХ рдХрд▓реНрдкрд┐рдд "рдиреНрдпреВрдХреНрд▓рд┐рдпрд╕" (рд╣рдо рдХреЛрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ) рдХреЗ рд▓рд┐рдП рдЬрд┐рддрдирд╛ рд╕рдВрднрд╡ рд╣реЛ рдЙрддрдирд╛ рдХреЛрдб рдирд┐рдХрд╛рд▓рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдлрд┐рд░ рднрд╛рд╖рд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ рд░реЗрдкреЛ рд╣реЛрдВрдЧреЗред

  • рдмреИрдмреЗрд▓ рдПрдПрд╕рдЯреА: рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЗрд╕рд▓рд┐рдП рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдХреНрдпреЛрдВрдХрд┐ рдореВрд▓ рд░реВрдк рд╕реЗ рд╣рдо рдХреЛрдб рдХреЛ рдкреНрд░рд┐рдВрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмреИрдмреЗрд▓ рдкрд░ рдирд┐рд░реНрднрд░ рдереЗред рдПрдХ рдЖрджрд░реНрд╢ рджреБрдирд┐рдпрд╛ рдореЗрдВ, рдЕрдм рдЬрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЕрдкрдирд╛ рдкреНрд░рд┐рдВрдЯрд░ рд╣реИ рддреЛ рдЗрд╕реЗ рд╣рдЯрд╛рдирд╛ рд╕рдВрднрд╡ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рд▓реЗрдХрд┐рди Fable-to-Babel рдЪрд░рдг рдореЗрдВ рдмрд╣реБрдд рдХрд╛рдо рд╣реЛ рд░рд╣рд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдХрдард┐рди рд╣реЛрдЧрд╛ред рдЗрд╕реА рдХрд╛рд░рдг рд╕реЗ, рдЗрд╕ рдЪрд░рдг рд╕реЗ рдЬрд┐рддрдирд╛ рд╕рдВрднрд╡ рд╣реЛ рдЙрддрдирд╛ рдХреЛрдб рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛, рд╢рд╛рдпрдж рдмреЗрдмреЗрд▓ рдПрдПрд╕рдЯреА рдХреЛ рдЧреИрд░-рдХрд╛рд░реНрдпрд╛рддреНрдордХ рднрд╛рд╖рд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдФрд░ рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдп рдмрдирд╛ рджреЗред рдХреБрдЫ рдЙрджрд╛рд╣рд░рдг:

    • рдПрдХреНрд╕рдкреНрд░реЗрд╢рди-рдЖрдзрд╛рд░рд┐рдд рдПрдПрд╕рдЯреА рд╕реЗ рдПрдХреНрд╕рдкреНрд░реЗрд╢рди/рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдПрдПрд╕рдЯреА рдкрд░ рдЬрд╛рдПрдВред рдЬреЗрдПрд╕ рдХреЗ рд▓рд┐рдП, рдЗрд╕рдореЗрдВ рдХрдИ рдЖрдИрдЖрдИрдПрдлрдИ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реЛрдиреЗ рдкрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдШреЛрд╖рдгрд╛рдПрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдкрд╛рдпрдерди рдХреЗ рд╕рд╛рде рдХреБрдЫ рдРрд╕рд╛ рд╣реА рд╣реЛрдЧрд╛ред
    • рдкреИрдЯрд░реНрди рдорд┐рд▓рд╛рди (рдбрд┐рд╕реАрдЬрдирдЯреНрд░реА) рдХреЛ рдЕрдЧрд░/рд╕реНрд╡рд┐рдЪ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдореЗрдВ рдмрджрд▓рдирд╛ред
    • рдкреВрдВрдЫ-рдХреЙрд▓ рдЕрдиреБрдХреВрд▓рдиред рдпрд╣ рдЬреЗрдПрд╕ рд▓реЗрдмрд▓ рд╡рд╛рд▓реЗ рд▓реВрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдкрд╛рдпрдерди рдореЗрдВ рд╣рдореЗрдВ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ рддрдХрдиреАрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА рдХрд┐ рд╣рдо рдиреЗрд╕реНрдЯреЗрдб рд▓реВрдк рд╕реЗ рди рдЯреВрдЯреЗрдВред
    • рдЖрдпрд╛рдд рдХреЛ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛рдУрдВ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдирд╛ (рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рддреЛ рдЗрд╕реЗ рд╕реАрдзреЗ Fable AST рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ)ред
  • рдПрдл # рдЕрдзрд┐рдХ рдкрд╛рдЗрдереЛрдирд┐рдХ рдмрдирд╛рдПрдВ? Fable рдХреЗ рд╕рд╛рде рдореИрдВрдиреЗ рд╣рдореЗрд╢рд╛ рдПрдХ рд╕рдВрддреБрд▓рди рдЦреЛрдЬрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рдЬрд╣рд╛рдВ рдУрд╡рд░рд╣реЗрдб рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдХрднреА-рдХрднреА .NET рд╢рдмреНрджрд╛рд░реНрде рдХрд╛ рддреНрдпрд╛рдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдо рдХреЗрд╡рд▓ JS рдирдВрдмрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рди рдХрд┐ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреНрд░рдХрд╛рд░ рдХреЗ ints рдХреЗ рд▓рд┐рдП (рд╣рд╛рд▓рд╛рдБрдХрд┐ рд╣рдо рдЗрд╕реЗ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдХрд░рддреЗ рд╣реИрдВ), рдпрд╣ Python int рд▓рд╛рдЧреВ рд╣реЛрдЧрд╛ рдЬреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рдкрд░рд┐рдгрд╛рдореЛрдВ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢рд┐рд╖реНрдЯ рдмрд┐рдВрджреБрдУрдВ рдкрд░ .NET рд╢рдмреНрджрд╛рд░реНрде рдХрд╛ рд╕рдореНрдорд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рдпреЛрдЧрджрд╛рди рдХрд┐рдП рдЧрдП рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдкреВрд░реНрдгрд╛рдВрдХ рд╡рд┐рднрд╛рдЬрди рдпрд╛ рд╕реНрдкрд╖реНрдЯ рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рд░реВрдкрд╛рдВрддрд░рдгред
    рд╡реИрд╕реЗ рднреА, рдЬрдм рдЖрдк "рдЕрдзрд┐рдХ рдкрд╛рдЗрдереЛрдирд┐рдХ" рдХрд╣рддреЗ рд╣реИрдВ рддреЛ рдЖрдкрдХрд╛ рдорддрд▓рдм рдХреЛрдб рд╢реИрд▓реА рдпрд╛ рджреЗрд╢реА рдПрдкреАрдЖрдИ рд╣реИ? Fable рдЕрдзрд┐рдХрд╛рдВрд╢ .NET BCL рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдВрдд рдореЗрдВ рд╣рдореЗрдВ рд╕рд╛рдорд╛рдиреНрдп рдлрд╝рдВрдХреНрд╢рди/рдСрдкрд░реЗрдЯрд░реЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рджреЗрд╡реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рдирд╡рд╛рдЧрдВрддреБрдХ, рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдореЗрдВ рдкрд╛рдПрдВрдЧреЗ)ред рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдореЗрдВ рджреЗрд╢реА рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рд╡рд┐рдХрд▓реНрдк рджреЗрдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реИ ( Fable.Extras рдЙрд╕ рдЕрд░реНрде рдореЗрдВ рдПрдХ рдЕрдЪреНрдЫрд╛ рдХрджрдо рд╣реИ)ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП JS.console.log рдЖрдорддреМрд░ рдкрд░ printfn рддреБрд▓рдирд╛ рдореЗрдВ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдЕрдзрд┐рдХ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдкреНрд░рд╛рд░реВрдкрд┐рдд рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдореЗрдВ рдмрд╛рдж рд╡рд╛рд▓реЗ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╡рд╣реА рд╣реИ рдЬреЛ рджреЗрд╡ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред

рдореБрдЭреЗ рдпрд╣ рд╡рд┐рдЪрд╛рд░ рдкрд╕рдВрдж рд╣реИред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдореИрдВ рдПрдл # рдореЗрдВ рдкрд╛рдпрдерди рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЙрдореНрдореАрдж рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдЖрджрд░реНрд╢ рд░реВрдк рд╕реЗ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╢реБрджреНрдз рдкрд╛рдпрдерди рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдпрд╛ SciSharp рдХрд╛ рдЙрдкрднреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рд╡рд┐рдХрд▓реНрдк рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП - рдЙрдирдХреЗ рдкрд╛рд╕ рд▓рдЧрднрдЧ рд╕рдЯреАрдХ рдПрдкреАрдЖрдИ рдкрд╛рдпрдерди рдХреЗ рд░реВрдк рдореЗрдВ рд╣реЛрддрд╛ рд╣реИ (рдкрд╛рдпрдерди рдпрд╛ .NET рд╕рдВрджрд░реНрдн рдореЗрдВ рд╕рдорд╛рди рдПрдл # рдХреЛрдб рдЪрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ!)

рдЗрд╕ рддрд░рд╣ рдХреЗ F# рдХреЛрдб рдХреЛ Fable in Python рдХреЗ рд╕рд╛рде рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдлрд┐рд░ рдиреЛрдЯрдмреБрдХ рдХрд░реНрдиреЗрд▓ (Jupyter рдпрд╛ .NET рдЗрдВрдЯрд░рдПрдХреНрдЯрд┐рд╡) рдХреЗ рднреАрддрд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдПрдирд╛рд▓рд┐рдЯрд┐рдХреНрд╕ рд╡рд░реНрдХрдлрд╝реНрд▓реЛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдбреЛрдореЗрди-рдЪрд╛рд▓рд┐рдд рд╕реБрд╡рд┐рдзрд╛ рдмрди рдЬрд╛рддрд╛ рд╣реИ (рдореИрдВ рдЗрд╕реЗ "рд╣рддреНрдпрд╛ рдХреА рд╕реБрд╡рд┐рдзрд╛" рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рди рд╕рдХрддрд╛ рдерд╛)ред

.NET рдЗрдВрдЯрд░рдПрдХреНрдЯрд┐рд╡ рдмрд╣реБрдд рдПрдХреНрд╕реНрдЯреЗрдВрд╕рд┐рдмрд▓ рд╣реИ, F# рдХрд░реНрдиреЗрд▓ рдХреЗ рдЕрдВрджрд░ Fable рдЪрд▓рд╛рдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИ (рдореЗрд░реЗ рдкрд╛рд╕ PoC рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ)ред

рдПрдХ рдФрд░ рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдореИрдВ рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдПрдордПрд╕ рдЬрд▓реНрдж рд╣реА рдкреВрд░реЗ .NET рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдЗрд╕реА рддрд░рд╣ рдХреА рд╢рд╛рдВрддрд┐ рдкреНрд░рдХрдЯ рдХрд░реЗрдЧрд╛ (рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рдХреЗрд╡рд▓ рдЧрддрд┐рд╡рд┐рдзрд┐рдпреЛрдВ рдФрд░ рд▓рдХреНрд╖реНрдпреЛрдВ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИред рдиреЗрдЯ рдЗрдВрдЯрд░рдПрдХреНрдЯрд┐рд╡ рдЯреИрдХрд▓ рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЧрд▓рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реВрдВ)ред рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рдЕрдЧрд░ рд╡реЗ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рднреА рд╣рдо рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдПрдХ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рджреБрдирд┐рдпрд╛ рдореЗрдВ рдЬреЗрдПрд╕/рдПрдл #/рдкрд╛рдпрдерди рд╢рд╕реНрддреНрд░рд╛рдЧрд╛рд░ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдлреИрдмрд▓ рдХреЛ рдЕрд▓рдЧ рд╕реЗ рд░рдЦрд╛ рдЬрд╛рдПред рдПрдордПрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдмреНрд▓реЗрдЬрд╝рд░-рд╕реНрд╡рд╛рдж (рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ) рдХреА рддрд░рд╣ рдЕрдзрд┐рдХ рд╣реЛрдЧрд╛ред

рдзрдиреНрдпрд╡рд╛рдж, рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╣реИ @alfonsogarciacaro , @PawelStadnicki ред рдореЗрд░рд╛ рдорддрд▓рдм рдпрд╣ рдерд╛ рдХрд┐ рдЕрдЧрд░ рд╣рдо рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЛ .NET рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдЕрдзрд┐рдХ рдкрд╛рдпрдерди рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд░рдХреЗ "рдкрд╛рдпрдерди" рдорд╣рд╕реВрд╕ рдХрд░рдиреЗ рджреЗрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ (рддрдм рдЙрдиреНрд╣реЗрдВ рд╢рд╛рдпрдж рдЗрд╕рдХреЗ рдмрдЬрд╛рдп .NET рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП)ред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рджреЛрдиреЛрдВ рджреБрдирд┐рдпрд╛ рд╕реЗ рд╕рд░реНрд╡рд╢реНрд░реЗрд╖реНрда рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдпрд╣ рддрдп рдХрд░рдирд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдЖрдпрд╛рдд рдХрд░рдирд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдкрд╛рдпрдерди рд╕реЗ datetime рдпрд╛ .NET рд╕реЗ DateTime )ред рдЗрд╕рд▓рд┐рдП рдирд┐рд░реНрдгрдп рд▓реЗрдиреЗ рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рд╡рд╣реА рд▓рд╛рдЧреВ рдХрд░реЗрдВ рдЬреЛ рд╣рдо рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ (рдСрди-рдбрд┐рдорд╛рдВрдб) рдЪрд╛рд╣рддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐ рд╡рд╣реА рд╕рдорд╕реНрдпрд╛ Fable JS рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╣реИред рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдЖрдк рдПрдХ рд╡реЗрдм рдРрдк рд▓рд╛рдЧреВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдФрд░ рд╢рд╛рдпрдж рд╕рднреА .NET рдЙрдкрд▓рдмреНрдз рд╣реЛрдиреЗ рдХреА рдЙрдореНрдореАрдж рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдЖрдкрдХреЗ рдкрд╛рд╕ JS рдкрд╛рд░рд┐рд╕реНрдерд┐рддрд┐рдХреА рддрдВрддреНрд░ рддрдХ рдмреЗрд╣рддрд░ рдкрд╣реБрдВрдЪ рд╣реЛрдЧреАред

рдЗрд╕рд▓рд┐рдП рдкрд╣рд▓реЗ рд╕реЗ рдирд┐рд░реНрдгрдп рд▓реЗрдиреЗ рдХреА рдЬрд░реВрд░рдд рдирд╣реАрдВ рд╣реИред рдЖрдЗрдП рдЖрдЧреЗ рдмрдврд╝рддреЗ рд╣реИрдВ рдФрд░ рдЖрдЧреЗ рдмрдврд╝рддреЗ рд╣реИрдВ Fable рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдмрдирдирд╛ рдФрд░ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рд░рд╛рд╕реНрддреЗ рдореЗрдВ рдкреНрд░рд╢реНрди рдкреВрдЫрдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдкрд░рд┐рд╡рд░реНрддрди рдЖрджрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВред рд╕реАрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдХреБрдЫ рд╣реИред

рдкреАрдПрд╕: рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдмреАрдЯреАрдбрдмреНрд▓реНрдпреВ рдореЗрдВ рдПрдХ рдкреВрдВрдЫ-рдХреЙрд▓ рд╕рдЬрд╛рд╡рдЯреА рднреА рд╣реИ рдЬрд┐рд╕рдХрд╛ рд╣рдо рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рд╕рд┐рдВрдХ рдФрд░ рдПрд╕рд┐рдВрдХ рджреЛрдиреЛрдВ)ред рдпрд╣рд╛рдБ aioreactive рдореЗрдВ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдЙрдкрдпреЛрдЧ рд╣реИред

рдореБрдЭреЗ #1601 рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрддрд╛ рд╣реИред

рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдлреИрдмрд▓ рдХреЛ рдЗрддрдирд╛ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдмрдирд╛рдиреЗ рдХрд╛ рдХреЛрдИ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рд╣реИ рдХрд┐ рдЗрдиреНрд╣реЗрдВ рддреАрд╕рд░реЗ рдкрдХреНрд╖ рдХреЗ рдмреИрдХрдПрдВрдб "рдкреНрд▓рдЧрдЗрдиреНрд╕" рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ (рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрд▓рдПрд▓рд╡реАрдПрдо рд▓реЗрдХрд┐рди рдПрдл # рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢рд┐рд╖реНрдЯ)ред рдЕрдВрддрд╣реАрди рд╕рдВрднрд╛рд╡рдирд╛рдПред

рд╣рдо рдмреИрдмреЗрд▓ рдПрдПрд╕рдЯреА рдХреЛ рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдп (рдФрд░ рдЯрд╛рдЗрдк рдХрд┐рдпрд╛ рд╣реБрдЖ) рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдЗрд╕реЗ рдЖрд╕рд╛рдиреА рд╕реЗ рд╕реА-рдЬреИрд╕реА рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рд░реВрдкрд╛рдВрддрд░рд┐рдд/рдореБрджреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЕрдЧрд░ рдореИрдВрдиреЗ Fable рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рддреЗ рд╕рдордп рдХреБрдЫ рд╕реАрдЦрд╛ рд╣реИ, рддреЛ рдпрд╣ рд╣реИ рдХрд┐ рдПрдХ рд╕рд╛рдзрд╛рд░рдг F#-рд╕реЗ-рдЕрдиреНрдп-рднрд╛рд╖рд╛ рд╕рдВрдХрд▓рдХ рд▓рд┐рдЦрдирд╛ (рдЕрдзрд┐рдХ рдпрд╛ рдХрдо) рдЖрд╕рд╛рди рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдХрд╛рд╕ рдЕрдиреБрднрд╡ рдФрд░ рдПрдХреАрдХрд░рдг рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП F# рдХреЗ рд▓рд╛рдн рдХреЗ рд╕рд╛рде рдШрд░реНрд╖рдг рдХреЛ рдШрдЯрд╛рддрд╛ рд╣реИ рд╡рд┐рджреЗрд╢реА рдкрд╛рд░рд┐рд╕реНрдерд┐рддрд┐рдХреА рддрдВрддреНрд░ рдореВрд▓ рднрд╛рд╖рд╛ рдореЗрдВ рд╡рд┐рдХрд╕рд┐рдд рд╣реЛрдиреЗ рд╕реЗ рдЕрдзрд┐рдХ рд╡рдЬрди рдХрд╛ рдХрд╛рдлреА рдХрдард┐рди рд╣реИред

@alfonsogarciacaro рдиреЗ рдХреНрдпрд╛ рдХрд╣рд╛ред рдЙрд╕ рдЪреБрдиреМрддреА рдХрд╛ рдПрдХ рд╣рд┐рд╕реНрд╕рд╛ F# рдореЗрдВ рдЕрдзрд┐рдХ Fable BCL рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдорд╛рдЗрдЧреНрд░реЗрдЯ рдХрд░рдирд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рд╣рд░ рднрд╛рд╖рд╛ рдХреЗ рд▓рд┐рдП рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдЬрдмрдХрд┐ рдЬрдирд░реЗрдЯ рдХрд┐рдП рдЧрдП рдХреЛрдб рдХреЗ рд▓рд┐рдП рд╕реНрд╡реАрдХрд╛рд░реНрдп рдореВрд▓ рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдмрдирд╛рдП рд░рдЦрддреЗ рд╣реБрдП, рдХреБрдЫ рдРрд╕рд╛ рдЬреЛ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд╕рд╛рде рднреА рдЧреИрд░-рддреБрдЪреНрдЫ рд╣реИред

рджрд┐рд▓рдЪрд╕реНрдкред рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдерд╛ рдХрд┐ рдлреИрдмрд▓ рдмреАрд╕реАрдПрд▓ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣рд┐рд╕реНрд╕реЗ (рд╕рдВрднрд╡рддрдГ) рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рд▓рд┐рдЦреЗ рдЧрдП рдереЗред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрдзрд┐рдХ рдПрдл # рд╣реЛрдЧрд╛ред рдореБрдЭреЗ рдЗрд╕рдореЗрдВ рдХреЛрдИ рд╕рдВрджреЗрд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЗрд╕рдХрд╛ рдХреЛрдИ рдЕрдЪреНрдЫрд╛ рдХрд╛рд░рдг рд╣реИ - рдпрд╣ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдЖрд╕рд╛рди рдХреНрдпреЛрдВ рд╣реЛ рдЧрдпрд╛?

@jwosty (рдЗрддрдирд╛ рдЫреЛрдЯрд╛ рдирд╣реАрдВ) рдЙрддреНрддрд░ рд╣реИ: рдкреНрд░рджрд░реНрд╢рди рдХрд╛рд░рдгреЛрдВ рд╕реЗ, рдФрд░ F # рдкреНрд░рдХрд╛рд░ рдмрдирд╛рдо рдкреНрд░рдХрд╛рд░ рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рдХреЛ рдкрд╛рдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдЬреЛ рдореВрд▓ рд░реВрдк рд╕реЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рджреНрд╡рд╛рд░рд╛ рд╕рдорд░реНрдерд┐рдд рд╣реИ, рдФрд░ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкрд╛рд░рд┐рд╕реНрдерд┐рддрд┐рдХреА рддрдВрддреНрд░ рдХреЗ рднреАрддрд░ рдЙрддреНрдкрдиреНрди рдХреЛрдб рдХреЗ рдмреЗрд╣рддрд░ рдПрдХреАрдХрд░рдг рдХреЗ рд▓рд┐рдПред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ .NET BCL рдореЗрдВ FSharp.Core рд╢реАрд░реНрд╖ рдкрд░ рдПрдХ рдмрд╣реБрдд рдмрдбрд╝реА рдПрдкреАрдЖрдИ рд╕рддрд╣ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдПрдХ рдмрдбрд╝реА рдЯреАрдо рдХреЗ рдмрд┐рдирд╛ рдЗрд╕ рдкреНрд░рдпрд╛рд╕ рдХреЛ рдмрдирд╛рдП рд░рдЦрдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ (рд╣рд╛рд▓рд╛рдВрдХрд┐ @alfonsogarciacaro рдХрд┐рд╕реА рднреА рддрд░рд╣ рдЗрд╕реЗ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдмрдирд╛рдП рд░рдЦрдиреЗ рдФрд░ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдЕрджреНрднреБрдд рдФрд░ рдкреНрд░рд╢рдВрд╕рдиреАрдп рд╣реИ)ред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдЬреЛ рдХрд╣рдирд╛ рдЪрд╛рд╣ рд░рд╣рд╛ рд╣реВрдВ рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ рдпреЛрдЧрджрд╛рди (рдФрд░ рд╡рд┐рдЪрд╛рд░) рдХрд╛ рдмрд╣реБрдд рд╕реНрд╡рд╛рдЧрдд рдФрд░ рд╕рд░рд╛рд╣рдирд╛ рдХреА рдЬрд╛рддреА рд╣реИред

(рдЗрддрдирд╛ рдЫреЛрдЯрд╛ рдирд╣реАрдВ) рдЙрддреНрддрд░ рд╣реИ: рдкреНрд░рджрд░реНрд╢рди рдХрд╛рд░рдгреЛрдВ рд╕реЗ, рдФрд░ F # рдкреНрд░рдХрд╛рд░ рдмрдирд╛рдо рдкреНрд░рдХрд╛рд░ рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рдХреЛ рдкрд╛рдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдЬреЛ рдореВрд▓ рд░реВрдк рд╕реЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рджреНрд╡рд╛рд░рд╛ рд╕рдорд░реНрдерд┐рдд рд╣реИ, рдФрд░ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкрд╛рд░рд┐рд╕реНрдерд┐рддрд┐рдХреА рддрдВрддреНрд░ рдХреЗ рднреАрддрд░ рдЙрддреНрдкрдиреНрди рдХреЛрдб рдХреЗ рдмреЗрд╣рддрд░ рдПрдХреАрдХрд░рдг рдХреЗ рд▓рд┐рдПред

рдореИрдВ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реБред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдЬреЛ рдХрд╣рдирд╛ рдЪрд╛рд╣ рд░рд╣рд╛ рд╣реВрдВ рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ рдпреЛрдЧрджрд╛рди (рдФрд░ рд╡рд┐рдЪрд╛рд░) рдХрд╛ рдмрд╣реБрдд рд╕реНрд╡рд╛рдЧрдд рдФрд░ рд╕рд░рд╛рд╣рдирд╛ рдХреА рдЬрд╛рддреА рд╣реИред

рдкрдХреНрдХрд╛! рдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдВ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреА рдмрдбрд╝реА рдФрд░ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЛ рдмрдирд╛рдП рд░рдЦрдиреЗ рдореЗрдВ рдХрд┐рддрдирд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЖрдкрдХреЗ рдЦреВрди рдХреЗ рдкрд╕реАрдиреЗ рдФрд░ рдЖрдБрд╕реВ рдХреА рд╕рд░рд╛рд╣рдирд╛ рдХрд░рддрд╛ рд╣реВрдВ рдЬреЛ рдЖрдк рд▓реЛрдЧреЛрдВ рдиреЗ рдЗрд╕рдореЗрдВ рдбрд╛рд▓рд╛ рд╣реИред рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдпреЛрдЧрджрд╛рди рдХрд░рдиреЗ рдХреЗ рд╕реНрдерд╛рдиреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреА рдЖрдБрдЦреЗрдВ рдЦреБрд▓реА рд░рдЦ рд░рд╣рд╛ рд╣реВрдБ, рдХреНрдпреЛрдВрдХрд┐ рдХрд▓реНрдкрд┐рдд рдХрд╣рд╛рдиреА рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдореЗрд░реЗ рд▓рд┐рдП рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рд░рд╣реА рд╣реИ рдФрд░ рдореБрдЭреЗ рд╡рд╛рдкрд╕ рджреЗрдирд╛ рдЕрдЪреНрдЫрд╛ рд▓рдЧреЗрдЧрд╛ред

рдореИрдВ рдереЛрдбрд╝реА рдорджрдж рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рдерд╛ред рдореИрдВ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╡рд┐рдХрд╛рд╕ рдХреЗ рд▓рд┐рдП QuickTest рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ (рдпрд╛рдиреА dotnet fsi build.fsx quicktest )ред рд╡рд┐рдХрд╕рд┐рдд рдХрд░рддреЗ рд╕рдордп рдореИрдВ рдмреИрдмреЗрд▓ рдПрдПрд╕рдЯреА рдХреЛ рдХреИрд╕реЗ рдкреНрд░рд┐рдВрдЯ рдХрд░реВрдВ? ( рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВ : рдореБрдЭреЗ ASTViewer рдорд┐рд▓рд╛)ред

рдореЗрд░реА рд╡рд░реНрддрдорд╛рди рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдкрд╛рдпрдерди рдорд▓реНрдЯреАрд▓рд╛рдЗрди рд▓реИрдореНрдмреНрдбрд╛ (рдПрд░реЛ рдлрд╝рдВрдХреНрд╢рдВрд╕) рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд▓реИрдореНрдмреНрдбрд╛ рдХреЛ рдПрдХ рдирд╛рдорд┐рдд рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдмрджрд▓рдиреЗ рдФрд░ рдирд┐рдХрд╛рд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдЙрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВред рдпрд╣рд╛рдВ рдХрд┐рд╕реА рднреА рд╕реБрдЭрд╛рд╡ рдХреА рд╕рд░рд╛рд╣рдирд╛ рдХреА рдЬрд╛рдПрдЧреАред рдЬреИрд╕реЗ:

let fn args cont  =
    cont args

let b = fn 10 (fun a ->
    a + 1
)

рдореЗрдВ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА:

let fn args cont  =
    cont args

let cont a =
    a + 1
let b = fn 10 cont

рдПрдХ рдХреЙрд▓ рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рдХреЛ рдХрдИ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯреНрд╕ рдХреЗ рд╕рд╛рде рдмрджрд▓рддреЗ рд╕рдордп рдореБрдЭреЗ рдХреИрд╕реЗ рд╕реЛрдЪрдирд╛ рдЪрд╛рд╣рд┐рдП рдХреНрдпреЛрдВрдХрд┐ рдлрдВрдХреНрд╢рди рдХреЙрд▓ рдХреЛ рдЖрд░реНрдЧреНрд╕ рдХреЗ рд╕рд╛рде рдмрджрд▓рдиреЗ рдХреЗ рдмрд╛рдж рдореБрдЭреЗ рдЗрд╕реЗ рдЙрдЪреНрдЪ рд╕реНрддрд░ рдкрд░ рдмрджрд▓рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ, рдпрд╛ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреЗ рдмреНрд▓реЙрдХ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреИрд╕реЗ if true then ... рдХреЛрдИ рд╡рд┐рдЪрд╛рд░?

@dbrattli рдпрд╣ рдкреНрд░рд┐рдВрдЯрд░ рднреА рджреЗрдЦреЗрдВ, рдЬреЛ рдХреБрдЫ рдЧреБрдгреЛрдВ рдХреЛ рднреА рдкреНрд░рд┐рдВрдЯ рдХрд░рддрд╛ рд╣реИред

рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдерд╛ рдХрд┐ рдлреИрдмрд▓ рдмреАрд╕реАрдПрд▓ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣рд┐рд╕реНрд╕реЗ (рд╕рдВрднрд╡рддрдГ) рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рд▓рд┐рдЦреЗ рдЧрдП рдереЗред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрдзрд┐рдХ рдПрдл # рд╣реЛрдЧрд╛ред рдореБрдЭреЗ рдЗрд╕рдореЗрдВ рдХреЛрдИ рд╕рдВрджреЗрд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЗрд╕рдХрд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рдХрд╛рд░рдг рд╣реИ - рдпрд╣ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдЖрд╕рд╛рди рдХреНрдпреЛрдВ рд╣реЛ рдЧрдпрд╛?

рд╣рд╛рдВ, рдЬреИрд╕рд╛ рдХрд┐ @ncave рдиреЗ рдХрд╣рд╛, рдореБрдЦреНрдп рдХрд╛рд░рдг рдЕрдзрд┐рдХ рдорд╛рдирдХ JS рдЙрддреНрдкрдиреНрди рдХрд░рдирд╛ рдерд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдлрд╝рдирд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рд╕рднреА FSharp.Core рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди F# рдореЗрдВ рд▓рд┐рдЦреЗ рдЧрдП рдереЗ, рд▓реЗрдХрд┐рди Fable рдХреЗ рд╕рд╛рде рдЬрдм рднреА рд╕рдВрднрд╡ рд╣реЛ рдореИрдВ JS рдорд╛рдирдХреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХреАрдХреГрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП .NET IEnumerable рдХреЗ рдмрдЬрд╛рдп JS рдЗрдЯрд░реЗрдЯрд░реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛) рдЬрд┐рд╕рд╕реЗ рдХрдИ рдЪрд┐рдХрди-рдФрд░-рдЕрдВрдбреЗ рдХреА рд╕рдорд╕реНрдпрд╛рдПрдВ рдЖрдИрдВ рд╢реБрд░реБрдЖрдд рдореЗрдВ рдЗрд╕реЗ JS/рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рд▓рд┐рдЦрдирд╛ рдЖрд╕рд╛рди рдерд╛ред рд╢реБрд░реБрдЖрдд рдореЗрдВ рдореБрдЭреЗ рдлреИрдм-рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ рдПрдХ рдЕрд▓рдЧ рдкреИрдХреЗрдЬ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░рдиреЗ рдХрд╛ рднреА рд╡рд┐рдЪрд╛рд░ рдерд╛ рдЬрд┐рд╕реЗ рдЬреЗрдПрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдЗрд╕реЗ рдЬрд▓реНрджреА рд╕реЗ рддреНрдпрд╛рдЧ рджрд┐рдпрд╛ред

Fable 2 рдореЗрдВ рд╣рдордиреЗ рдХреБрдЫ рдореЙрдбреНрдпреВрд▓реНрд╕ рдХреЛ F# рдореЗрдВ рдкреЛрд░реНрдЯ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рд╢реБрд░реВ рдХрд┐рдпрд╛ред рдпрд╣ рдмрд╣реБрдд рдлрд╛рдпрджреЗрдордВрдж рд░рд╣рд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдбреЙрдЧрдлреВрдбрд┐рдВрдЧ рдХреЛ рдмрдврд╝рд╛рддрд╛ рд╣реИ рдФрд░ рд╣рдореЗрдВ рдЖрд╕рд╛рдиреА рд╕реЗ FSharp.Core рдореЗрдВ рд╕реБрдзрд╛рд░реЛрдВ рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рджреЗрддрд╛ рд╣реИ (рдЬреИрд╕рд╛ рдХрд┐ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдирдХреНрд╢реЗ рдФрд░ рд╕реЗрдЯ рдХреЗ рд╕рд╛рде)ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЪрд┐рдХрди рдФрд░ рдЕрдВрдбреЗ рдХреЗ рдореБрджреНрджреЛрдВ рдХреЗ рдЖрд╕рдкрд╛рд╕ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣рд╛рдВ рдФрд░ рд╡рд╣рд╛рдВ рдХреБрдЫ рд╣реИрдХ рдЕрднреА рднреА рд╣реИрдВред рдФрд░ рдЪрд▓реЛ рдмрдбрд╝реЗ рд░рд╛рдХреНрд╖рд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдХрд┐ рд░рд┐рдкреНрд▓реЗрд╕рдореЗрдВрдЯ рдореЙрдбреНрдпреВрд▓ рд╣реИ :)

рдЬреИрд╕рд╛ рдХрд┐ @ncave рдХрд╣рддреЗ рд╣реИрдВ, рдЗрд╕ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЛ рдмрдирд╛рдП рд░рдЦрдирд╛ рдПрдХ рдмрд╣реБрдд рдмрдбрд╝рд╛ рдЙрдкрдХреНрд░рдо рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рд░рдЦрд░рдЦрд╛рд╡ рд╕рддрд╣ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмреАрд╕реАрдПрд▓ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдмрдврд╝рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдореЗрд╢рд╛ рдЕрдирд┐рдЪреНрдЫреБрдХ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдореИрдВ рдмрд╣реБрдд рднрд╛рдЧреНрдпрд╢рд╛рд▓реА рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рдХрдИ рдорд╣рд╛рди рдпреЛрдЧрджрд╛рди рд░рд╣реЗ рд╣реИрдВ рдмрд┐рд▓реНрдХреБрд▓ рд╢реБрд░реВ рд╕реЗред

@dbrattli рдПрдПрд╕рдЯреА рдХреЛ рдкреНрд░рд┐рдВрдЯ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ, рдпрд╣ рдХреБрдЫ рд╕рдордп рд╣реЛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдореИрдВрдиреЗ Fable рд░реЗрдкреЛ рдореЗрдВ ASTViewer рдЯреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИред рдмреЗрд╣рддрд░ рд╡рд┐рдХрд▓реНрдк @ncave рдпрд╛ рд╡рд┐рдЬрд╝реБрдЕрд▓рд╛рдЗрдЬрд╝рд░ рджреНрд╡рд╛рд░рд╛ рдЗрдВрдЧрд┐рдд рдХрд┐рдП рдЧрдП рд╣реИрдВ, рдЬреЛ рдХрд┐ рдореИрдВ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ рдЬрдм рдореБрдЭреЗ рдПрдл # рдПрдПрд╕рдЯреА рдХрд╛ рдирд┐рд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ (рдмрд╕ рдЯрд╛рдЗрдк рдХрд┐рдП рдЧрдП рдПрдПрд╕рдЯреА рдХрд╛ рдЪрдпрди рдХрд░рдирд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ)ред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЕрднреА рддрдХ Fable рдпрд╛ Bable AST рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреНрд░рд┐рдВрдЯрд░ рдирд╣реАрдВ рд╣реИрдВред рдлреИрдмрд▓ рдПрдПрд╕рдЯреА рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╕рд┐рд░реНрдл рдпреВрдирд┐рдпрди рд╣реИ рдФрд░ рдПрдХ рд╕рд╛рдзрд╛рд░рдг printfn "%A" рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╕реНрдерд╛рди рдХреА рдЬрд╛рдирдХрд╛рд░реА рдереЛрдбрд╝реА рд╢реЛрд░ рд╣реИред

рд▓реИрдореНрдмреНрдбрд╛ рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВред рдпрд╣ рд╕рдВрднрд╡ рд╣реИ рд▓реЗрдХрд┐рди рдХреБрдЫ рдХрд╛рдо рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдЖрдпрд╛рдд рдХреЗ рд╕рдорд╛рди рдХреБрдЫ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╛рдиреА, рдПрдПрд╕рдЯреА рдХреЛ рдкрд╛рд░ рдХрд░рддреЗ рд╕рдордп рдЙрдиреНрд╣реЗрдВ рдПрдХрддреНрд░рд┐рдд рдХрд░рдирд╛ , рдФрд░ рдЙрдиреНрд╣реЗрдВ рдПрдХ рдЕрджреНрд╡рд┐рддреАрдп рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдЕрд╕рд╛рдЗрди рдХрд░рдирд╛ред рдмрд╛рдж рдореЗрдВ рд╣рдо рдХреЗрд╡рд▓ рдлрд╝рд╛рдЗрд▓ рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рдлрд╝рдВрдХреНрд╢рди рдШреЛрд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдореБрдЦреНрдп рдЪреБрдиреМрддреА рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рдХреИрдкреНрдЪрд░ рдХрд┐рдП рдЧрдП рдорд╛рди рд╣реЛрдВрдЧреЗ, рдореБрдЭреЗ рдпрд╛рдж рдирд╣реАрдВ рд╣реИ рдХрд┐ рдПрдл # рдПрдПрд╕рдЯреА рдХреЗ рдкрд╛рд╕ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЙрд╕рдХреЗ рдкрд╛рд╕ рднреА рд╣реИ, рддреЛ рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ рд╣рдо рдЗрд╕реЗ рдПрдПрд╕рдЯреА рдореЗрдВ рдирд╣реАрдВ рд░рдЦрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рд▓реИрдореНрдмреНрдбрд╛ рдмреЙрдбреА рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рд╕рднреА рдкрд╣рдЪрд╛рдиреЛрдВ рдХреЛ рдвреВрдВрдвреЗрдВ рдЬреЛ рддрд░реНрдХреЛрдВ (рдпрд╛ рд▓реИрдореНрдмреНрдбрд╛ рдХреЗ рднреАрддрд░ рдмрд╛рдЗрдВрдбрд┐рдВрдЧ) рдХреЗ рдЕрдиреБрд░реВрдк рдирд╣реАрдВ рд╣реИрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рд▓реИрдореНрдмреНрдбрд╛ рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд рддрд░реНрдХреЛрдВ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддреЗ рд╣реИрдВ (рдФрд░ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЙрдиреНрд╣реЗрдВ рдХрд░реА рдореЗрдВ рд╣рд╕реНрддрдХреНрд╖реЗрдк рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рд╢реБрд░реБрдЖрдд рдореЗрдВ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП)ред

рдмрдврд╝рд┐рдпрд╛ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж @alfonsogarciacaro , рдореЗрд░рд╛ рдкрд╣рд▓рд╛ PoC рд╕рд┐рд░реНрдл Babel.fs / Fable2Babel.fs , BabelPrinter.fs рдЖрджрд┐ рдХреЛ рдмрджрд▓ рд░рд╣рд╛ рдерд╛ред рдЕрдм рдореИрдВрдиреЗ рдПрдХ рдЕрд▓рдЧ рдкрд╛рдпрдерди рдПрдПрд╕рдЯреА рдпрд╛рдиреА Python.fs рд╕рд╛рде рд╢реБрд░реБрдЖрдд рд╕реЗ рд╢реБрд░реБрдЖрдд рдХреА рд╣реИред PythonPrinter.fs ред рдлрд┐рд░ рдореИрдВ Babel2Python.fs рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реВрдБрдЧрд╛ рддрд╛рдХрд┐ Babel AST рд╕реЗ Python AST рдореЗрдВ рд░реВрдкрд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ Fable AST рд╕реЗ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рд╣реЛрдиреЗ рд╕реЗ рдЖрд╕рд╛рди рд╣реЛ рд╕рдХрддрд╛ рд╣реИ (рд▓реЗрдХрд┐рди Fable2Python.fs рд╕рд╛рде рднреА рд╕рдВрднрд╡ рд╣реИ рдпрджрд┐ Babel рд╕реЗ рдХрдирд╡рд░реНрдЯ рдХрд░рдирд╛ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ) рдХрдард┐рди)ред рдЗрд╕ рддрд░рд╣ рдореИрдВ рдореМрдЬреВрджрд╛ рдХреЛрдб рдмреЗрд╕ рдХреЛ рдмрд╣реБрдд рдЬреНрдпрд╛рджрд╛ рдирд╣реАрдВ рдЫреВрдКрдВрдЧрд╛, рдФрд░ рдореЗрд░рд╛ рдЕрдкрдирд╛ рдкрд░рд┐рд╡рд░реНрддрди рд╣реЛрдЧрд╛ рдЬрд╣рд╛рдВ рдореИрдВ рд▓реИрдореНрдмреНрдбрд╛ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛ред

рдпрд╣ рд╕рдордЭ рдЖрддрд╛ рд╣реИред рдПрдХ рдХрдард┐рдирд╛рдИ рдпрд╣ рд╣реИ рдХрд┐ рдмреЗрдмреЗрд▓ рдПрдПрд╕рдЯреА рдбреАрдпреВ рд╕реЗ рдирд╣реАрдВ рдмрдирд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдкреИрдЯрд░реНрди рдорд┐рд▓рд╛рди рдХреЗ рд╕рд╛рде рдЗрд╕реЗ рдкрд╛рд░ рдХрд░рдирд╛ рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рдХрдард┐рди рд╣реИред рд╢рд╛рдпрдж #2158 рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИ?

@alfonsogarciacaro рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рддреАрд░-рдлрд╝рдВрдХреНрд╢рдВрд╕ рдФрд░ рдлрд╝рдВрдХреНрд╢рди-рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рдХреЗ рдкреБрдирд░реНрд▓реЗрдЦрди рдХреЛ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдареАрдХ рдХрд░рдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ (рдЖрд╢рд╛) рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИред рд╡рд┐рдЪрд╛рд░ рдпрд╣ рд╣реИ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ ( TransformAsExpr ) рднреА рдмрдпрд╛рдиреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рджреЗрддрд╛ рд╣реИ (рдЬрд┐рд╕реЗ рд╕рдВрдпреЛрдЬрд┐рдд рдХрд░рдиреЗ рдФрд░ рдмрдпрд╛рдиреЛрдВ рдХреА рдЕрдВрддрд┐рдо рд╕реВрдЪреА (рдЕрдВрддрд┐рдо-рдХрдерди-рд╕реНрддрд░) рддрдХ рд╕рднреА рддрд░рд╣ рд╕реЗ рдкрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдлрд┐рд░ рд╕рднреА рд▓реМрдЯрд╛рдП рдЧрдП рдмрдпрд╛рди (func-def) рдХреЛ рдКрдкрд░ рдФрд░ рдКрдкрд░ рдЙрдард╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдЕрдиреНрдп рдмрдпрд╛рдиреЛрдВ рдХреЗ рд╕рд╛рдордиреЗ рд▓рд┐рдЦрд╛ рдЬрд╛рдПрдЧрд╛ред рддреЛ рдПрдХ рддреАрд░- рдпрд╛ рдлрд╝рдВрдХреНрд╢рди-рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рдмрд╕ name-expression, [statement ] рд▓реМрдЯрд╛рдПрдЧрд╛ рдЬрд╣рд╛рдВ рддреАрд░/рдлрд╝рдВрдХреНрд╢рди-рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ рдмрдпрд╛рди рдФрд░ рдирд╛рдо-рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд╕рд╛рде рд▓реМрдЯрд╛ред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐:

module QuickTest

let fn args cont  =
    cont args

let b = fn 10 (fun a ->
    printfn "test"
    a + 1
)

рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЬреЗрдПрд╕ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ:

import { printf, toConsole } from "./.fable/fable-library.3.1.1/String.js";

export function fn(args, cont) {
    return cont(args);
}

export const b = fn(10, (a) => {
    toConsole(printf("test"));
    return (a + 1) | 0;
});

рдЬреЛ рдмрджрд▓реЗ рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрд╛рдпрдерди рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ:

from expression.fable.string import (printf, toConsole)

def fn(args, cont):
    return cont(args)


def lifted_5094(a):
    toConsole(printf("test"))
    return (a + 1) | 0


b = fn(10, lifted_5094)

рдореИрдВрдиреЗ рд╕реЛрдЪрд╛ рдХрд┐ рдореБрдЭреЗ рдХреНрд▓реЛрдЬрд░ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдореЗрдВ рд╕рдорд╕реНрдпрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдзрд┐рдХрд╛рдВрд╢ (рд╕рднреА?) рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдХреНрд▓реЛрдЬрд░ рдХреЛ рднреА рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреИрд╕реЗ:

module QuickTest

let add(a, b, cont) =
    cont(a + b)

let square(x, cont) =
    cont(x * x)

let sqrt(x, cont) =
    cont(sqrt(x))

let pythagoras(a, b, cont) =
    square(a, (fun aa ->
        printfn "1"
        square(b, (fun bb ->
            printfn "2"
            add(aa, bb, (fun aabb ->
                printfn "3"
                sqrt(aabb, (fun result ->
                    cont(result)
                ))
            ))
        ))
    ))

рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрд╛ рдЬрд╛рдПрдЧрд╛:

from expression.fable.string import (printf, toConsole)

def add(a, b, cont):
    return cont(a + b)


def square(x, cont):
    return cont(x * x)


def sqrt(x, cont):
    return cont(math.sqrt(x))


def pythagoras(a, b, cont):
    def lifted_1569(aa):
        toConsole(printf("1"))
        def lifted_790(bb):
            toConsole(printf("2"))
            def lifted_6359(aabb):
                toConsole(printf("3"))
                return sqrt(aabb, lambda result: cont(result))

            return add(aa, bb, lifted_6359)

        return square(b, lifted_790)

    return square(a, lifted_1569)

рд╡реИрд╕реЗ рднреА, рдпрд╣ рдЕрдЪреНрдЫреА рд╢реБрд░реБрдЖрдд рд╣реИ ЁЯШД

рдореИрдВрдиреЗ PHP рдХреЗ рд▓рд┐рдП рдХрд╛рдлреА рдХреБрдЫ рдХрд┐рдпрд╛, (рдФрд░ рдпрд╣ BGA рдкрд░ CrazyFarmers рдЪрд▓рд╛ рд░рд╣рд╛ рд╣реИ) рддреЛ рд╢рд╛рдпрдж рд╣рдо рдпрд╣рд╛рдВ рдкреНрд░рдпрд╛рд╕ рдХреЛ рдЬреЛрдбрд╝ рд╕рдХреЗрдВ?

https://github.com/thinkbeforecoding/peeble

@ncave рдХреНрдпрд╛ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЬреБрдкрд┐рдЯрд░ рдиреЛрдЯрдмреБрдХ рдЬреИрд╕реЗ рдЗрдВрдЯрд░реИрдХреНрдЯрд┐рд╡ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП Fable рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреЛрдИ рд╕реБрдЭрд╛рд╡ рд╣реИ? рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЬреБрдкрд┐рдЯрд░ рдЖрдкрдХреЛ рдПрдХ рдХреЛрдб рдЦрдВрдб (рд╕реЗрд▓) рджреЗрдЧрд╛ рдФрд░ рдХрд░реНрдиреЗрд▓ рдХреЛ рдЗрд╕ рдЯреБрдХрдбрд╝реЗ рдХреЛ рдкрд┐рдЫрд▓реЗ рдмрдпрд╛рдиреЛрдВ рд╕реЗ рдХрд┐рд╕реА рднреА рдореМрдЬреВрджрд╛ рд╕реНрдерд╛рдиреАрдп рдШреЛрд╖рдгрд╛ рдХреЗ рд╕рд╛рде рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

Fable рдЗрд╕рдХреЗ рд▓рд┐рдП рдЗрд╖реНрдЯрддрдо рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдПрдХ PoC рдмрдирд╛рдпрд╛ рд╣реИ рдЬрд╣рд╛рдБ рдореИрдВ рдкрд┐рдЫрд▓реЗ рдХрдердиреЛрдВ/рдШреЛрд╖рдгрд╛рдУрдВ (рдЪрд▓реЛ, рдЯрд╛рдЗрдк рдХрд░реЗрдВ, рдЦреБрд▓рд╛) рдХрд╛ рдПрдХ рдЖрджреЗрд╢рд┐рдд рд╢рдмреНрджрдХреЛрд╢ рд░рдЦрддрд╛ рд╣реВрдБ рдФрд░ рдЕрдВрддрд┐рдо рдХреЛрдб рдЦрдВрдб рдХреЗ рд╕рд╛рде рдХреНрд░рдо рдореЗрдВ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рд╡реИрдз F# рдкреНрд░реЛрдЧреНрд░рд╛рдо рдмрдирд╛рддрд╛ рд╣реВрдБред рдХреЛрдб рдЦрдВрдб рдореЗрдВ рдХрд┐рд╕реА рднреА рдШреЛрд╖рдгрд╛ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрди рд╕реЗ рдкрд╣рд▓реЗ рддрд╛рдирд╛ рд╕реЗ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдмрд╛рдж рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рд╕реЛрдЪ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рд╢рд╛рдпрдж рдХреЛрдИ рдмреЗрд╣рддрд░ рддрд░реАрдХрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВ?

рд╕реНрд░реЛрдд: https://github.com/dbrattli/Fable.Jupyter/blob/main/fable/kernel.py#L85

рддрдм рдореЗрд░реЗ рдкрд╛рд╕ рдкреГрд╖реНрдарднреВрдорд┐ рдореЗрдВ рдЪрд▓рдиреЗ рд╡рд╛рд▓реА рдПрдХ Fable cli рд╣реИ рдЬреЛ рдЬрдм рднреА Fable.fs рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддрдм рдЙрд╕реЗ рдкреБрди: рд╕рдВрдХрд▓рд┐рдд рдХрд░рддрд╛ рд╣реИред

dotnet watch -p src/Fable.Cli run -- watch --cwd /Users/dbrattli/Developer/GitHub/Fable.Jupyter --exclude Fable.Core --forcePkgs --python

@dbrattli рдЙрдЪрд┐рдд рд▓рдЧрддрд╛ рд╣реИ, рдЕрдЧрд░ рдЯреБрдХрдбрд╝реЗ рдЫреЛрдЯреЗ рд╣реИрдВред рдмрдбрд╝реЗ рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП, рд╢рд╛рдпрдж рдкреНрд░рддреНрдпреЗрдХ рд╕реЗрд▓ (рдЯреБрдХрдбрд╝рд╛) рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдЪреАрдЬреЛрдВ рдХреЛ рдЧрддрд┐ рдорд┐рд▓ рд╕рдХрддреА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ Fable рдХреБрдЫ рдХреИрд╢рд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЙрди рдлрд╝рд╛рдЗрд▓реЛрдВ рдкрд░ рдЕрдирд╛рд╡рд╢реНрдпрдХ рдХрд╛рдо рдХреЛ рдЫреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдирд╣реАрдВ рдмрджрд▓реА рд╣реИрдВред

рдХреЗрд╡рд▓ FYI рдХрд░реЗрдВ, рдпрджрд┐ рдЖрдкрдХреЛ рдЕрдзрд┐рдХ рдирд┐рдпрдВрддреНрд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдЖрдк Fable рдХреЛ рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд░реВрдк рдореЗрдВ рднреА рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рди рдХрд┐ рдХреЗрд╡рд▓ CLI (рджреЗрдЦреЗрдВ fable-standalone , рдФрд░ рдПрдХ рдЙрдкрдпреЛрдЧ рдЙрджрд╛рд╣рд░рдг )ред

1) рдореЗрд░реА рдПрдХ рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ Fable AST рдореЗрдВ рдереНрд░реЛ/рд░рд╛рдЗрдЬ рдирд╣реАрдВ рд╣реИред рддреЛ рдЗрд╕реЗ рдПрдХ рдПрдорд┐рдЯ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдореЗрдВ рдмрдирд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдЬреЛ рдореЗрд░реЗ рд▓рд┐рдП рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдард┐рди (рдПрд░) рд╣реИред рдпрд╛ рдХрдо рд╕реЗ рдХрдо рдпрд╣ рдЕрдирд╛рд╡рд╢реНрдпрдХ рд▓рдЧрддрд╛ рд╣реИ рдЬрдм рдмреЗрдмреЗрд▓ рдХреЗ рдкрд╛рд╕ рдереНрд░реЛрд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рд╣реЛрддрд╛ рд╣реИред рдХреНрдпрд╛ рдЗрд╕рдХрд╛ рдХреЛрдИ рдЕрдЪреНрдЫрд╛ рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рдпрд╛ рдХреНрдпрд╛ рдореБрдЭреЗ рдЗрд╕реЗ рдареАрдХ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП? @alfonsogarciacaro

let divide1 x y =
   try
      Some (x / y)
   with
      | :? System.DivideByZeroException -> printfn "Division by zero!"; None

let result1 = divide1 100 0

рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ:

export function divide1(x, y) {
    try {
        return ~(~(x / y));
    }
    catch (matchValue) {
        throw matchValue;
    }
}

export const result1 = divide1(100, 0);

рдЬрд╣рд╛рдВ throw matchValue рдПрдХ EmitExpression ред

2) рдХреНрдпрд╛ рд╣рдореЗрдВ Fable AST рдореЗрдВ ThisExpr рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рд┐рдП, рддрд╛рдХрд┐ рдореИрдВ рдпрд╣ рдкрд╣рдЪрд╛рди рд╕рдХреВрдВ рдХрд┐ this рдХрд╛ рдЙрдкрдпреЛрдЧ рдЗрд╕ рдХреАрд╡рд░реНрдб рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реЛ рд░рд╣рд╛ рд╣реИ рдХрд┐ Fable.IdentExpr рдХреЛ this рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдпрджрд┐ рдпрд╣ рдпрд╣-рдХреАрд╡рд░реНрдб рд╣реИ рдпрд╛ рдирд╣реАрдВ, рдХреНрдпреЛрдВрдХрд┐ рдЙрдиреНрд╣реЗрдВ рдкрд╛рдпрдерди рдореЗрдВ self рдореЗрдВ рдЕрдиреБрд╡рд╛рджрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
https://github.com/fable-compiler/Fable/blob/nagareyama/src/Fable.Transforms/Fable2Babel.fs#L792

рдпрд╣ рдордЬрд╝реЗрджрд╛рд░ рд╣реИ, рдереНрд░реЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ Fable 2 AST рдореЗрдВ рдерд╛ рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ AST рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреЗ рдкреНрд░рдпрд╛рд╕ рдореЗрдВ Fable 3 рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреЗрд╡рд▓ рдПрдХ рд╣реА рд╕реНрдерд╛рди рдкрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред

"рдЗрд╕" рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ, рдпрд╣ рдореБрд╢реНрдХрд┐рд▓ рд╣реИред рдореБрдЭреЗ рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рдЬрд╛рдВрдЪрдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдПрдл # рдПрдПрд╕рдЯреА рдореЗрдВ рдЗрд╕реЗ рдХрдиреНрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдпрд╛ рд╡рд┐рдзрд┐рдпреЛрдВ рдореЗрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдХреЛрдб рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдмрд┐рдЦрд░реЗ рд╣реБрдП рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдВ рд╣реИрдВ)ред Fable AST рдореЗрдВ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП IsThisArgument рдкреНрд░реЙрдкрд░реНрдЯреА рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдпрд╣ рдЬрд╛рдВрдЪрдиреЗ рджреЗрдВ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рдХреЗрд╡рд▓ рдЕрд▓рдЧ рд╕рджрд╕реНрдпреЛрдВ рдХреЗ рдкрд╣рд▓реЗ рддрд░реНрдХ рдХреЗ рд▓рд┐рдП рд╣реИ рдпрд╛ рдпрд╣ "рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЗрд╕" рдХреЗ рд▓рд┐рдП рднреА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред

@alfonsogarciacaro рдореИрдВ "рдЖрдВрддрд░рд┐рдХ" рдмрдирд╛рдо "рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛" рд╕рдВрдХрд▓рд┐рдд рдХреЛрдб рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЗ рд╕рд╛рде рдереЛрдбрд╝реА рдорджрдж рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЕрдкрд╡рд╛рдж .message , рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЗрд╕рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдХреИрд╕реЗ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП? рдХреНрдпрд╛ рдореИрдВ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕рдВрдХрд▓рд┐рдд рдХреЛрдб рдореЗрдВ рдХрднреА рднреА .message рд╣реЛрдЧрд╛ рдФрд░ рд╣рдореЗрд╢рд╛ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдорд╛рдкреНрдд рд╣реЛрдЧрд╛ рдЬреИрд╕реЗ Test__Message_229D3F39(x, e) рддрд╛рдХрд┐ рд╡реЗ рдХрднреА рд╣рд╕реНрддрдХреНрд╖реЗрдк рди рдХрд░реЗрдВ? рдпрд╛ рдХреНрдпрд╛ рдореБрдЭреЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП JsException рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рднреАрддрд░ рдПрдХ рдХреИрдЪ'рдПрдб рдЕрдкрд╡рд╛рдж рд▓рдкреЗрдЯрдирд╛ рд╣реИ рдФрд░ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП .message рд╕рдВрдкрддреНрддрд┐ рдЬреЛрдбрд╝рдирд╛ рд╣реИ? Fable рдЗрд╕реЗ F# рд╕реЗ Babel рддрдХ рдХреИрд╕реЗ рдХрд░рддреЗ рд╣реИрдВ? рдХреНрдпрд╛ рдЖрдк рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдЯреНрд░реИрдХ рд░рдЦрддреЗ рд╣реИрдВ, рдпрд╛?

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП: рдХреИрд╕реЗ рдХрд░рддрд╛ рд╣реИ ex.Message.StartsWith рдПрдл рдореЗрдВ # рдмрди ex.message.indexOf рдЬреЗ рдПрд╕ рдореЗрдВ? рдореБрдЭреЗ рдЗрд╕реЗ рдкрд╛рдпрдерди рдореЗрдВ str(ex).index рдореЗрдВ рдЕрдиреБрд╡рд╛рдж рдХрд░рдирд╛ рд╣реЛрдЧрд╛ (рдпрд╛ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд▓рдкреЗрдЯрдирд╛ рд╣реЛрдЧрд╛)ред

рдЕрд╕рд▓ рдореЗрдВ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдл # рдЕрдкрд╡рд╛рджреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдорд╕реНрдпрд╛ рд╣реИ (рдЬреИрд╕рд╛ рдХрд┐: int * int рдХреЗ рдЕрдкрд╡рд╛рдж рдлреВ) рдореИрдВрдиреЗ Fable 3 рд░рд┐рд▓реАрдЬ рд╕реЗ рдкрд╣рд▓реЗ рдареАрдХ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдерд╛ System.Exception рдХреЛ рдЬреЗрдПрд╕ рддреНрд░реБрдЯрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдиреБрд╡рд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЙрдирдХреЗ рдкрд╛рд╕ рдПрдХ .message рдлрд╝реАрд▓реНрдб рд╣реИред рд▓реЗрдХрд┐рди рдПрдл # рдЕрдкрд╡рд╛рдж рдкреНрд░рджрд░реНрд╢рди рдХрд╛рд░рдгреЛрдВ рд╕реЗ рдЬреЗрдПрд╕ рддреНрд░реБрдЯрд┐ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдирд╣реАрдВ рд╣реЛ рд░рд╣реЗ рд╣реИрдВ (рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрднреА рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд░рд╣рд╛ рд╣реИред рд╕рдВрджреЗрд╢ рдмрд╕ рд╡рд┐рдлрд▓ рд░рд╣рддрд╛ рд╣реИ)ред рдЗрд╕рдХреЛ рд▓реЗрдХрд░ рдХрд╣реАрдВ рдЪрд░реНрдЪрд╛ рд╣реИред рдЖрдкрдХреЗ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рдЕрдкрд╡рд╛рдж рдХреЗ рд▓рд┐рдП рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдЕрднреА рдХреЗ рд▓рд┐рдП рдорд╛рди рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ Fable .message рдФрд░ .stack рдЧреБрдгреЛрдВ рддрдХ рдкрд╣реБрдВрдЪрддрд╛ рд╣реИред

рд╣рдо рдХреИрд╕реЗ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рднрд╛рд╖рд╛ рдХрд╛ рдЪрдпрди Fable рдореЗрдВ рд╣реЛ? рдЖрдЬ рд╣рдо --typescript рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдЪрдпрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП рд╣рдо --python рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрд╛рдпрдерди рдХрд╛ рдЪрдпрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рд╣рдореЗрдВ рддрдм .js рдЙрддреНрдкрдиреНрди рдХрд░рдирд╛ рдмрдВрдж рдХрд░ рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдП? рд╣рдореЗрдВ рд╢рд╛рдпрдж рдРрд╕рд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдХреНрдпреЛрдВрдХрд┐ рдЙрддреНрдкрдиреНрди рдЬреЗрдПрд╕ рдорд╛рдиреНрдп рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдПрдорд┐рдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдХрднреА-рдХрднреА рд╣рдо рдЬреЗрдПрд╕ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдХреНрдпрд╛ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ --javascript рд╡рд┐рдХрд▓реНрдк рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдпрд╛ рдХреНрдпрд╛ рд╣рдореЗрдВ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ --python рдмрд┐рдирд╛ рдЪрд▓рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП? @alfonsogarciacaro

@dbrattli --typescript рдХреЗрд╡рд▓ .ts рдлрд╛рдЗрд▓реЗрдВ рдЬреЗрдирд░реЗрдЯ рдХрд░рддрд╛ рд╣реИ, .py рдпрджрд┐ рдЖрдк рдЪрд╛рд╣реЗрдВ рддреЛ --python рд╕рд┐рд░реНрдл .py рдлрд╛рдЗрд▓реЗрдВ рдЬреЗрдирд░реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рд▓реЗрдХрд┐рди рддрдХрдиреАрдХреА рд░реВрдк рд╕реЗ рд╡реЗ рд╕рдм рдкрд░рд╕реНрдкрд░ рдЕрдирдиреНрдп рд╣реИрдВ, рддреЛ рд╣рдо рдмрдЬрд╛рдп рдПрдХ рдирдпрд╛ рдкрд░рд┐рдЪрдп рдЪрд╛рд╣рд┐рдП --language рд╕реНрд╡рд┐рдЪ, рдореВрд▓реНрдпреЛрдВ рдХреЗ рд╕рд╛рде JavaScript/TypeScript/Python ?

@ncave рд╣рд╛рдВ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИ рдЬреИрд╕реЗ [-lang|--language {"JavaScript"|"TypeScript"|"Python"}] рдЬрд╣рд╛рдВ JavaScript рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд╣реА рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЗ рд▓рд┐рдП рдПрдХ рднрд╛рд╖рд╛ рдЧреБрдг рдЬреЛрдбрд╝рдирд╛ рд╢реБрд░реВ рдХрд░ рджрд┐рдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЛ рднреА рдареАрдХ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ? https://github.com/fable-compiler/Fable/pull/2345/files#diff -9cb94477ca17c7556e6f79d71ed20b71740376f7f3b00ee0ac3fdd7e519ac577R12

рдХреБрдЫ рд╕реНрдерд┐рддрд┐ред рдкрд╛рдпрдерди рд╕рдорд░реНрдерди рдмреЗрд╣рддрд░ рд╣реЛ рд░рд╣рд╛ рд╣реИред рдХрдИ рднрд╛рд╖рд╛ рд╕реБрд╡рд┐рдзрд╛рдПрдБ рдЕрдм рдЬрдЧрд╣ рдореЗрдВ рд╣реИрдВред рд╡рд┐рд╢рд╛рд▓ рд╢реЗрд╖ рдХрд╛рд░реНрдп рдХрд▓реНрдкрд┐рдд-рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЛ рдкреЛрд░реНрдЯ рдХрд░рдирд╛ рд╣реИред рдЗрд╕реЗ рдЖрд╕рд╛рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╛рдпрдерди рдХреЗ рд▓рд┐рдП рдлреИрдмрд▓-рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ рд░реЗрдкреЛ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдХрдИ рдлрд╝реЗрдмрд▓-рд▓рд╛рдЗрдмреНрд░реЗрд░реА .fs рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдкрд╛рдпрдерди рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдФрд░ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЙрдирдореЗрдВ рд╕реЗ рдХрдИ рдореЗрдВ рдЬреЗрдПрд╕ рдЙрддреНрд╕рд░реНрдЬрд┐рдд рдХреЛрдб рд╣реЛрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ "рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ" рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯ рдФрд░ рд╣реИрдВрдбрд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдкрд╛рдпрдерди рдХреЗ рд▓рд┐рдП рдПрдХ рдкрд░реАрдХреНрд╖рдг рд╕реЗрдЯрдЕрдк (рдкрд╛рдЗрдЯреЗрд╕реНрдЯ рдкрд░ рдЖрдзрд╛рд░рд┐рдд) рд╡рд░реНрддрдорд╛рди рдореЗрдВ 43 рдкрд░реАрдХреНрд╖рдг рдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕рд╕реЗ рдирдИ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдирд╛ рдФрд░ рдЬреЛрдбрд╝рдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ (рдФрд░ рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ)ред

рдкрд╛рдпрдерди рдХреЗ рд▓рд┐рдП рдлреИрдмрд▓-рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдмрдирд╛рдПрдБ: dotnet fsi build.fsx library-py
рдкрд╛рдпрдерди рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рдПрдБ: dotnet fsi build.fsx test-py

@dbrattli
рдЖрджрд░реНрд╢ рд░реВрдк рд╕реЗ рд╣рдореЗрдВ рдЕрдзрд┐рдХ рд╕реЗ рдЕрдзрд┐рдХ fable-library рдХреЛ F# рдореЗрдВ рдмрджрд▓рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред List рдФрд░ Seq рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж рд╣реИрдВ, Array рдХрдо рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рджреЗрд╢реА рддрд░реАрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рд╢рд╛рдпрдж рдЙрдиреНрд╣реЗрдВ рдЕрд▓рдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдереЛрдбрд╝реЗ рдЕрд▓рдЧ рд╡рд┐рд╖рдп рдкрд░, рдЖрдкрдХреА рд░рд╛рдп рдореЗрдВ, рд╕реАрдзреЗ Fable AST рдХреЗ рдмрдЬрд╛рдп Babel AST рд╕реЗ рдПрдХ рдирдпрд╛ рднрд╛рд╖рд╛ рдХреЛрдбрдЬрди рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рдореБрдЦреНрдп рд▓рд╛рдн рдХреНрдпрд╛ рд╣реИрдВ?

@ncave рдкрд╛рдпрдерди рдФрд░ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛рдлреА рдХрд░реАрдм рд╣реИрдВ (рдЖрдИрдПрдордУ) рдЗрд╕рд▓рд┐рдП рдмреЗрдмреЗрд▓ рдПрдПрд╕рдЯреА рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдирд╛ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рдЖрд╕рд╛рди рд╣реИред рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рдХреБрдЫ JS рдХреЛ Python рдореЗрдВ рдкреЛрд░реНрдЯ рдХрд┐рдпрд╛ рд╣реИ рдЬреИрд╕реЗ RxJS рд╕реЗ RxPYред рд╣рдореЗрдВ "рдЕрдкрд╕реНрдЯреНрд░реАрдо" рдХрд┐рдП рдЬрд╛ рд░рд╣реЗ рд╕рднреА (рдмрдЧ-) рдлрд┐рдХреНрд╕ рдХрд╛ рднреА рд▓рд╛рдн рдорд┐рд▓рддрд╛ рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рдХрд╣рд╛ рдЧрдпрд╛ рд╣реИ, рд╣рдо рдореЗрдВ рд╕реЗ рдЬреНрдпрд╛рджрд╛рддрд░ рдХреЗ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реИ Fable2Babel.fs рдФрд░ рдПрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рдЕрдЬрдЧрд░ рдХреЛ рд╕реАрдзреЗ рдмрджрд▓рдиреЗ Fable2Python.fs рдХрд┐ рдЬреЛрдбрд╝рддреА / рдЧрд┐рд░ Fable2Babel.fs рдФрд░ Babel2Python.fs ред рдореИрдВрдиреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЖрдЬ рдкрд╣рд▓реЗ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрд╛ рдерд╛ред рдпрд╣ рддрдм рдПрдХ рдХрд╛рдВрдЯрд╛ рдХреА рддрд░рд╣ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рджреЛрдиреЛрдВ рдЬрдЧрд╣реЛрдВ рдкрд░ рдмрдЧрдлрд┐рдХреНрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рдЕрднреА рдХреЗ рд▓рд┐рдП рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдмреИрдмреЗрд▓ рдПрдПрд╕рдЯреА рдХреЛ рдмрджрд▓рдирд╛ рдареАрдХ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдВрддрддрдГ рд╣рдо рдлреИрдмрд▓ рдПрдПрд╕рдЯреА рдХреЛ рд╕реАрдзреЗ рдмрджрд▓рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред

рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реИ @dbrattli! рдЖрдкрдХреЗ рд╕рднреА рдХрд╛рдореЛрдВ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд-рдмрд╣реБрдд рдзрдиреНрдпрд╡рд╛рджред рдЕрд╕рд▓ рдореЗрдВ, рдореЗрд░реЗ рдорди рдореЗрдВ рдЬреЛ рдХреБрдЫ рдерд╛ рд╡рд╣ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рдЕрдзрд┐рдХрд╛рдВрд╢ Fable рдХреЛрдб рдбрд╛рд▓ рд░рд╣рд╛ рдерд╛ рдФрд░ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рд╕реНрд╡рддрдВрддреНрд░ рдбреЙрдЯрдиреЗрдЯ рдЯреВрд▓реНрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рд░рд┐рд▓реАрдЬрд╝ рдХрд░ рд░рд╣рд╛ рдерд╛: fable (-js), fable-py (рдпрд╛ рдХреЛрдИ рдЕрдиреНрдп рдирд╛рдо)ред рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╣рдореЗрдВ рд░рд┐рд▓реАрдЬ рдЪрдХреНрд░ рдореЗрдВ рдЕрдзрд┐рдХ рд╕реНрд╡рддрдВрддреНрд░рддрд╛ рджреЗрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдПрдХ рдПрдХрд▓ рдбреЙрдЯрдиреЗрдЯ рдЯреВрд▓ рдХреЗ рд╕рд╛рде рднреА рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдареАрдХ рд╣реВрдВ рдЬреЛ рджреЛрдиреЛрдВ рднрд╛рд╖рд╛рдУрдВ рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдЖрд╕рд╛рди рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЦрд╛рд╕рдХрд░ рд╢реБрд░реБрдЖрдд рдореЗрдВред

рдлреИрдмрд▓-рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ, рд╣рд╛рдБ, рдпрджрд┐ рд╕рдВрднрд╡ рд╣реЛ рддреЛ рдкрд╛рдЗрдерди рдореЗрдВ рд╡рд░реНрддрдорд╛рди .ts рдлрд╛рдЗрд▓реЛрдВ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдиреЗ рдХреЗ рдмрдЬрд╛рдп, рдЙрдиреНрд╣реЗрдВ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп F# рдкрд░ рдкреЛрд░реНрдЯ рдХрд░рдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред рд╣рдореЗрдВ Emit рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рднрд╛рдЧреЛрдВ рдХреЛ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ #if рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЙрдиреНрд╣реЗрдВ рдкрд╛рдпрдерди рдореЗрдВ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП:

#if FABLE_COMPILER_PYTHON
    [<Emit("print($0)")>]
    let log(x: obj) = ()

уАА// Other native methods ...
#else
    [<Emit("console.log($0)")>]
    let log(x: obj) = ()

    // ...
#endif

рдпрд╛ рд╣рдо рдПрдХ рдирдпрд╛ "рдмрд╣реБ-рднрд╛рд╖рд╛" рдПрдорд┐рдЯ рд╡рд┐рд╢реЗрд╖рддрд╛ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ:

type EmitLangAttribute(macros: string[]) =
    inherit Attribute()

[<EmitLang([|"js:console.log($0)"; "py:print($0)"|])>]
let log(x: obj) = ()

рдзрдиреНрдпрд╡рд╛рдж @alfonsogarciacaro рдФрд░ @ncave , рдпреЗ рдмрд╣реБрдд рдЕрдЪреНрдЫреЗ рд╡рд┐рдЪрд╛рд░ рд╣реИрдВред рдореИрдВ рдЙрдиреНрд╣реЗрдВ рдпрд╣ рджреЗрдЦрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛ рдХрд┐ рдХреНрдпрд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдореБрдЭреЗ Fable-Library рдХреЛ F# рдореЗрдВ рдЕрдиреБрд╡рд╛рдж рдХрд░рдиреЗ рдХрд╛ рд▓рд╛рдн рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдпрд╣рд╛рдВ рдорджрдж рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛ рдЬрдм рдПрдХ рдмрд╛рд░ рдкрд╛рдЗрдерди рдХрдВрдкрд╛рдЗрд▓рд░ рд╡рд╣рд╛рдВ рдлрд╛рдЗрд▓реЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛред #if рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдмрд╣реБрдд рдорджрдж рдорд┐рд▓рдиреА рдЪрд╛рд╣рд┐рдП, рдФрд░ рд╣рдо рд╢рд╛рдпрдж рднрд╛рд╖рд╛ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рдЙрддреНрд╕рд░реНрдЬрди рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдХреЗ #if s рд╕реЗ рдмрдЪ рд╕рдХрддреЗ рд╣реИрдВ (рдХреНрдпреЛрдВрдХрд┐ рдореЗрд░реЗ рдкрд╛рд╕ рдкрд╛рдпрдерди рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ .fsproj рдлрд╝рд╛рдЗрд▓ рд╣реИред

@alfonsogarciacaro рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рджреЛ рдЙрддреНрд╕рд░реНрдЬрди рдЧреБрдг рдХреНрдпреЛрдВ рдирд╣реАрдВ рд╣реИрдВ? JS рдХреЗ рд▓рд┐рдП Emit рдФрд░ Python рдХреЗ рд▓рд┐рдП EmitPyред рдЬрдм рдЬреЗрдПрд╕ рдЖрджрд┐ рдХреЗ рд▓рд┐рдП рдЙрддреНрд╕рд░реНрдЬрди рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИ рддреЛ рдкрд╛рдЗрдерди рдЯреНрд░рд╛рдВрд╕рдкрд┐рд▓рд░ рдХреЛ рдХрдордЬреЛрд░ рд╣реЛрдиреЗ рдХреА рд░рд┐рдкреЛрд░реНрдЯ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдПред

рдореЗрд░реЗ 2 рд╕реЗрдВрдЯ рдХреЗ рд▓рд┐рдП, рдореБрдЭреЗ рдПрдХ рдПрдХрд▓ рдПрдорд┐рдЯ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реЛрдиреЗ рдХрд╛ рд╡рд░реНрддрдорд╛рди рдХрдо рд╕рдВрдЬреНрдЮрд╛рдирд╛рддреНрдордХ рднрд╛рд░ рдкрд╕рдВрдж рд╣реИ рдЬреЛ рдмрд╕ рдЙрддреНрд╕рд░реНрдЬрд┐рдд рд╣реЛрддрд╛ рд╣реИред рдЗрдореЛ рдЬреЛ @dbrattli рдЕрднреА рдХрд░ рд░рд╣рд╛ рд╣реИ рд╡рд╣ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ (рдкреНрд░рддреНрдпреЗрдХ fable-library рднрд╛рд╖рд╛ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдлрд╝рд╛рдЗрд▓)ред рд╣рдо рдЕрд▓рдЧ-рдЕрд▓рдЧ рднрд╛рд╖рд╛ рдХреЗ рдЙрддреНрд╕рд░реНрдЬрди рдХреЛ рдЕрдкрдиреА рдлрд╛рдЗрд▓реЛрдВ рдореЗрдВ рдЕрд▓рдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдЗрдВрдЯрд░рдлреЗрд╕ (рдпрд╛ рдореЙрдбреНрдпреВрд▓) рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдмрд╛рдж рдореЗрдВ рд╕рд╛рдорд╛рдиреНрдп рдПрдл # рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕реЗ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдПрдХ рдЕрдЪреНрдЫрд╛ рдЙрджрд╛рд╣рд░рдг Array.Helpers рдХреЛ рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдирд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ (рдпрд╛ рдЗрд╕реЗ рдХреЗрд╡рд▓ рдореЙрдбреНрдпреВрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рдЫреЛрдбрд╝ рджреЗрдВ) рдЬрд┐рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рд▓рдХреНрд╖реНрдп рднрд╛рд╖рд╛ рдХреЗ рд▓рд┐рдП рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╢рд╛рдпрдж fable-library рд╕реЗ рдЕрдзрд┐рдХ F# (рд╕рд╛рде рд╣реА --language рдХрдВрдкрд╛рдЗрд▓рд░ рд╡рд┐рдХрд▓реНрдк) рдореЗрдВ рдорд╛рдЗрдЧреНрд░реЗрдЯ рдХрд░рдиреЗ рдХрд╛ рдпрд╣ рдкреНрд░рдпрд╛рд╕ рдЗрд╕ рд╕реЗ рдПрдХ рдЕрд▓рдЧ рдкреАрдЖрд░ рдореЗрдВ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рддреЗрдЬреА рд╕реЗ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ рдЕрдзрд┐рдХ рдЖрд╕рд╛рдиреА рд╕реЗ рдпреЛрдЧрджрд╛рди рджрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ .

рдпрд╣ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИ @ncave :+1: рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдРрд╕рд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЬрдм рдорд▓реНрдЯреАрдкреНрд▓реЗрдЯрдлрд╛рд░реНрдо рдлреИрдмрд▓ рдкреНрд░реЛрдЬреЗрдХреНрдЯреНрд╕ (.net рдФрд░ js) рдореЗрдВ рдореВрд▓ рдХреЛрдб рдХреЛ рдЕрд▓рдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдЪреАрдЬреЛрдВ рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдореИрдВ рд╢рд╛рдпрдж Fable.Library рдореЗрдВ рдПрдХ рдирдИ Native.fs рдлрд╝рд╛рдЗрд▓ рдЬреЛрдбрд╝реВрдВрдЧрд╛ рдФрд░ рдЖрд╡рд╢реНрдпрдХрддрд╛рдиреБрд╕рд╛рд░ рд╡рд╣рд╛рдВ рд╕рдмрдореЙрдбреНрдпреВрд▓ рд░рдЦреВрдВрдЧрд╛, рдЬреИрд╕реЗ:

namespace Fable.Library.Native            # or just Native

module Array = ..
module Map = ..

рд╣рдореЗрдВ рд╡рд╣рд╛рдВ рдХреБрдЫ рднреА рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ Emit рдпрд╛ Fable.Core.JS рд╕реЗ рдореВрд▓реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред

рдПрд╕рд┐рдВрдХреНрд╕ рдкрд░ рдХрд╛рдо рдХрд░рдирд╛ рдореИрдВ Async.ts рдФрд░ AsyncBuilder.ts рдХреЛ F# рдпрд╛рдиреА Async.fs рдФрд░ AsyncBuilder.fs рдкреЛрд░реНрдЯ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рд▓реЗрдХрд┐рди рдЕрдм рдореБрдЭреЗ рд╕рдорд╕реНрдпрд╛ рд╣реИ рдХрд┐ рдХреЛрдб рдХреЗ рд╕рд╛рде рдореЗрд░реА рдЯреЗрд╕реНрдЯ рдлрд╛рдЗрд▓:

async { return () }
|> Async.StartImmediate

рдкрд╛рдпрдерди рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ (рдЬреЗрдПрд╕ рдХреЛрдб рдмрд╣реБрдд рд╕рдорд╛рди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП) рдХреЛрдб:

startImmediate(singleton.Delay(lambda _=None: singleton.Return()))

AsyncBuilder рдореЗрдВ рд╣рд╛рд▓рд╛рдВрдХрд┐ рдХреЛрдИ рд╡рд┐рдзрд┐ рдирд╣реАрдВ рд╣реИ рд▓реЗрдХрд┐рди AsyncBuilder__Delay_458C1ECD ред рддреЛ рдореБрдЭреЗ рд╡рд┐рд╢реЗрд╖рддрд╛ рддреНрд░реБрдЯрд┐ рдорд┐рд▓рддреА рд╣реИ: 'AsyncBuilder' рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдХреЛрдИ рд╡рд┐рд╢реЗрд╖рддрд╛ рдирд╣реАрдВ рд╣реИ 'рд╡рд┐рд▓рдВрдм'ред

class AsyncBuilder:
    def __init__(self):
        namedtuple("object", [])()

def AsyncBuilder__ctor():
    return AsyncBuilder()

def AsyncBuilder__Delay_458C1ECD(x, generator):
    def lifted_17(ctx_1):
        def lifted_16(ctx):
            generator(None, ctx)

        protectedCont(lifted_16, ctx_1)

    return lifted_17
...

рдореИрдВ рдЗрд╕рд╕реЗ рдХреИрд╕реЗ рдирд┐рдкрдЯ рд╕рдХрддрд╛ рд╣реВрдВ рдЗрд╕ рдкрд░ рдХреЛрдИ рд╕рдВрдХреЗрдд? @ncave @alfonsogarciacaroред рд╡рд╣рд╛рдБ рдПрдХ рддрд░рд╣ рд╕реЗ рдореИрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдПрдл # рд╡рд░реНрдЧреЛрдВ рдХреЗ рддрд░реАрдХреЛрдВ рдХреЗ рд╕рд╛рде рдХрдХреНрд╖рд╛рдУрдВ рдЙрддреНрдкрдиреНрди, рдпрд╛ рдореЗрд░реЗ рдкрд░реАрдХреНрд╖рдг рдХреЛрдб рдЙрддреНрдкрдиреНрди рд╣реИ рдХрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рд╕реНрдерд┐рд░ AsyncBuilder__Delay_458C1ECD рдХреЗ рдмрдЬрд╛рдп .Delay() ?

@dbrattli рдЖрдорддреМрд░ рдкрд░ рдбреА- рдЙрд▓рдЭрди рдореЗрдВ рдирд╣реАрдВ рдбрд╛рд▓рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред
рд╕рдВрдмрдВрдзрд┐рдд рдиреЛрдЯ рдкрд░, async рдЙрди рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдореВрд▓ рдкрд╛рдпрдерди asyncio рдЕрдиреБрд╡рд╛рдж рдХреЗ рд▓рд┐рдП рд╢рд╛рдпрдж рдмреЗрд╣рддрд░ рдЕрдиреБрдХреВрд▓ рд╣реИрдВ?

@ncave рдареАрдХ рд╣реИ, рддреЛ рдпрд╣ рдЗрд╕ рддрд░рд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдЕрдВрддрд░реНрджреГрд╖реНрдЯрд┐ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдореИрдВ рдмрд┐рд▓реНрдбрд░ рдХреЛ рдПрдХ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рдкреАрдЫреЗ рд░рдЦрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛ рдФрд░ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдорджрдж рдХрд░рддрд╛ рд╣реИ (рднрд▓реЗ рд╣реА рдПрдл # рдмрд┐рд▓реНрдбрд░реНрд╕ рдЗрдВрдЯрд░рдлреЗрд╕ рди рд╣реЛрдВ, рдЗрд╕реЗ рд╢рд╛рдпрдж рдареАрдХ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП)ред async рд▓рд┐рдП рдпреЛрдЬрдирд╛ рджреЗрд╢реА рдкрд╛рдпрдерди рдПрд╕рд┐рдВрдХреНрд╕рд┐рдпреЛ ( рдпрд╣рд╛рдВ рджреЗрдЦреЗрдВ ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдереА, рд▓реЗрдХрд┐рди python cannot reuse already awaited coroutine рд╕рд╛рде рд╕рдорд╕реНрдпрд╛рдПрдВ рдорд┐рд▓реАрдВ, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдЙрдиреНрд╣реЗрдВ рдПрдХ рд╕рдорд╛рд░реЛрд╣ рдХреЗ рдкреАрдЫреЗ рдЖрд▓рд╕реА рдмрдирд╛рдирд╛ рд╣реЛрдЧрд╛ред рд╡реИрд╕реЗ рднреА рдореБрдЭреЗ рд▓рдЧрд╛ рдХрд┐ рдореИрдВ рдкрд╛рдЗрдерди рджреЗрд╢реА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреЗ рд▓рд┐рдП task рдпрд╛ asyncio рдмрд┐рд▓реНрдбрд░ рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред AsyncBuilder.ts рд╕рд░рд▓реАрдХрд░рдг рдиреЗ рдореБрдЭреЗ рдЗрд╕реЗ F# рдкрд░ рдкреЛрд░реНрдЯ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдХрд░реНрд╖рд┐рдд рдХрд┐рдпрд╛ред

рдореИрдВрдЧрд▓рд┐рдВрдЧ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреИрд╕рд╛ рдХрд┐

  • NoOverloadSuffix рд╡рд┐рд╢реЗрд╖рддрд╛: рдпрд╣ Fable рдХреЛ рдЕрдзрд┐рднрд╛рд░ рдкреНрд░рддреНрдпрдп рдЬреЛрдбрд╝рдиреЗ рд╕реЗ рд░реЛрдХрддрд╛ рд╣реИред рдЬрд╛рд╣рд┐рд░ рд╣реИ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдУрд╡рд░рд▓реЛрдб рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред

https://github.com/fable-compiler/Fable/blob/caa715f1156be29c8dd9b866a03031a1852b3186/src/fable-library/Map.fs#L524 -L527

рдлрд┐рд░ рд╣рдо Naming.buildNameWithoutSanitation рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рд╕рдВрджрд░реНрдн рджреЗ рд╕рдХрддреЗ рд╣реИрдВ:

https://github.com/fable-compiler/Fable/blob/caa715f1156be29c8dd9b866a03031a1852b3186/src/Fable.Transforms/Replacements.fs#L1956 -L1963

  • рд▓реЗрдХрд┐рди рдЙрд╕рдХреЗ рдмрд╛рдж @ncave рдиреЗ рдЬреИрд╕рд╛ рдХрд┐ src/fable-library/System.Text.fs :

https://github.com/fable-compiler/Fable/blob/caa715f1156be29c8dd9b866a03031a1852b3186/src/Fable.Transforms/Replacements.fs#L1314 -L1326

рдЙрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЖрдкрдХреЛ рдХрдХреНрд╖рд╛ рдХреЛ рдХреЗрд╡рд▓ replacedModules рд╢рдмреНрджрдХреЛрд╢ рдореЗрдВ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛:

https://github.com/fable-compiler/Fable/blob/caa715f1156be29c8dd9b866a03031a1852b3186/src/Fable.Transforms/Replacements.fs#L3075


рдЗрд╕рд▓рд┐рдП рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ Replacements рд╕реЗ F# рдореЗрдВ рд▓рд┐рдЦреЗ рдЧрдП рдХрд▓реНрдкрд┐рдд-рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЛрдб рд╕реЗ рд▓рд┐рдВрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрднреА рддрдХ рдХреЛрдИ рд╕реБрд╕рдВрдЧрдд рджреГрд╖реНрдЯрд┐рдХреЛрдг рдирд╣реАрдВ рд╣реИред рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдЗрд╕ рдЕрд╡рд╕рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрднреА рдХрд┐рд╕реА рдПрдХ рдкрд░ рд╕рд╣рдордд рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░реЗрдВред

рдмрд╣реБрдд рд╣реА рд░реЛрдЪрдХ рдЬрд╛рдирдХрд╛рд░реА @ncave рдФрд░ @alfonsogarciacaro рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рд╕рд╛рде рдореИрдВ рдПрдХ рдФрд░ рдореБрджреНрджреЗ рдкрд░ рдареЛрдХрд░ рдЦрд╛рдИред рдкрд╛рдпрдерди рдореЗрдВ unit рд╕реЗ рдХреИрд╕реЗ рдирд┐рдкрдЯреЗрдВ? рдореЗрд░рд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:

type IAsyncBuilder =
    abstract member Bind<'T, 'U> : IAsync<'T> * ('T -> IAsync<'U>) -> IAsync<'U>
    abstract member Combine<'T> : IAsync<unit> * IAsync<'T> -> IAsync<'T>
    abstract member Delay<'T> : (unit -> IAsync<'T>) -> IAsync<'T>
    abstract member Return<'T> : value: 'T -> IAsync<'T>
   ...

рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ Return рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ:

class AsyncBuilder:
    def Return(self, value):
        return protectedReturn(value)
    ....

рдпрд╣ рдЕрдЪреНрдЫрд╛ рд▓рдЧ рд░рд╣рд╛ рд╣реИ рдФрд░ рд╢рд╛рдпрдж рдЬреЗрдПрд╕ рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрджрд┐ рдлрд╝рдВрдХреНрд╢рди рддрд░реНрдХ рд▓реЗрддрд╛ рд╣реИ рддреЛ рдкрд╛рдпрдерди рдореЗрдВ рдЖрдкрдХреЛ рдПрдХ рддрд░реНрдХ рджреЗрдирд╛ рд╣реЛрдЧрд╛ред рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдпрджрд┐ рдЖрдк x.Return() рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдЖрдкрдХреЛ рдПрдХ рддреНрд░реБрдЯрд┐ рдорд┐рд▓реЗрдЧреА рдЬрдм 'T unit ред рдореЗрд░реА рдкрд╣рд▓реА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдПрдХ рдЕрдзрд┐рднрд╛рд░ рдмрдирд╛рдирд╛ рдерд╛:

abstract member Return : unit -> IAsync<unit>

рд▓реЗрдХрд┐рди рдЗрд╕рдХреА рдЕрдкрдиреА рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реИрдВред рдореЗрд░рд╛ рд╡рд░реНрддрдорд╛рди рд╕рдорд╛рдзрд╛рди (рдЬреЛ рдмрджрд╕реВрд░рдд рджрд┐рдЦрддрд╛ рд╣реИ):

abstract member Return<'T> : [<ParamArray>] value: 'T [] -> IAsync<'T>

...

member this.Return<'T>([<ParamArray>] values: 'T []) : IAsync<'T> =
    if Array.isEmpty values then
        protectedReturn (unbox null)
    else
        protectedReturn values.[0]

рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рд▓рд┐рдП рдореБрдЭреЗ рдкреНрд░рддреНрдпреЗрдХ рд╕рд╛рдорд╛рдиреНрдп рдПрдХрд▓ рддрд░реНрдХ рд╕рдорд╛рд░реЛрд╣ рдХреЗ рд▓рд┐рдП рдХрд╕реНрдЯрдо рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╢рд╛рдпрдж рдореБрдЭреЗ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдкреНрд░рддреНрдпреЗрдХ рдПрдХрд▓-рддрд░реНрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЗрдирдкреБрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рд╢реВрдиреНрдп (рдкрд╛рдпрдерди рдореЗрдВ рдХреЛрдИ рдирд╣реАрдВ) рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЬреИрд╕реЗ:

class AsyncBuilder:
    def Return(self, value=None):
        return protectedReturn(value)
    ....

рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХрд╛ рд╕рд╣реА рддрд░реАрдХрд╛ рдХреНрдпрд╛ рд╣реЛрдЧрд╛?

рдЖрдИрдЖрдИрдЖрд░рд╕реА, unit -> X рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рд╡рд╛рд▓реЗ рддрд░реАрдХреЛрдВ рдХреЗ рд▓рд┐рдП рдХреЙрд▓ рдореЗрдВ рдХреЛрдИ рддрд░реНрдХ рдирд╣реАрдВ рд╣реИ (рдЬреИрд╕рд╛ рдХрд┐ рдПрдл # рдПрдПрд╕рдЯреА рдореЗрдВ рд╣реИ) рд▓реЗрдХрд┐рди рд▓реИрдореНрдмреНрдбрд╛ рдХреЗ рд▓рд┐рдП рдпрд╛ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ unit рдХреЙрд▓/рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕реЗ рднрд░реЗ рд╕рд╛рдорд╛рдиреНрдп рддрд░реНрдХреЛрдВ рдореЗрдВ unit Fable AST рдореЗрдВ transformCallArgs рд╕рд╣рд╛рдпрдХ рдореЗрдВ рдпрд╣ рддрд░реНрдХ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рд╡рд╣рд╛рдВ рдПрдХ рд╢рд░реНрдд рдЬреЛрдбрд╝ рд╕рдХреЗрдВ рдФрд░ рд▓рдХреНрд╖реНрдп рднрд╛рд╖рд╛ рдЕрдЬрдЧрд░ рд╣реЛрдиреЗ рдкрд░ рдЗрдХрд╛рдИ рддрд░реНрдХ рдЫреЛрдбрд╝ рджреЗрдВ:

https://github.com/fable-compiler/Fable/blob/caa715f1156be29c8dd9b866a03031a1852b3186/src/Fable.Transforms/Fable2Babel.fs#L1083 -L1086

рд╣рд╛рдп @ncave , @alfonsogarciacaro , рдореИрдВ [<Inject>] рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдкрд░ рдХреБрдЫ рдЗрдирдкреБрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред рдпрд╣ Php @thinkbeforecoding рдореЗрдВ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ? рдЬреИрд╕реЗ рдХрд╛рд░реНрдп (рдореЗрдВ Array.fs ):

let map (f: 'T -> 'U) (source: 'T[]) ([<Inject>] cons: Cons<'U>): 'U[] =
    let len = source.Length
    let target = allocateArrayFromCons cons len
    for i = 0 to (len - 1) do
        target.[i] <- f source.[i]
    target

рдореЗрд░рд╛ рдХреЛрдб cons рдкреИрд░рд╛рдореАрдЯрд░ рдЙрддреНрдкрдиреНрди рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИ рдФрд░ рдпрд╣ рдкрд╛рдпрдерди рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИред

map(fn ar)

рдХреНрдпрд╛ рдпрд╣ рдЬреЗрдПрд╕ рдХреЗ рд▓рд┐рдП рд╡реИрдХрд▓реНрдкрд┐рдХ рд╣реИ? рдореИрдВ рдХреЛрдб рдореЗрдВ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХрд╛ рдкрддрд╛ рдХреИрд╕реЗ рд▓рдЧрд╛ рд╕рдХрддрд╛ рд╣реВрдВ рдФрд░ рдЗрд╕реЗ рд╡реИрдХрд▓реНрдкрд┐рдХ рдмрдирд╛ рд╕рдХрддрд╛ рд╣реВрдВ? рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП

def map(f, source, cons=None):
    ...

рд╡реИрдХрд▓реНрдкрд┐рдХ рдкреИрд░рд╛рдореАрдЯрд░ рдкрд░ PHP рднреА рд╕реНрдкрд╖реНрдЯ рд╣реИред рдореБрдЭреЗ рддрд░реНрдХ рдореЙрдбрд▓ рдкрд░ рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рдзреНрд╡рдЬ рдЬреЛрдбрд╝рдирд╛ рдкрдбрд╝рд╛ред

Fable рдореЗрдВ Inject рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рджреЛ рдЙрдкрдпреЛрдЧ рд╣реИрдВред рдПрдХ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдкреНрд░рд╛рдпреЛрдЧрд┐рдХ рд╣реИ (рдХрд┐рд╕реА рддрд░рд╣ рдЯрд╛рдЗрдкрдХреНрд▓рд╛рд╕ рдХрд╛ рдЕрдиреБрдХрд░рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреА рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЗрдирд▓рд╛рдЗрди рдХрд░рдиреЗ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП) рдФрд░ рдЖрдкрдХреЛ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдкрд░рд╡рд╛рд╣ рдирд╣реАрдВ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдПред

рдЕрдиреНрдп рдЙрдкрдпреЛрдЧ рдХрд▓реНрдкрд┐рдд-рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╡рд┐рдзрд┐рдпреЛрдВ рдореЗрдВ рдЖрдВрддрд░рд┐рдХ рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ рд╕рдВрдХрд▓рди рд╕рдордп рдкрд░ рд╣рд▓ рдХрд┐рдП рдЧрдП рддрд░реНрдХ рджреНрд╡рд╛рд░рд╛ рдкрд╛рд░рд┐рдд рдХреБрдЫ рдЕрддрд┐рд░рд┐рдХреНрдд рдЬрд╛рдирдХрд╛рд░реА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ:

  • рдПрдХ рд╕рд░рдгреА рдмрдирд╛рдиреЗ рд╡рд╛рд▓реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдпрд╣ рдЬрд╛рдирдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдЬреЗрдПрд╕ рдЧрддрд┐рд╢реАрд▓ рдпрд╛ рдЯрд╛рдЗрдк рдХреА рдЧрдИ рд╕рд░рдгреА рд╣реИ рдпрд╛ рдирд╣реАрдВред
  • рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдФрд░ рдЕрдиреНрдп рд╣реЗрд▓реНрдкрд░реНрд╕ рдХреЛ рд╕реЗрдЯ рдФрд░ рдореИрдк рдХрд░реЗрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдпрд╣ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рддреБрд▓рдирд╛рдХрд░реНрддрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреА рддреБрд▓рдирд╛ рдХреИрд╕реЗ рдХреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдП (рдХреБрдЫ рдФрд╕рдд рдЧрдгрдирд╛ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рдорд╛рди)ред

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЗрди рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╕реАрдзреЗ рдирд╣реАрдВ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП Fable Inject рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ "рджреЗрдЦ рдирд╣реАрдВ рд╕рдХрддрд╛"ред рдЗрд╕ рдХрд╛рд░рдг рд╕реЗ, рд╣рдо ReplacementsInject.fs рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдХрд╣рддреА рд╣реИ рдХрд┐ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рдХрд┐рди рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдЗрдВрдЬреЗрдХреНрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рджреЗрдЦреЗрдВ рдХрд┐ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ: https://github.com/fable-compiler/Fable/blob/522f6aad211102271538798aeb90f4aed1f77dd6/src/Fable.Transforms/Replacements.fs#L988-L1019

рдпрд╣ рдлрд╝рд╛рдЗрд▓ рдЗрд╕ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд╕рд╛рде рд╢реБрд░реБрдЖрдд рдореЗрдВ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдмрдирд╛рдИ рдЧрдИ рдереА рдЬреЛ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рддреА рд╣реИ рдХрд┐ Fable.Library рдореЗрдВ рдХреМрди рд╕реЗ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдЕрдВрддрд┐рдо рддрд░реНрдХ Inject рд╕рдЬрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдмрд┐рдВрджреБ рдкрд░ рд╣рдордиреЗ рдЕрдкрдбреЗрдЯ рдХрд░рдирд╛ рдмрдВрдж рдХрд░ рджрд┐рдпрд╛ рдФрд░ IIRC рдиреЗ рд░рд┐рдкреНрд▓реЗрд╕рдореЗрдВрдЯрдЗрдВрдЬреЗрдХреНрдЯреНрд╕ рдХреЗ рдЕрдВрддрд┐рдо рдЕрдкрдбреЗрдЯ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░ рджрд┐рдпрд╛ред рдлрд╝рд╛рдЗрд▓ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдХреА рдЧрдИ рд╣реИред

рдпрд╣ рдЬрд╛рдирдХрд░, рдореИрдВ рд╢рд╛рдпрдж IsOptional рдЬрд╛рдирдХрд╛рд░реА рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛ рд╕рдХрддрд╛ рд╣реВрдБ... рдореИрдВ рдЬрд╛рдБрдЪ рдХрд░реВрдБрдЧрд╛

@alfonsogarciacaro рдХреЛрдб рдХреЗ рд▓рд┐рдП injectArg рдХреЗ рд╕рд╛рде рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдкреНрд░рддреАрдд рд╣реЛрддреА рд╣реИ рдЬреИрд╕реЗ рдХрд┐:

type Id = Id of string

let inline replaceById< ^t when ^t : (member Id : Id)> (newItem : ^t) (ar: ^t[]) =
    Array.map (fun (x: ^t) -> if (^t : (member Id : Id) newItem) = (^t : (member Id : Id) x) then newItem else x) ar

let ar = [| {|Id=Id"foo"; Name="Sarah"|}; {|Id=Id"bar"; Name="James"|} |]
replaceById {|Id=Id"ja"; Name="Voll"|} ar |> Seq.head |> fun x -> equal "Sarah" x.Name
replaceById {|Id=Id"foo"; Name="Anna"|} ar |> Seq.head |> fun x -> equal "Anna" x.Name

рдпрд╣рд╛рдВ Array.map рдХреЛ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдЗрдВрдЬреЗрдХреНрд╢рди рдирд╣реАрдВ рдорд┐рд▓реЗрдЧрд╛ред рдХреЛрдб рдмрд┐рдирд╛ рдХрд┐рд╕реА рдЗрдВрдЬреЗрдХреНрд╢рди рдХреЗ JS рдХреЛ рдЯреНрд░рд╛рдВрд╕рдкрд╛рдЗрд▓ рдХрд░реЗрдЧрд╛:

return map((x) => (equals(newItem.Id, x.Id) ? newItem : x), ar);

рдХреНрдпрд╛ рдпрд╣ рдПрдХ рдмрдЧ рд╣реИ? рдпрд╣ рдХреЛрдб рдЬреЗрдПрд╕ рдореЗрдВ рдХрд╛рдо рдХрд░реЗрдЧрд╛ (рднрд╛рдЧреНрдп рд╕реЗ?) рд▓реЗрдХрд┐рди рдкрд╛рдпрдерди рдХреЗ рд▓рд┐рдП рдирд╣реАрдВред

рдЖрд╣ рдХреНрд╖рдорд╛ рдХрд░реЗрдВ! рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рднреВрд▓ рдЧрдП рд▓реЗрдХрд┐рди рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ "рдЕрдиреБрдХреВрд▓рди" рд╣реИ рдЬрд╣рд╛рдВ рд╕рд░рдгреА рдирд┐рд░реНрдорд╛рддрд╛ рдХреЛ "рдорд╛рдирдХ" рдЬреЗрдПрд╕ рд╕рд░рдгреА рдХреЗ рд▓рд┐рдП рдЗрдВрдЬреЗрдХреНрд╢рди рдирд╣реАрдВ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ: https://github.com/fable-compiler/Fable/blob/4ecab5549ab6fcaf317ab9484143420671ded43b/src/Fable.Transforms/ рд░рд┐рдкреНрд▓реЗрд╕рдореЗрдВрдЯ.fs#L1005 -L1009

рд╣рдо рддрдм рд╡реИрд╢реНрд╡рд┐рдХ Array рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╣реЛрддреЗ рд╣реИрдВ рдЬрдм рдХреБрдЫ рднреА рдкрд╛рд░рд┐рдд рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ: https://github.com/fable-compiler/Fable/blob/4ecab5549ab6fcaf317ab9484143420671ded43b/src/fable-library/Array.fs#L25 -L28

рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рдРрд╕рд╛ рдХреНрдпреЛрдВ рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рдмрд╕реЗ рдЖрдо рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдмрдВрдбрд▓ рдореЗрдВ рдХреБрдЫ рдмрд╛рдЗрдЯреНрд╕ рдХреЛ рд╕рд╣реЗрдЬрдирд╛ рд╣реИред рдпрджрд┐ рдпрд╣ рдЖрдкрдХреА рд╕рд╣рд╛рдпрддрд╛ рдХрд░рддрд╛ рд╣реИ рддреЛ рд╣рдо next рд╢рд╛рдЦрд╛ рдХреЗ рд▓рд┐рдП рдЗрд╕ рдЕрдиреБрдХреВрд▓рди рдХреЛ рд╣рдЯрд╛ рд╕рдХрддреЗ рд╣реИрдВред

рдареАрдХ рд╣реИ рдзрдиреНрдпрд╡рд╛рджред рдореИрдВ рдпрд╣ рджреЗрдЦрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛ рдХрд┐ рдХреНрдпрд╛ рдореИрдВ рдпрд╣ рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рд╣рдореЗрдВ рдЗрд╕реЗ рдмрдВрдж рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд╣рдореЗрдВ рддреАрд╕рд░реЗ рддрд░реНрдХ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдПрдХ рдЦрд╛рд▓реА (рд╢реВрдиреНрдп) рдорд╛рди рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ рдкрд╛рдпрдерди рдЪрдХрд┐рдд рди рд╣реЛред рдЕрд░реНрдерд╛рдд:

            | Types.arrayCons ->
                match genArg with
                | Number(numberKind,_) when com.Options.TypedArrays ->
                    args @ [getTypedArrayName com numberKind |> makeIdentExpr]
                | _ -> args @ [ Expr.Value(ValueKind.Null genArg, None) ]

рдЬреЗрдПрд╕ рдХреЗ рд▓рд┐рдП рдпрд╣ рддрдм рдЙрддреНрдкрдиреНрди рд╣реЛрдЧрд╛:

map((x_3) => (equals(newItem_1.Id, x_3.Id) ? newItem_1 : x_3), ar, null))).Name);

рдФрд░ рдкрд╛рдпрдерди рдХреЗ рд▓рд┐рдП:

def lifted_53(x_2):
    return newItem_1 if (equals(newItem_1["Id"], x_2["Id"])) else (x_2)

return map(lifted_53, ar, None)

рдХреНрдпрд╛ рдРрд╕рд╛ рдХреБрдЫ рд╕реНрд╡реАрдХрд╛рд░реНрдп рдлрд┐рдХреНрд╕ рд╣реЛрдЧрд╛?

рдпрд╣ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╢рд╛рдпрдж рд╣рдо рдЗрд╕рдХреЗ рдмрдЬрд╛рдп None рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдПрдХ рдмрд┐рдВрджреБ рдкрд░ рд╣рдо Fable2Babel рдореЗрдВ рдЕрдВрддрд┐рдо рд╕реНрдерд┐рддрд┐ рдореЗрдВ None args рд╣рдЯрд╛ рд░рд╣реЗ рдереЗ, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдЕрдм FSharp2Fable рдореЗрдВ рдРрд╕рд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╣рдо рдпрд╣рд╛рдВ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдЬрд╛рдВрдЪ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ: https://github.com/fable-compiler/ Fable/blob/c54668b42b46c0538374b6bb2e283af41a6e5762/src/Fable.Transforms/Fable2Babel.fs#L1082 -L1095

BTW, рдХреНрд╖рдорд╛ рдХрд░реЗрдВ, рдореИрдВрдиреЗ рдЗрд╕ PR рдХреА рдЧрд╣рд░рд╛рдИ рд╕реЗ рдЬрд╛рдБрдЪ рдирд╣реАрдВ рдХреА рд╣реИ рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдпрд╣ рдкрд░реАрдХреНрд╖рдг рдирд╣реАрдВ рддреЛрдбрд╝ рд░рд╣рд╛ рд╣реИ, рддреЛ рд╣рдо рдЗрд╕реЗ рдЬрд▓реНрдж рд╣реА POC рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд┐рд▓рдп рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреИрд╕рд╛ рдХрд┐ рд╣рдордиреЗ PHP рдХреЗ рд╕рд╛рде рдХрд┐рдпрд╛ рдерд╛ред рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдлрд╝реЗрдмрд▓ рдХреЗ рд╕рд╛рде рдХрдИ рднрд╛рд╖рд╛рдУрдВ рдХреЛ рд▓рдХреНрд╖рд┐рдд рдХрд░рдирд╛ рдЖрд╕рд╛рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд░рд┐рдлреИрдХреНрдЯрд░рд┐рдВрдЧ рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ (рд╕рдордп рдХреА рдЕрдиреБрдорддрд┐) рджреЗ рд░рд╣рд╛ рд╣реВрдВ, рдФрд░ рдпрджрд┐ рдкрд╛рдЗрдерди рдкрд╣рд▓реЗ рд╕реЗ рд╣реА next рд╢рд╛рдЦрд╛ рдореЗрдВ рд╣реИ рддреЛ рдпрд╣ рд╢рд╛рдпрдж рдЖрд╕рд╛рди рд╣реЛрдЧрд╛ред рд╣рдо рдмрд╣реБрдд рд╕реА рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╢рд╛рдЦрд╛рдУрдВ рдХреЛ рд╕рд┐рдВрдХ (рдореБрдЦреНрдп, рдЕрдЧрд▓рд╛, рдкрд╛рдпрдерди) рдореЗрдВ рд░рдЦрдиреЗ рд╕реЗ рднреА рдмрдЪрддреЗ рд╣реИрдВред

рдареАрдХ рд╣реИ @alfonsogarciacaro , рдореИрдВ рджреЗрдЦреВрдВрдЧрд╛ рдХрд┐ рдХреНрдпрд╛ рдореИрдВ рд╢реВрдиреНрдп рдХреЗ рдмрдЬрд╛рдп рдХреЛрдИ рдирд╣реАрдВ рдЙрддреНрдкрдиреНрди рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред рд╣рдо рдЗрд╕реЗ рдЬрд▓реНрдж рд╣реА рдорд░реНрдЬ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдЕрднреА рднреА рдХреБрдЫ рдореМрдЬреВрджрд╛ рдкрд╛рдпрдерди рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЛ рддреЛрдбрд╝ рд░рд╣рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрднреА рдХреБрдЫ рд╣реА рдмрдЪреЗ рд╣реИрдВ рдФрд░ рдореБрдЭреЗ рдЗрд╕реЗ рдПрдХ рдпрд╛ рдПрдХ рд╕рдкреНрддрд╛рд╣ рдХреЗ рднреАрддрд░ рдареАрдХ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЖрд╡рд╢реНрдпрдХ рдЙрддреНрд╕рд░реНрдЬрди рдХреЗ рд╕рд╛рде Fable.Core.PY.fs рдмрдирд╛рдиреЗ рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред Babel2Python -> Fable2Python рд╕реЗ рдкреБрдирд░реНрд▓реЗрдЦрди рдореЗрд░реА рдЕрдкреЗрдХреНрд╖рд╛ рд╕реЗ рдЕрдзрд┐рдХ рдХрдард┐рди рдерд╛ рд▓реЗрдХрд┐рди рдореИрдВ рдЕрдВрдд рдореЗрдВ рдлрд┐рд░ рд╕реЗ рдкрдЯрд░реА рдкрд░ рдЖрдиреЗ рдХреЗ рдХрд░реАрдм рдкрд╣реБрдВрдЪ рд░рд╣рд╛ рд╣реВрдВред рдореИрдВ рдкреАрдЖрд░ рдХреЛ рдереЛрдбрд╝рд╛ рд╕рд╛рдл рдХрд░ рджреВрдВрдЧрд╛ рдФрд░ рдЗрд╕реЗ рдорд░реНрдЬ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рдХрд░ рджреВрдВрдЧрд╛ред

@alfonsogarciacaro рдореИрдВрдиреЗ рдПрдХ рдХреЛ рдЫреЛрдбрд╝рдХрд░ рд╕рднреА рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЛ рдареАрдХ рдХрд░ рджрд┐рдпрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐ рдпрд╣ рдЙрд╕реА рдкреБрд░рд╛рдиреЗ рдореБрджреНрджреЗ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ рдЬреЛ рдореЗрд░реЗ рдкрд╛рд╕ рдмреИрдмреЗрд▓ рдХреЗ рд╕рд╛рде рдерд╛ ЁЯШ▒ рдореБрдЭреЗ рдпрд╣ рдЬрд╛рдирдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдХреНрдпрд╛ Fable.Get рдХрд╛ рдЙрдкрдпреЛрдЧ AnonymousRecord рдкреНрд░рдХрд╛рд░ рдкрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдкрд╛рдпрдерди рдбрд┐рдХреНрдЯреЗрдЯ рдореЗрдВ рдмрджрд▓ рдЬрд╛рддреЗ рд╣реИрдВ, рдФрд░ рдореБрдЭреЗ рд╕рдмрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдпрд╛рдиреА [] рдкрд╣реБрдВрдЪ рдФрд░ .dotted ред рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдмрд╛рдИрдВ рдУрд░ рдХреБрдЫ рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдСрдмреНрдЬреЗрдХреНрдЯ, рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓, ... рдЗрд╕рд▓рд┐рдП рдпрд╣ рдЬрд╛рдирдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИред рдХреНрдпрд╛ рдХреЛрдИ рдмреЗрд╣рддрд░ рддрд░реАрдХрд╛ рд╣реИред рдХреНрдпрд╛ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЕрдирд╛рдо рд░рд┐рдХреЙрд░реНрдб рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ GetKind рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдпрд╛ рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рдХреНрдпрд╛ рд╣реИ?

рдореИрдВ рдЗрд╕реЗ FSharp2Fable рдореЗрдВ рджреЗрдЦрддрд╛ рд╣реВрдВред рдореБрдЭреЗ рдмрд╛рдж рдореЗрдВ рдХреИрд╕реЗ рдкрддрд╛ рдЪрд▓реЗрдЧрд╛ рдХрд┐ рдлреАрд▓реНрдбрдЧреЗрдЯ AnonRecord рджреНрд╡рд╛рд░рд╛ рдЙрддреНрдкрдиреНрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛?

    // Getters and Setters
    | FSharpExprPatterns.AnonRecordGet(callee, calleeType, fieldIndex) ->
        let r = makeRangeFrom fsExpr
        let! callee = transformExpr com ctx callee
        let fieldName = calleeType.AnonRecordTypeDetails.SortedFieldNames.[fieldIndex]
        let typ = makeType ctx.GenericArgs fsExpr.Type
        return Fable.Get(callee, Fable.FieldGet(fieldName, false), typ, r)

рдЬреИрд╕рд╛ рдХрд┐ рд╣рдордиреЗ рдбрд┐рд╕реНрдХреЙрд░реНрдб @dbrattli рдореЗрдВ рдмрд╛рдд рдХреА рдереА, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдХреИрд▓реА рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреА рдЬрд╛рдВрдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдПрдХ рдЕрдирд╛рдо рд░рд┐рдХреЙрд░реНрдб рд╣реИ рдпрд╛ рдирд╣реАрдВред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдкрдХреЛ рдЕрдзрд┐рдХ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рддреЛ FieldGet рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдЬреЛрдбрд╝рдирд╛ рдареАрдХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░ рд╣рдореЗрдВ рд╢рд╛рдпрдж рдмреНрд░реЗрдХрд┐рдВрдЧ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рдХрдо рдХрд░рдиреЗ рдФрд░ рдЕрдиреНрдп рдмреВрд▓рд┐рдпрди рдлрд╝реАрд▓реНрдб рдХреЗ рд╕рд╛рде рднреНрд░рдо рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рд░рд┐рдХреЙрд░реНрдб рдШреЛрд╖рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП (рдПрдл # рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЕрдзрд┐рдХ рд╕рдЦреНрдд рдпреВрдирд┐рдпрди рдХреЗрд╕ рдлреАрд▓реНрдб рдирд╛рдо рдмреАрдЯреАрдбрдмреНрд▓реНрдпреВ):

type FieldGetInfo =
    { Name: string
      IsMutable: bool
      IsAnonymousRecord: bool }

type GetKind =
    | FieldGet of info: FieldGetInfo
    | ...

рдзрдиреНрдпрд╡рд╛рдж @alfonsogarciacaroред рд╡рд╣ рдХрд╛рдо рдХрд┐рдпрд╛! рдореИрдВ

рдЕрдЧрд▓рд╛ рдорд╕рд▓рд╛:

testCase "Map.IsEmpty works" <| fun () ->
    let xs = Map.empty<int, int>
    xs.IsEmpty |> equal true
    let ys = Map [1,1; 2,2]
    ys.IsEmpty |> equal false

рдЬреЗрдПрд╕ рдХреЗ рд▓рд┐рдП рдпрд╣ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддрд╛ рд╣реИ:

Testing_testCase("Map.isEmpty works", () => {
    Testing_equal(true, isEmpty_1(ofSeq([], {
        Compare: (x_1, y_1) => compare(x_1, y_1),
    })));
    Testing_equal(false, isEmpty_1(ofSeq([[1, 1]], {
        Compare: (x_2, y_2) => comparePrimitives(x_2, y_2),
    })));
})

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ ofSeq рдХреЛ рджреЛ рддрд░реНрдХреЛрдВ рдХреЗ рд╕рд╛рде рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, ofSeq рдХреЗрд╡рд▓ рдПрдХ рддрд░реНрдХ рд▓реЗрддрд╛ рд╣реИ:

let ofSeq elements =
    Map<_, _>.Create elements
export function ofSeq(elements) {
    return FSharpMap_Create(elements);
}

Compare рд╕рд╛рде рдЙрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рдХреЛ рдХреНрдпреЛрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм ofSeq рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ?

рд╣рдореНрдо, рдореБрдЭреЗ рдЗрд╕ рдкрд░ рдЧреМрд░ рдХрд░рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИред рдПрдХ рдмрдЧ рдХреА рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ, ofSeq рдХреЛ рдПрдХ рддреБрд▓рдирд┐рддреНрд░ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП ( MapTree.ofSeq рдФрд░ Set.ofSeq рдЬреИрд╕реЗ рд╕рдорд╛рди рдХрд╛рд░реНрдп)ред рд╕реЗрдЯрдЕрдк рдереЛрдбрд╝рд╛ рдЬрдЯрд┐рд▓ рд╣реИ рдЗрд╕рд▓рд┐рдП рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рдмрд┐рдВрджреБ рдкрд░ рдЪреАрдЬреЗрдВ рд╕рд┐рдВрдХ рд╕реЗ рдмрд╛рд╣рд░ рд╣реЛ рдЧрдИрдВ: рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд░рд┐рдкреНрд▓реЗрд╕рдореЗрдВрдЯрдЗрдВрдЬреЗрдХреНрдЯ.fs рдирд╛рдо рдХреА рдПрдХ рдлрд╛рдЗрд▓ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд░рд┐рдкреНрд▓реЗрд╕рдореЗрдВрдЯ рджреНрд╡рд╛рд░рд╛ рдпрд╣ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдХрд┐рди рддрд░реАрдХреЛрдВ рдХреЛ рддрд░реНрдХ рдЗрдВрдЬреЗрдХреНрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣реАрдВ рди рдХрд╣реАрдВ рдПрдХ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╣реИ, рд▓реЗрдХрд┐рди рдХреБрдЫ рд╕рдордп рд╣реЛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рд╣рдордиреЗ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ рдФрд░ рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдирд╡реАрдирддрдо FCS рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдореИрдВ рдЬрд╛рдВрдЪ рдХрд░реВрдВрдЧрд╛, рдЗрд╕реЗ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!

рдореИрдВрдиреЗ рдПрдХ рдЕрд╕реНрдерд╛рдпреА рдлрд┐рдХреНрд╕ рдЬреЛрдбрд╝рд╛ред рд╕рдореАрдХреНрд╖рд╛ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ ЁЯОЙ https://github.com/fable-compiler/Fable/pull/2345

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

MangelMaxime picture MangelMaxime  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

ncave picture ncave  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

nozzlegear picture nozzlegear  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

et1975 picture et1975  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

SirUppyPancakes picture SirUppyPancakes  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ