是否有可能将Mario示例从Elm转换为纯JavaFX或JavaFX + RxJava,同时保留Elm的高级抽象?

jhe*_*dus 5 javafx reactive-programming system.reactive elm rx-java

我最近看到了关于Elm反应式编程的这个有趣的演讲.

这让我想知道用于实现Mario游戏的语言结构(在所示的演示文稿中,以及下图中)是否可以映射到纯JavaFX或JavaFX与RxJava结合的类似高级语言结构?

换句话说,是否有可能在单独的JavaFX或JavaFX + RxJava中使用相同的概念抽象(即时间相关值)来表达在Elm中实现的Mario游戏?

因此,如果经验丰富的JavaFX程序员或经验丰富的JavaFX + RxJava + Functional程序员想要将Mario游戏从Elm移植到1)JavaFX或2)JavaFX + RxJava那么程序员可以通过使用类似的高来完成此任务在Elm中使用的级别抽象

我为JavaFX考虑的抽象是绑定,对于JavaFX + RxJava是绑定+ Observables/Subjects/Subscription.

在此输入图像描述

Tom*_*ula 7

我快速浏览了榆树,这令人印象深刻(而且富有表现力).

在榆树中,你构建你的场景

Signal Element
Run Code Online (Sandbox Code Playgroud)

在JavaFX中大致相当于

ObservableValue<Node>
Run Code Online (Sandbox Code Playgroud)

对JavaFX的天真转换意味着您在每次更新时交换整个场景,这是非常昂贵的.在Elm中,Element是一个场景节点的不可变抽象表示,在屏幕外构建(在DOM之外).它足够便宜,可以在每次更新时重新创建整个场景图(由于不变性,重用未更改的分支是安全的).根Element被渲染到DOM,但据我所知,只是第一次构造完整的DOM.在后续更新中,Elm运行时运行一个算法来比较新的根元素和旧的根元素,并且仅修改需要更新的DOM的那些部分,这足够快.React.js使用相同的技术.因此,Elm和React.js都提供了高级功能抽象,但出于性能原因,使用了可变性.

通过一些额外的语法噪音,您可以将大多数Elm构造转换为JavaFX (*).例如,

lift2 display Window.dimensions gameState
Run Code Online (Sandbox Code Playgroud)

相当于

import static org.fxmisc.EasyBind.*;

combine(Window.dimensions, gameState, display)
Run Code Online (Sandbox Code Playgroud)

缺少的部分是不可变的抽象窗口小部件表示库以及它们对JavaFX场景图的有效渲染.

你能做的是:

  • 为JavaFX创建这样的小部件库;
  • 甚至将Elm编译为JavaFX(而不是HTML + JavaScript).

我很乐意看到其中任何一个完成.


(*)我认为Elm 记录非常强大,需要Java中的大量样板(或Scala).

榆树:

type Point = { x:Float, y:Float }

p = { 0.0, 0.0 }
q = { p | x <- 5.0 }
Run Code Online (Sandbox Code Playgroud)

Java的:

class Point {
    public final float x;
    public final float y;

    public Point(float x, float y) {
        this.x = x;
        this.y = y;
    }

    public Point updateX(float x) {
        return new Point(x, y);
    }

    public Point updateY(float y) {
        return new Point(x, y);
    }
}

Point p = new Point(0.0, 0.0);
Point q = p.updateX(5.0);
Run Code Online (Sandbox Code Playgroud)

斯卡拉:

case class Point(x: Float, y: Float)

val p = Point(0.0, 0.0)
val q = p.copy(x = 5.0f)
Run Code Online (Sandbox Code Playgroud)