rosial

lost memory
数据加载中……

《爪哇夜未眠》- REBOL篇 - REBOL的特色

    

从计算机科学(computer science)的角度来看,REBOL是一个高度动态(dynamic)、多态(polymorphic)、反射(reflective)、脉络相关(context-dependent)、符式(symbolic)、功能性(functional)的语言【注】。这些学院派的名词,留着给教授们细细品味。在本文章,我要用白话的方式来解释REBOL

REBOLRelative Expression-Based Object Language的缩写(abbreviation)。顾名思义,REBOL是一种Relative Expression-Based Language,也是一种Object-Based Language,本节会解释这两者的意义。除此之外,我也说明REBOL的一些特殊之处。总而言之,REBOL是一个打破传统,不同流俗的编程语言【注】。

【注】正因为REBOL不同流俗,所以已经有编程经验的人,在学习REBOL的初期,可能会有一些不适应。我给你们建议是,学习REBOL时,最好暂时忘了其它语言。

方言

所谓的Relative Expression就是“方言”(dialect)的意思,REBOL能够如此简洁,一半功劳要归于方言。例如:写一个程序,来打开一个窗口(window),窗口上面显示红色的“Hello REBOL”字样,以及一个“OK”按钮(button),按下按钮之后,窗口会立刻关闭。对许多语言来说(包括JavaC#),要写出这样的程序,少则需要十几行源码,多则需要数十行源码。但是REBOL利用VIDVisual Interface Dialect视觉接口方言)只要下面一行就可以做到【注】,执行画面如图1所示。

view layout [ Title "Hello REBOL" red Button "OK" [quit] ]

【注】如果你想动手试试这一行程序,请记得使用含View功能的REBOL版本。也请注意,REBOL不区分英文字母大小写。

只要一行,就可以写出这样的REBOL程序

这就是方言的威力。不同的应用领域(application domain)会有不同的方言,也就是行话(jargon)。例如:律师有律师的行话,建筑业有建筑业的行话,音乐家有音乐家的行话。这些行话不受一般语法的约束规范,自成一套体系,行话通常比正常的语言来得简洁、有力。举例来说,SQLStructured Query Language)就可以算是一种方言,而不是一般的编程语言,SQL专门用来进行数据库查询。拿SQL来做别的事(例如设计游戏软件),SQL一定做不好,但是拿SQL来和数据库进行沟通,却没有其它编程语言(C#Java)可以做得比SQL好,因为SQL的应用领域在数据库查询(query)。

REBOL已经有许多方言,每个方言的规模都不大,很容易学,最有名的REBOL方言是VIDVisual Interface Dialect),可以让我们很轻易地设计出窗口程序。除了REBOL内建(built-in)的方言之外,编程员也可以建立自己的方言。例如:有人用REBOL建立了一个REBOL/Flash方言,可以用来产生FlashSWF档案格式(file format),请看网址:http://sweb.cz/oliva.david/swf/

Object

REBOLobject language,因为它具备封装(encapsulation)的概念,可以把数据和动作包装在一个对象(object)中。但是REBOL只能算是object-based language,不是Object-Oriented LanguageOOL),因为它不具有继承和多态【注】。学院派的定义是:同时具备封装、继承、多态的语言,才是OOL

【注】本节一开始提到REBOL是一种多态的语言,这里却又说REBOL不具备多态。我没有自相矛盾,因为此多态非彼多态。REBOL支持参数式多态(parametric polymorphism),也就是通称的Overloading。但是REBOL不支持OO要求的多态(也就是Overriding / Virtual Method)。

OO是近年的显学,似乎大家都喜欢OO。乍闻REBOL不支持继承和多态,还真是让人无所适从,担心REBOL会不会是一个残缺不全的语言?事实上,因为REBOL设计的非常巧妙,没有继承和多态并无大碍。继承和多态的好处在于:程序代码的复用(code reuse),以及设计的复用(design reuse)。REBOL虽然不支持继承和多态,但是这两点都做得到。所以有没有支持继承和多态,也就不重要了。反倒因为不支持继承和多态,REBOL变得相当容易学习,因为继承和多态(特别是多态)一直都是OO编程入门者会遭遇到的学习瓶颈。

丰富的数据类型

C语言支持的类型有intchar等近十种,Java支持类型的数目稍多一点,C#支持类型的数目又比Java更多一点,但还是比不上REBOLREBOL所支持的类型超过50个,传统的整数、浮点数(floating point number)、字符(character)、字符串(string)当然REBOL都有提供,更特别的是,REBOL提供许多现代化的类型,例如e-MailURLHTML的卷标(tag)等,都是类型。请看下面的REBOL例子:

>> myEmail: xy.cai@msa.hinet.net

>> type? myEmail

== email!

我将myEmail设定为xy.cai@ msa.hinet.net,然后问myEmail的类型(type)为何,得到的答案正是email!类型。

想知道REBOL支持哪些类型吗?在REBOLconsole中输入:

>> help datatype!

Reflectivity打破数据和程序的藩篱

REBOL里面,一切都是“值(value)”,也就是数据。程序代码(code)和数据(data)之间没有明确的分际。这样的观念并非REBOL首创,毕竟早在1959年诞生的Lisp语言就是如此,只是这样的作法并非主流。

Reflectivity(反射)是一面照妖镜,所有事物的内在无所遁形。REBOL具有高度动态的reflectivity,所以数据和程序码的分际无须存在,数据可以是程序,程序也可以是数据,一切都被reflectivity所掌控,就好像孙悟空再怎么变,仍逃不出如来佛的掌心。

请先牢记一句话:任何东西,只要没被求值(evaluate)【注】,就只是数据,而不是程序代码。

内建分析器

REBOL内建分析器(parser),这个分析器相当好用,而且比PerlJavaC#等语言所使用的Regular Expression【注】更简单易懂,还可以搭配REBOL的数据类型来使用。

【注】Regular Expression的功能强大,没人会否认;但是Regular Express不好学、容易忘记、容易犯错,这也没人能否认。

有了此分析器,搭配reflectivity,就能轻易地设计出方言解译器。如果你是其它语言的使用者,你可以告诉朋友,“我写了一个不错的C#程序库,你想不想试试?”。在REBOL世界,我们喜欢告诉朋友,“我设计了一个不错的REBOL方言,你想不想试试?”酷!

关于方言的其它解说,请参考本文章第一小节的叙述。

 

发表日期: Feb. 8, 2004

posted on 2006-07-10 13:21 rosial 阅读(558) 评论(0)  编辑  收藏 所属分类: 蔡学镛


只有注册用户登录后才能发表评论。


网站导航: