Opa指导手册:第一章 Opa导读

欢迎转载,请注明出处:http://blog.csdn.net/winbomb/article/details/7540095
另外,可以直接到 http://doc.opalang.org/manual 查看译者已翻译的章节,OPA组织已调整了显示方式,对中国用户会直接显示为中文。如果您对Opa有兴趣或希望交流,可留言或发邮件到:li.wenbo@whu.edu.cn

原文地址: http://doc.opalang.org/manual

译者前言:译者数月前接触到Opa,发现它的语法和使用方式都很特别,不同于传统的Web开发方式。于是细细研究了一段时间,并利用Opa开发了一款HTML5的小游戏(游戏尚未完成,完成后可附上地址供读者参考),发现Opa语言及开发方式的确有一些出彩之处。其间,与Opa语言的开发组织进行了一些沟通,他们希望能有中文版本的指导手册,以便于英文水平不好或者不习惯阅读英文的中国读者能了解Opa。于是译者决定陆续把Opa官方的手册译成中文,以方便中国读者阅读。当然,由于译者水平有限,难免出现纰漏,望谅解和指正。

 

 

OPA是新一代的开源web开发平台,它可以让你使用Opa一种技术就写出安全、可扩展的web应用。本手册将为你介绍OPA的许多特性。如果你有编程经验和web开发的知识(尤其是HTML和CSS)的话,将会对阅读和理解有很大帮助。

1.1 单一的语言

OPA是开发web应用的一种单一语言。也就是说,服务端和客户端的代码都是采用OPA语言编写的。

你可以在不用考虑客户服务端差异的情况下写出一个完整的web应用,OPA编译器会自动地为你发布代码并且管理所有的通讯。有时,你可能需要去调整编译器的选项(例如达到增强应用的性能的目的),在这种情况下,只需要使用诸如“client”、“server”这样的关键字就可以了。

    // Opa decides
    function client_or_server(x, y) { ... }

    // Client-side
    client function client_function(x, y) { ... }

    // Server-side
    server function server_function(x, y) { ... }

数据库的代码也可以直接使用OPA语言编写,OPA支持主要的NoSQL数据库MongoDB和CouchDB,并且具有自己的内部数据库。内部数据库不需要进行任何的配置,因此尤其推荐初学者使用。

1.2 简单的工作流

要编写一个应用,首先要在你习惯的编辑器中写好代码,OPA中最简单的“hello world”应用如下:

Server.start(
    Server.http,
    { page: function() { <h1>Hello,world</h1> }
    , title: "Hello, world"}
)

然后,使用下面的编译命令编译:

opa hello.opa

接着,启动这个应用:

./hello.exe

在应用启动之后,就可以使用浏览器中查看这个应用:http://localhost:8080

 

1.3 熟悉的语法

OPA的新语法(译者注:Opa 0.9s4之后与之前版本的语法有比较大的差别)源自于流行的编程语言:c,javascript等,下面是OPA程序片段:

function createUser(username, password) {
  match (findUser(username)) {
    case {none}:
       user = { username: username, fullname: "", password: Crypto.Hash.sha2(password)};
       saveUser(user);
    default:
       displayMessage("This username exists");
  };
  Client.goto("/login");
}

然而,OPA除了继承自传统的web语法外,还增加了一些新的特性。例如,HTML片段可以直接插入到程序中,不需要添加引号,如下:

line= <div id=”foo”>bar</div>

Css选择器也可以直接使用,如下:

         Selector= #foo

并且,类似指针的语法可以把指定的内容赋值给选择器,如下:

         *selector= line

OPA提供了事件驱动(event-driven)的编程方式。例如,当某个事件触发后运行一个方法可以使用下面的代码完成:

function action(){
 #foo = < div id="bar" /> ; 
} 
...
< div οnclick={action} />

查看OPA特性和语法最好的地方是看reference card。

 

1.4 静态类型

OPA最重要特性之一是其类型系统。虽然OPA看起来像很多动态编程语言,但其实它是编译性语言,并且依赖于state-of-the-art类型系统。

OPA在编译阶段就进行类型检查,这表明在运行阶段不会出现类型错误。例如,下面的代码:foo = 1+”bar”; 在编译阶段会报如下错误:

        Types int and  String are not comaptible

