Io中函数(方法)的定义与调用

定义函数:

foo := method(param1, param2, do_something)

例如定义一个加法运算的函数:

plus := method(p1, p2, writeln(p1+p2))

调用函数:plus(20,30) 即可。

再例举几个代码片段:

plotf := method (fn, min, max, step,
for (i, min, max, step,
fn call(i) roundDown repeat(write(“*”))
writeln
)
)

plotf( block(n, n exp), 0, 4, 1/2 )

 

plotm := method (msg, min, max, step,
for (i, min, max, step,
i doMessage(msg) roundDown repeat(write(“*”))
writeln
)
)

plotm( message(exp), 0, 4, 1/2 )

备注:感觉没有代码渲染的话,用blog写代码真难阅读。正在考虑为这个博客增加一个代码渲染插件。

URL中获得GET中的参数

在PHP中,获得GET的参数很容易,只需要$_GET['somename']这样的形式就可以获得相应的内容。而在ioLanguage中,则需要自己做一些处理:

cgi := CGI clone

redirect := cgi getParameters at(“redirurl”)
if (redirect and redirect != “”, System exit(0))

cgi header(“Content-type”, “text/html”)

cgi write(“GET Parameters:”)
cgi getParameters foreach(k, v, cgi write(k .. ” = ” .. v .. “,”))

IoLanguage在Web中的应用

流行的WebServer有Apache和Lighttpd,而IoLanguage似乎在Apache下有个模组,叫做mod_io,不过这个模组似乎已经不再更新了,又或者是我没有找到。看到有人介绍通过源码编译这个模组,不过感觉太麻烦,于是考虑其他方法。

比较好的方法是CGI,无论Apache还是Lighttpd都支持,刚刚经过实验,已经可以顺利在lighttpd中通过CGI方式调用IoLanguage,不过还没有尝试FastCGI。

觉得既然要大家一起玩儿Iolanguage、一起交流学习这个语言,那不如就用这个语言来做这个网站,如此应用起来更频繁,也更能在实际使用中找到问题。

IoLanguage中的文件读写操作

# IO中的文件读写操作

# 创建文件对象实例,并在初始化时指定文件名
fpHandle := File with(“foo.txt”)

# 打开文件
fpHandle openForUpdating

# 向文件中写入字符串
fpHandle write(“hello, iolanguage!”)

# 关闭文件
fpHandle close

# 再次以reading方式打开文件
fpHandle2 := File openForReading(“./foo.txt”)

# 读取文件内容并输出
fpHandle2 contents println

如何在Ubuntu下安装IoLanguage

Ubuntu的软件源中尚未收录IoLanguage的二进制版本,因而需要我们手动编译其源代码。不过io的源码编译过程非常简单,只需要按照如下步骤进行即可:

1、首先,安装cmake:

$ sudo apt-get install cmake

2、然后从GitHub上获取IoLanguage的源码:

$ wget –no-check-certificate http://github.com/stevedekorte/io/zipball/master -O io-lang.zip

3、解压缩:

$ unzip io-lang.zip

4、进入源代码目录(此步骤的目录名可能会有不同,具体以实际解压得到的目录名为准):

$ cd stevedekorte-io-d21052

5、运行编译脚本:

$ ./build.sh

6、运行安装脚本(如果安装过程失败,有可能是权限问题导致的,可加sudo再次安装):

$ ./build.sh install

至此,io被安装到了/usr/local中。如果希望将io安装到其他位置,则需要在第5步前对脚本进行配置修改,为了便于简化安装步骤,本文不详细描写如何改写编译脚本。

最后,运行io,看看是不是已经进入到IoLanguage的REPL环境中了?

Io中没有Socket和Server类的原因

按照网上的一些文章介绍敲打代码,发现Io中没有Socket和Server两个网路相关的类,其原因(可能)是在编译构建的时候是基于libevent库的,所以如果系统中没有libevent又或者编译过程中遇到错误跳过,就自然没有Socket和Server两个类了。

对于学习语法而言,这个问题并不算障碍,但如果真想写一些实用的程序,如果没有网路功能,多多少少还是有些难以胜任的。

IOLanguage内置的库

猜想这个语言原来叫这名字是想解决IO的同步语法异步实现问题, 目前重点也是在这方面, 它通过coroutine实现了异步Socket和AIO, 可以使用简单的同步逻辑完成复杂的异步过程. Erlang虽然也能轻松完成, 但FP语法大多数人感觉并不友好.

这个语言借鉴了Lisp/Scheme的简洁, 甚至没有关键字. 同时它也提供了OO编程方法, 这方面借鉴了JavaScript/Ruby这类语言的优点, 用起来还是很不错的. 目前性能比较低, 属实验阶段, 开发时间不长, 但它的内置库却异常丰富, GUI/DB/WEB等各方面都有点, 如果对性能进行提升后发布正式版本, 可以预见它的前景会非常好.

它目前内置的库包括:
async sockets and async dns
sqlite, dbi, qdbm, regex, xml/html parsing
md5, sha1, zlib, lzo, blowfish, curses
opengl, portaudio, freetype, ffmpeg
objective-c bridge

 

IoLanguage印象

1、它是个Prototype-Based的语言,和JavaScript挺像。

2、语法某些方面和Lisp有些像,和Objective-C也挺像,也有点Ruby的模样。

3、它没有关键字。

4、它支持高并发,用Coroutine实现。

5、它支持同步、异步调用,Actor模式。

6、面向对象、动态类型。

从它的例子看,它在支持高并发、Actor方面,比ErLang更友好,由于是面向对象的,又有 Prototype-Based 的可扩充的优点,看起来非常好。

if, then, else

IO language中“if”条件判断,有多种灵活的形式,列举如下:

常规的形式是 if ( <条件>, <条件成立时>, <条件不成立时> )

例如下面判断变量a是否为“1”:

a := 1
if(a==1, “a is 1″ print, “a is not 1″ print)

如果只单纯地进行if成立操作,而没有else,可以写为如下形式:

a := 1
if(a == 1, “a is 1″ print)

除了上面的两种写法之外,if条件成立与否的代码段返回结果会被返回,因而上面的代码也可简化成如下形式:

a := 2
x := if(a==1, “a is 1″, “a is not 1″)
x print

通过then和else关键字,可以将if的结构更加清晰地展现出来:

a := 2
if(a == 1) then(“a is 1″ print) else(“a is not 1″ print)

io language同样还支持elseif关键字:

y := 10
if(y < 10) then(x := y) elseif(y == 11) then(x := 0) else(x := 2)
“x is “+x print
x print