Programming languages 现有的哪些语言与LunaScript最相似?

Programming languages 现有的哪些语言与LunaScript最相似?,programming-languages,Programming Languages,自从LunaScript发布()以来,我一直对它很好奇,我想在这里调查一下现有的哪些工具与它类似,特别是积极开发/维护的软件。从博客帖子: Lunascript应用程序指定从模型到视图或用户界面的数据模型和函数,并使用从用户输入到模型的处理程序函数进行注释。由此,Lunascript编译器生成了一个运行正常的Web 2.0应用程序——客户端JavaScript、服务器端SQL以及介于两者之间的一切——并完成了实时双向数据同步。无需编写单独的代码来帮助服务器确定哪些值需要发送给客户端:服务器可以通

自从LunaScript发布()以来,我一直对它很好奇,我想在这里调查一下现有的哪些工具与它类似,特别是积极开发/维护的软件。从博客帖子:

Lunascript应用程序指定从模型到视图或用户界面的数据模型和函数,并使用从用户输入到模型的处理程序函数进行注释。由此,Lunascript编译器生成了一个运行正常的Web 2.0应用程序——客户端JavaScript、服务器端SQL以及介于两者之间的一切——并完成了实时双向数据同步。无需编写单独的代码来帮助服务器确定哪些值需要发送给客户端:服务器可以通过模拟UI来完成这一任务。由于Lunascript应用程序仅指定在给定当前数据的情况下UI的外观(而不是在发生更改时UI的更新方式),因此不可能编写一个正确加载但在进行更改时不保持正确的UI


感兴趣的主要功能是反应式编程/增量评估/双向数据绑定/你想叫它什么都行,它跨越了浏览器、应用服务器和关系数据库管理系统,很长一段时间以来,Rebol当然是从一个单一的高级程序为这些平台生成代码,但他们不知道在现实世界中如何使用它。不过,您可以在rebol中找到一个包含websocket实现的Web服务器。

2011年10月7日更新:请参阅底部的我的外卖

概述
  • ,直接受Lunascript的启发。这是我从你那里学到的。来自(有点老):

    首先,在应得的地方赊账!本项目的概念灵感来源于与Justin Rosenstein的对话,他与Asana的Dustin Moskovitz和团队一起构建的语言脚本,以及与Misko Hevery的对话,他在谷歌构建的HTML编译器

  • 大多数客户端JavaScript程序都必须修改页面内容,但Ur/Web是基于函数式反应式编程的。程序分配数据源,然后将页面描述为这些数据源的纯函数。当源更改时,页面将自动更改

  • :来自Philip Wadler的团队

    链路通过为所有三层提供单一语言,简化了阻抗失配问题。系统为每一层生成代码;例如,为浏览器将一些代码转换为Javascript,为服务器将一些代码转换为字节码,为数据库将一些代码转换为SQL

  • :

    在Swift方法中,应用程序代码是用Jif语言编写的,这是一种基于Java的语言,包括信息安全策略。源代码被自动划分为在浏览器中运行的JavaScript代码和在服务器上运行的Java代码。为了实现交互式性能,尽可能将代码和数据放在客户端。安全关键代码放在服务器上,用户界面代码放在客户端上。代码放置受到高级声明性信息流策略的约束,这些策略强烈地加强了服务器端信息的机密性和完整性。Swift编译器还可以选择在客户端和服务器上复制代码和数据,这对安全性和性能都有好处

我的外卖 乐趣 乐趣是一种在精神上与我所理解的Lunascript最接近的语言。特别是,功能性反应式编程超越了客户机-服务器和服务器-数据库的划分,允许您创建直接以持久数据库状态表示的UI元素,并在数据库状态更改时动态更新它们。从该示例中,请注意,当消息附加到全局消息集时(使用“发送”按钮),循环生成的消息列表是如何动态更新的:

请注意,这只会在你按下按钮时更新计数器,而不会在其他人更新计数器时更新计数器——这是有趣的聊天应用程序显示的一种反应

作者认为Ur/Web已准备好用于生产,并提供咨询/支持服务。在野外有一些Ur/web用户,虽然看起来可以手工计数

链接 Links是Philip Wadler团队的一个项目。我惊讶地发现,它不提供任何类型的函数式反应式编程,而DOM操作之类的东西是必不可少的。对于客户机-服务器通信,我们同样有显式的RPC。我认为链接有点类似于GWT,因为它只是一种可以生成服务器和客户端代码的单一语言(功能性的),特别是保护您不受JavaScript的影响。作为这种屏蔽的一个例子,Links提供了具有显式消息传递通信的客户端并发进程(特别是参与者)。在编写阻塞代码(如RPC)时,这些代码非常方便,而不会导致整个客户端应用程序阻塞

下面的代码来自他们的(),这是一个应用程序,它列出了您正在键入的单词的DB支持的补全,并可以插入新的补全。从UI开始,我们有一个文本框、完成列表和一个新定义表单:

     <form l:onkeyup="{handler!Suggest(s)}">
      Search: <input type="text" l:name="s" autocomplete="off"/>
     </form>

     <div id="suggestions"/>

     <h3>New definition</h3>
     <div id="add">
      {addForm(handler)}
     </div>
所以
handler!建议
处理程序发送
建议
消息。请注意
NewDef
处理程序也需要记住更新完成列表(通过调用
suggest
,就像
suggest
处理程序一样),以保持完成与数据库中的内容同步

suggest
函数要求服务器查询数据库,然后强制更新DOM:

fun suggest(s) client {
  replaceChildren(format(completions(s)), getNodeById("suggestions"))
} 

fun completions(s) server {
  if (s == "") []
  else {
    query [10] {
      for (def <-- defsTable)
       where (def.word =~ /^{s}.*/)
       orderby (def.word)
        [def]
    }
  }
}
fun建议(s)客户端{
替换子项(格式(完成项)),getNodeById(“建议”))
} 
趣味综合
     <form l:onkeyup="{handler!Suggest(s)}">
      Search: <input type="text" l:name="s" autocomplete="off"/>
     </form>

     <div id="suggestions"/>

     <h3>New definition</h3>
     <div id="add">
      {addForm(handler)}
     </div>
  var handler = spawn {
    fun receiver(s) {
      receive {
        case Suggest(s) -> suggest(s); receiver(s)
        case NewDef(def) ->
          newDef(def);
          replaceChildren(addForm(self()), getNodeById("add"));
          if (s <> "") suggest(s) else (); receiver(s)
      }
    }
    receiver("")
  };
fun suggest(s) client {
  replaceChildren(format(completions(s)), getNodeById("suggestions"))
} 

fun completions(s) server {
  if (s == "") []
  else {
    query [10] {
      for (def <-- defsTable)
       where (def.word =~ /^{s}.*/)
       orderby (def.word)
        [def]
    }
  }
}