然而,不像C和Java,你不需要在任何地方都去注明变量的类型,因为OPA几乎可以推断出所有的应该属于的类型,例如你可以直接这样写:

function foo(s){
  String.length(s);
}

function bar(x,y) {
  foo(x) + y;
}

OPA编译器会自动的推断出上述参数和返回值的类型,上面代码和下面的代码作用一样:

int functionfoo(string s) {
  String.length(s);
}

int function bar(stringx, int y) {
  foo(x) + y;
}

这个类型推断系统会大大加快你编写代码的速度。举例来说,Opa在编译阶段会捕获4中类型的错误,下面的例子是从一个叫做webshell(http://github.com/hbbio/webshell)的真实Opa程序中选取出来的。

如果你这样写:

element =
        <div>
                <span>{prompt({none})}</span>
                <span>{expr}
        </div>
        <div>{Calc.compute(expr)}</div>;

编译器会提示你:元素的定义和结束标志不匹配。(第四行少了一个 </span>) 

如果你这样写:

case {some: 13}: #status = "Enter"; callback(get());
case {some: 37}: #status = "Left"; move({lef});
case {some: 38}: #status = "Up"; move({up});
case {some: 39}: #status = "Right"; move({right});

编译器会提示你方法的类型不正确,你使用了类型 '{lef}',而期待的类型为: '{left} or {right} or {rightmost} or {up} or {down}' 。后面期待的类型并没有在代码的任何地方进行定义,而是Opa通过其他地方的代码推断出来的。

如果你这样写:

previous = Dom.get_content(#precaret);
#precaret = String.sub(0, String.lenght(previous) - 1, previous);
#postcaret += String.get(String.length(previous) - 1, previous);

编译器会提示你:String模块并没有lenght方法,而且会询问你或许是想使用: int function length(string)?

如果你这样写:

previous = Dom.get_content(#postcaret);
#postcaret = String.sub(1, String.length(previous) - 1, previous);
#precaret =+ String.get(previous);


编译器会提示你:String.get方法的类型为 string function(int, string), 但是你调用的形式为 string function(string)。说明你忘记了第一个整型参数。

Opa的类型系统不仅仅管理基础类型,还管理复杂的数据结构甚至是模块。类型系统一章会给出完整地说明。

 

1.5 数据库

OPA现在已经提供了对MongoDB和CouchDB的支持,另外还有其自身内部的数据库引擎。后者不需要任何配置,推荐初学者使用。

数据库值是通下面的代码声明:database type /path; 例如:

database int /counter;

在上面的代码中,/counter叫做路径,由于访问存储的值与浏览文件系统类似。从数据库中获取一个值可以通过简单地: /counter完成,而存储一个值使用下面的代码:

/path < -value

你可以向数据库中存放复杂的数据结构,例如map。Map是一种键(key)到值(value)关联的数据结构。Opa的路径系统可以识别这样的数据结构并允许直接在路径上指定键,例如:

database stringmap(string) /dictionary;
...
/dictionary[key];
...
/dictionary[key] <- value;
...


 

1.6 总结

你能够猜出下面代码的作用么?

database mydb {
  int /counter = 0;
}
function action(_) {
    /mydb/counter <- /mydb/counter + 1;
    #msg = <>Hello, user number {/mydb/counter}!</>;
}
function page() {
    <h1 οnclick={action}>Hello, world</h1>
    <div id="msg">Click the header</div>;
}
Server.start(
    Server.http,
    { ~page, title: "Hello, world" }
);

 

试着去编译运行 (或访问:http://hello-opa.tutorials.opalang.org/ ),你就会知道了。

 

1.7 深入了解

在后面的章节里,我们会介绍Opa的众多特性和实例。每一章关注于一个特定的Opa应用,以及如何结合本章和前面章节所学到的知识,更好地完成这个应用。在本手册的最后,另外有章节更详细地介绍Opa语言和平台的概念。

如果你有任何的疑问或反馈,可以直接联系我们。下面是取得联系一些方式:

期待您的加入,让我们一起改变web开发的方式。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值