shawind 发表于 2010-1-23 14:43:58

Genie-02-函数、判断、循环和错误处理

###函数
定义的方式等和python,ruby,boo差不多的样子。

def add(a:int, b:int):int
    return a+b

init
    print "%d", add(45,55)


对于函数的参数来说还有个问题,就是传递的是值还是引用。
可以在参数前加ref关键字来强制使用引用传递。

def change(x:int, ref y:int)
    x = 100
    y = 200
init
    var a = 1
    var b = 2
    
    change(a,ref b)
    print "a:%d\nb:%d", a, b

可以看到,a的值还是一开始的1,而b的值就已经被改变了。
另外还有个out,用法和ref差不多,但是out引用的那个变量没有被初始化时,out会帮它初始化,而ref只会报错。

def fn(ref x:int)
    x += 1
init
    z:int
    fn(ref z)
    print ("%d",z)

这段用ref就是错误。改成out就可以了。

def fn(out x:int)
    x += 1
init
    z:int
    fn(out z)
    print ("%d",z)


###判断语句
if..do..
if..else..
if..else if..else..
简单点的时候,可以利用do写在一行里。

init
    i:int = 3

    if i < 3
        print "i<3"
    else if i == 3
        print "i=3"
    else
        print "i<3"
    
    if i == 3 do print "i=3"


case..when..default..
和c中的switch的用法是差不多的。可以把多个条件放在一个when里,是个有趣的功能。

init
    i:int = 3
    case i
        when 0,1,2
            print "i<3"
        when 3
            print "i=3"
        default
            print "i>3"


###循环语句
for计数循环
有两种,递增和递减,也可以像if那样利用do写在一行中。
不能自己指定间隔的数值是个遗撼。

init
    for i:int = 1 to 10 do print "%d", i

从1开始(包含1)递增1到10(包含10)为止

init
    for i:int = 10 downto 1
        print "%d", i

从10开始(包含10)递减1到1(包含1)为止

for..in..
for还可以用于对array,list,dict等类型进行递代器循环,就像c#,d语言的foreach那样。
当然do也还是可以用的。

init
    var d = new dict of string,int
    d.set("a",1)
    d.set("b",2)
    d.set("c",3)
    for n in d.keys
        print "%s:%d", n, d

不过0.7.9里,输出的排序有点错位,最后一个排到最前面了。应该是Bug吧。

while..
do..while..
循环,没什么好说的。 和break,continue一起说吧。
break是跳出循环。
continue是回到循环开始处

init
    i:int = 0
    while i < 10
        i++
        if i == 5 do break
        if i == 3 do continue
        print "%d", i


init
    i:int = 0
    do
        i++
        if i == 5 do break
        if i == 3 do continue
        print "%d", i
    while i < 10


###错误处理
Genie是用的GLib中GError来处理可恢复运行时错误。
assert断言

init
    i:int = 3
    assert i == 3

不管断言的内容是否为真,都可以完成编译。
如果为真,程序正常运行,如果为假,则程序运行时报错然后完蛋。

exception定义错误类型信息,与enum用法类似
raises 接在函数定义后面,调用函数时会引起什么类型的错误提示
raise 在适当的时侯抛出错误
try..except..finally..捕获处理错误

exception RPError
    GOOD_PERSION_CARD

def fn() raises RPError
    raise new RPError.GOOD_PERSION_CARD("You are a good person!")

init
    try
        fn()
    except ex:RPError
        print ex.message
    finally
        print "out!"


简单的很快就看完了,后面就是难了。唉...
页: [1]
查看完整版本: Genie-02-函数、判断、循环和错误处理