Falcon初印象

2,031 views

Published on

Published in: Technology
0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
2,031
On SlideShare
0
From Embeds
0
Number of Embeds
28
Actions
Shares
0
Downloads
37
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide

Falcon初印象

  1. 1. Falcon 初印象 赖勇浩 2010.5.3
  2. 2. 特性 <ul><li>开源 </li></ul><ul><li>简单 </li></ul><ul><li>快速 </li></ul><ul><li>强大 </li></ul>
  3. 3. 我最讨厌 python 的 GIL <ul><li>Falcon 完全支持多线程编程 </li></ul><ul><li>每条线程都运行在一个单独的 VM 上 </li></ul>
  4. 4. 我最讨厌 python 不支持协程 <ul><li>不完全支持 </li></ul><ul><li>Falcon 支持 </li></ul>
  5. 5. 大家都讨厌 python 的速度 <ul><li>Falcon 要快得多 </li></ul><ul><li>Raw VM loop speed:1023 </li></ul><ul><ul><li>Python:442|340 </li></ul></ul><ul><ul><li>Lua:1247 </li></ul></ul><ul><li>Raw VM loop speed </li></ul><ul><ul><li>int a = 0; </li></ul></ul><ul><ul><li>for( int i = 0; i < 100000000; i++ ) a = a + 1; </li></ul></ul>
  6. 6. 第一行代码 <ul><li>number = 0 </li></ul><ul><li>数 = 0 </li></ul>
  7. 7. stdout <ul><li>print </li></ul><ul><li>printl </li></ul><ul><li>>> </li></ul><ul><li>> </li></ul>
  8. 8. if/elif/else 语句 <ul><li>if expression </li></ul><ul><ul><li>statements... </li></ul></ul><ul><li>elif expression </li></ul><ul><ul><li>statements... </li></ul></ul><ul><li>elif expression </li></ul><ul><ul><li>statements... </li></ul></ul><ul><li>/* other elifs */ </li></ul><ul><li>else </li></ul><ul><ul><li>statements... </li></ul></ul><ul><li>end </li></ul>
  9. 9. 逻辑操作符 <ul><li>and </li></ul><ul><li>or </li></ul><ul><li>not </li></ul><ul><li>not 优先级最高 </li></ul>
  10. 10. 三元表达式 <ul><li><condition> ? <if true> [ : <if false>] </li></ul>
  11. 11. switch 语句 <ul><li>switch expression </li></ul><ul><ul><li>case item [, item, .. item ] </li></ul></ul><ul><ul><ul><li>statements... </li></ul></ul></ul><ul><ul><li>case item [, item, .. item ] </li></ul></ul><ul><ul><ul><li>statements... </li></ul></ul></ul><ul><ul><li>/* other cases */ </li></ul></ul><ul><ul><li>default </li></ul></ul><ul><ul><ul><li>statements... </li></ul></ul></ul><ul><li>end </li></ul>
  12. 12. <ul><li>print( &quot;Enter your age: >&quot; ) </li></ul><ul><li>age = int( input() ) </li></ul><ul><li>switch age </li></ul><ul><ul><li>case 1 to 5 </li></ul></ul><ul><ul><ul><li>printl( &quot;You are too young to program. Maybe.&quot; ) </li></ul></ul></ul><ul><ul><li>case 6, 7, 8 </li></ul></ul><ul><ul><ul><li>printl( &quot;You may already be a great Falcon programmer.&quot; ) </li></ul></ul></ul><ul><ul><li>case 9, 10 </li></ul></ul><ul><ul><ul><li>printl( &quot;You are ready to become a programmer.&quot; ) </li></ul></ul></ul><ul><ul><li>default </li></ul></ul><ul><ul><ul><li>printl( &quot;What are you waiting for? Start programming NOW&quot; ) </li></ul></ul></ul><ul><li>end </li></ul>
  13. 13. <ul><li>switch month </li></ul><ul><ul><li>case nil </li></ul></ul><ul><ul><ul><li>> &quot;Undefined&quot; </li></ul></ul></ul><ul><ul><li>case &quot;Jan&quot;, &quot;Feb&quot;, &quot;Mar&quot;(P43) </li></ul></ul><ul><ul><ul><li>> &quot;Winter&quot; </li></ul></ul></ul><ul><ul><li>case &quot;Apr&quot;, &quot;May&quot;, &quot;Jun&quot; </li></ul></ul><ul><ul><ul><li>> &quot;Spring&quot; </li></ul></ul></ul><ul><ul><li>case &quot;Jul&quot;, &quot;Aug&quot;, &quot;Sep&quot; </li></ul></ul><ul><ul><ul><li>> &quot;Summer&quot; </li></ul></ul></ul><ul><ul><li>default </li></ul></ul><ul><ul><ul><li>> &quot;Autumn&quot; </li></ul></ul></ul><ul><li>end </li></ul>
  14. 14. 甚至是…… <ul><li>switch func </li></ul><ul><ul><li>case print </li></ul></ul><ul><ul><ul><li>printl( &quot;It was a print !!!&quot; ) </li></ul></ul></ul><ul><ul><li>case printl </li></ul></ul><ul><ul><ul><li>printl( &quot;It was a printl !!!&quot; ) </li></ul></ul></ul><ul><ul><li>case MyObject </li></ul></ul><ul><ul><ul><li>printl( &quot;The value of func is the same of MyObject&quot; ) </li></ul></ul></ul><ul><li>end </li></ul>
  15. 15. select 语句 <ul><li>select variable </li></ul><ul><ul><li>case TypeSpec </li></ul></ul><ul><ul><ul><li>...statements... </li></ul></ul></ul><ul><ul><li>case TypeSpec1 , TypeSpec2 , ..., TypeSpecN </li></ul></ul><ul><ul><ul><li>...statements... </li></ul></ul></ul><ul><ul><li>default </li></ul></ul><ul><ul><ul><li>...statements... </li></ul></ul></ul><ul><li>end </li></ul>
  16. 16. <ul><li>select param </li></ul><ul><ul><li>case IntegerType, NumericType </li></ul></ul><ul><ul><ul><li>return &quot;number&quot; </li></ul></ul></ul><ul><ul><li>case StringType: return &quot;string&quot; </li></ul></ul><ul><ul><li>case Test2: return &quot;class test2&quot; </li></ul></ul><ul><ul><li>case Test: return &quot;class test&quot; </li></ul></ul><ul><ul><li>case Instance: return &quot;instance obj&quot; </li></ul></ul><ul><ul><li>default : return &quot;something else&quot; </li></ul></ul><ul><li>end </li></ul>
  17. 17. while 语句 <ul><li>while expression </li></ul><ul><ul><li>statements... </li></ul></ul><ul><ul><li>[break] </li></ul></ul><ul><ul><li>statements... </li></ul></ul><ul><ul><li>[continue] </li></ul></ul><ul><ul><li>statements... </li></ul></ul><ul><li>end </li></ul>
  18. 18. loop 语句 <ul><li>count = 0 </li></ul><ul><li>loop </li></ul><ul><ul><li>> ++ count </li></ul></ul><ul><li>end count == 100 </li></ul><ul><li>哦,跟 do...while 语句一样…… </li></ul>
  19. 19. for/in 循环 <ul><li>嗯……其实很多语言都有……它的只是太强大了…… </li></ul><ul><li>for variable[,variable...] in collection </li></ul><ul><ul><li>...statements... </li></ul></ul><ul><ul><li>[break | continue | continue dropping] </li></ul></ul><ul><ul><li>...statements... </li></ul></ul><ul><ul><li>forfirst </li></ul></ul><ul><ul><ul><li>... first time only statements ... </li></ul></ul></ul><ul><ul><li>end </li></ul></ul><ul><ul><li>formiddle </li></ul></ul><ul><ul><ul><li>... statements executed between element processing ... </li></ul></ul></ul><ul><ul><li>end </li></ul></ul><ul><ul><li>forlast </li></ul></ul><ul><ul><ul><li>... last time only statements ... </li></ul></ul></ul><ul><ul><li>end </li></ul></ul><ul><li>end </li></ul>
  20. 20. continue dropping <ul><li>array = [ 1, 2, 3, 4, 5 ] </li></ul><ul><li>for elem in array </li></ul><ul><ul><li>if elem % 2 == 1 </li></ul></ul><ul><ul><ul><li>continue dropping </li></ul></ul></ul><ul><ul><li>end </li></ul></ul><ul><ul><li>printl( &quot;We accepted the even number: &quot;, elem ) </li></ul></ul><ul><li>end </li></ul>
  21. 21. dot-assign <ul><li>for elem in array </li></ul><ul><ul><li>.= 0 // sets all the array elements to zero... </li></ul></ul><ul><ul><li>printl(elem) // ... but prints the original items </li></ul></ul><ul><li>end </li></ul>
  22. 22. For/in ranges <ul><li>for value in [1:10] </li></ul><ul><ul><li>printl( value ) </li></ul></ul><ul><li>end </li></ul><ul><li>for value in [ 0: 11: 2 ] </li></ul><ul><ul><li>> value </li></ul></ul><ul><li>end </li></ul>
  23. 23. For/to loops <ul><li>for variable = lowerbound to upperbound [, step] </li></ul><ul><ul><li>// for/to body, same as for/in </li></ul></ul><ul><li>end </li></ul><ul><li>for i = 1 to 10 </li></ul><ul><ul><li>forfirst: >> &quot;Starting: &quot; </li></ul></ul><ul><ul><li>>> i </li></ul></ul><ul><ul><li>formiddle: >> &quot;, &quot; </li></ul></ul><ul><ul><li>forlast: > &quot;.&quot; </li></ul></ul><ul><li>end </li></ul><ul><li>for i = 2 to 10, 2 </li></ul><ul><ul><li>> i </li></ul></ul><ul><li>end </li></ul>
  24. 24. const <ul><li>const name = immediate_value </li></ul>
  25. 25. enum <ul><li>enum Seasons </li></ul><ul><ul><li>spring </li></ul></ul><ul><ul><li>summer </li></ul></ul><ul><ul><li>autumn </li></ul></ul><ul><ul><li>winter </li></ul></ul><ul><li>end </li></ul><ul><li>> Seasons.spring // 0 </li></ul>
  26. 26. <ul><li>enum Seasons </li></ul><ul><ul><li>spring = 1 // 1 </li></ul></ul><ul><ul><li>summer // 2 </li></ul></ul><ul><ul><li>midsummer = &quot;So hot...&quot; // &quot;So hot...&quot; </li></ul></ul><ul><ul><li>endsummer // 3 (string skipped) </li></ul></ul><ul><ul><li>autumn = 10.12 // 10.12 </li></ul></ul><ul><ul><li>winter // 11 </li></ul></ul><ul><li>end </li></ul>
  27. 27. 基本数据类型 <ul><li>Array </li></ul><ul><li>String </li></ul><ul><li>Dictionary </li></ul><ul><li>List </li></ul>
  28. 28. Array <ul><li>array = [&quot;person&quot;, 1, 3.5, int( &quot;123&quot; ), var1 ] </li></ul><ul><li>array = &quot;person&quot;, 1, 3.5, int( &quot;123&quot; ), var1 </li></ul><ul><li>a2 = .[ 1 2 3 4 'a' 'b' var1 + var2 var3 * var4 .[x y z]] </li></ul><ul><li>a, b, c = 1, 2, 3 </li></ul><ul><li>array = 1, 2, 3 </li></ul><ul><li>a, b, c = array </li></ul>
  29. 29. range <ul><li>R=[n : m] means &quot;all items from n to m-1&quot; </li></ul>
  30. 30. String <ul><li>string = &quot;Hello world&quot; </li></ul><ul><li>longString = &quot; </li></ul><ul><ul><li>Aye, matey, this is a very long string. </li></ul></ul><ul><ul><li>Let me tell you about my remembering </li></ul></ul><ul><ul><li>of when men were men, women were women, </li></ul></ul><ul><ul><li>and life was so great.“ </li></ul></ul><ul><li>iStr = ' </li></ul><ul><ul><li>国際ストリング </li></ul></ul><ul><ul><li>国際ストリング </li></ul></ul><ul><ul><li>‘ </li></ul></ul><ul><li>> 'Hello ''quoted'' world!' // Will print &quot;Hello 'quoted' world&quot; </li></ul><ul><li>基础特性跟 C 字符串相似 </li></ul>
  31. 31. String replication <ul><li>sep = &quot;-~*~-&quot; * 12 </li></ul><ul><li>> sep </li></ul><ul><li>> &quot; &quot;*25 + &quot;Hello there!&quot; </li></ul><ul><li>> sep </li></ul>
  32. 32. String-to-number concatenation <ul><li>string = &quot;Value: &quot; + 100 </li></ul><ul><li>> string // prints &quot;Value: 100&quot; </li></ul><ul><li>string = &quot;Value: &quot; % 64 </li></ul><ul><li>> string // prints &quot;Value: A&quot; </li></ul><ul><li>string %= 0x3B2 </li></ul><ul><li>> string // &quot;Value: Aβ&quot; </li></ul><ul><li>d_letter = &quot;a&quot; / 3 // chr( ord('a') + 3) == 'd' </li></ul><ul><li>a_letter = d_letter / -3 // chr( ord('d') - 3) == 'a' </li></ul><ul><li>> a_letter, &quot;, &quot;, d_letter </li></ul>
  33. 33. String expansion operator <ul><li>value = 1000 </li></ul><ul><li>printl( @ &quot;Value is $value&quot; ) </li></ul><ul><li>array = [ 100, 200, 300 ] </li></ul><ul><li>printl( @ &quot;Array is $array[0], $array[1], $array[2]&quot; ) </li></ul><ul><li>printl( @ &quot;The selected value is $(array[ value ]).&quot; ) </li></ul><ul><li>dict = [ &quot;a&quot; => 1, &quot;b&quot; => 2] </li></ul><ul><li>> @ &quot;A is $(dict['a']), and B is $(dict[&quot;b&quot;])&quot; </li></ul>
  34. 34. Dictionary <ul><li>dict = [ => ] // creates an empty dictionary </li></ul><ul><li>dict = [ &quot;a&quot; => 123, &quot;b&quot; => &quot;onetwothree&quot; ] </li></ul><ul><li>printl( dict[&quot;a&quot;] ,&quot;:&quot;, dict[&quot;b&quot;] ) // 123:onetwothree </li></ul><ul><li>a = [ 1=>'1', 2=>'2', &quot;alpha&quot;=>0, &quot;beta&quot;=>1 ] </li></ul>
  35. 35. List <ul><li>deque </li></ul><ul><li>高效的两端操作 </li></ul><ul><li>l = List( &quot;a&quot;, &quot;b&quot;, &quot;c&quot; ) </li></ul><ul><li>> &quot;Elements in list: &quot;, l.len() </li></ul><ul><li>> &quot;First element: &quot;, l.front() </li></ul><ul><li>> &quot;Last element: &quot;, l.back() </li></ul><ul><li>l.pushFront( &quot;newFront&quot; ) </li></ul><ul><li>> &quot;New first element: &quot;, l.front() </li></ul><ul><li>l.push( &quot;newBack&quot; ) </li></ul><ul><li>> &quot;New first element: &quot;, l.back() </li></ul><ul><li>l.popFront() </li></ul><ul><li>l.pop() </li></ul><ul><li>> &quot;Element count now: &quot;, l.len() </li></ul>
  36. 36. in/notin <ul><li>name = input() </li></ul><ul><li>if &quot;abba&quot; in name </li></ul><ul><ul><li>printl( &quot;Your name contains a famous pop group name&quot; ) </li></ul></ul><ul><li>end </li></ul><ul><li>dict = [ &quot;one&quot; => 1 ] </li></ul><ul><li>if &quot;one&quot; in dict </li></ul><ul><ul><li>printl( &quot;always true&quot; ) </li></ul></ul><ul><li>end </li></ul><ul><li>if &quot;abba&quot; notin name </li></ul><ul><ul><li>printl( &quot;Your name does not contain a famous pop group name&quot; ) </li></ul></ul><ul><li>end </li></ul>
  37. 37. Memory buffers <ul><li>memory = MemBuf( 5, 2 ) // creates a table of 5 elements, each 2 bytes long. </li></ul><ul><li>for value in [0:5] </li></ul><ul><ul><li>memory[ value ] = value * 256 </li></ul></ul><ul><li>end </li></ul>
  38. 38. Bitwise operators <ul><li>&& </li></ul><ul><li>|| </li></ul><ul><li>^^ </li></ul><ul><li>~ </li></ul><ul><li><< </li></ul><ul><li>>> </li></ul><ul><li>&= |= ^= </li></ul><ul><li><<= >>= </li></ul>
  39. 39. <ul><li>value = 0x1 || 0x2 // or bits 0 and 1 </li></ul><ul><li>// display binary: </li></ul><ul><li>> @&quot;$(value:b)b = $(value:X)H = $value&quot; </li></ul><ul><li>value = value && 0x1 // turns off bit 2 </li></ul><ul><li>> @&quot;$(value:b)b = $(value:X)H = $value&quot; </li></ul><ul><li>value = ~value && 0xFFFF // Shows first 2 bytes of reversed value </li></ul><ul><li>> @&quot;$(value:b)b = $(value:X)H = $value&quot; </li></ul><ul><li>value = value ^^ 0x3 // turns off bit 2 and on bit 1 </li></ul><ul><li>> @&quot;$(value:b)b = $(value:X)H = $value&quot; </li></ul>
  40. 40. 函数 <ul><li>function do_something( parameter ) </li></ul><ul><ul><li>printl( &quot;Hey, this is a function saying: &quot;, parameter ) </li></ul></ul><ul><li>end </li></ul><ul><li>return nil </li></ul>
  41. 41. <ul><li>function square( x ) </li></ul><ul><ul><li>y = x * x </li></ul></ul><ul><ul><li>return y </li></ul></ul><ul><li>end </li></ul>
  42. 42. 递归 <ul><li>function sum_of_first( x ) </li></ul><ul><ul><li>if x > 1 </li></ul></ul><ul><ul><ul><li>return x + sum_of_first( x - 1 ) </li></ul></ul></ul><ul><ul><li>end </li></ul></ul><ul><ul><li>return x </li></ul></ul><ul><li>end </li></ul>
  43. 43. Local and global variable names <ul><li>sqr = 1.41 </li></ul><ul><li>function square( x ) </li></ul><ul><ul><li>printl( &quot;sqr was: &quot;, sqr ) </li></ul></ul><ul><ul><li>sqr = x * x </li></ul></ul><ul><ul><li>return sqr </li></ul></ul><ul><li>end </li></ul><ul><li>number = square( 8 ) * sqr </li></ul><ul><li>function square_in_z( x ) </li></ul><ul><ul><li>global z </li></ul></ul><ul><ul><li>z = x * x </li></ul></ul><ul><li>end </li></ul><ul><li>z = 0 </li></ul><ul><li>square_in_z( 8 ) </li></ul><ul><li>printl( z ) // 64 </li></ul>
  44. 44. <ul><li>function say_something() </li></ul><ul><ul><li>static </li></ul></ul><ul><ul><ul><li>data = [ &quot;have&quot;, &quot;a&quot;, &quot;nice&quot;, &quot;day&quot; ] </li></ul></ul></ul><ul><ul><ul><li>current = 0 </li></ul></ul></ul><ul><ul><li>end </li></ul></ul><ul><ul><li>if current == len( data ) </li></ul></ul><ul><ul><ul><li>return </li></ul></ul></ul><ul><ul><li>end </li></ul></ul><ul><ul><li>element = data[current] </li></ul></ul><ul><ul><li>current += 1 </li></ul></ul><ul><ul><li>return element </li></ul></ul><ul><li>end </li></ul>
  45. 45. Anonymous and nested functions <ul><li>innerfunc </li></ul><ul><li>var = innerfunc ( [param1, param2, ..., paramN] ) </li></ul><ul><ul><li>[static block] </li></ul></ul><ul><ul><li>[statements] </li></ul></ul><ul><li>end </li></ul><ul><li>square = innerfunc ( a ) </li></ul><ul><ul><li>return a * a </li></ul></ul><ul><li>end </li></ul><ul><li>printl( &quot;Square of 10: &quot;, square( 10 ) ) </li></ul>
  46. 46. Function closure <ul><li>function keyword </li></ul><ul><li>function makeMultiplier( operand ) </li></ul><ul><ul><li>multiplier = function( value ) </li></ul></ul><ul><ul><ul><li>return value * operand </li></ul></ul></ul><ul><ul><li>end </li></ul></ul><ul><ul><li>return multiplier </li></ul></ul><ul><li>end </li></ul><ul><li>m2 = makeMultiplier( 2 ) // ... by 2 </li></ul><ul><li>> m2( 100 ) // will be 200 </li></ul><ul><li>m4 = makeMultiplier( 4 ) // ... by 4 </li></ul><ul><li>> m4( 100 ) // will be 400 </li></ul>
  47. 47. Codeblocks <ul><li>匿名函数的语法糖 </li></ul><ul><li>lambda 表达式 </li></ul><ul><li>block = { [p1, p2..., pn] => expression } </li></ul><ul><li>// or </li></ul><ul><li>block = { [p1, p2..., pn] => </li></ul><ul><ul><li>statement </li></ul></ul><ul><ul><li>... </li></ul></ul><ul><li>} </li></ul><ul><li>printl( {a, b => a + b}(2,2) ) </li></ul>
  48. 48. Callable arrays <ul><li>array 的第一个元素是函数,即为 callable array </li></ul><ul><li>printl( &quot;Hello world&quot; ) </li></ul><ul><li>[printl]( &quot;Hello world&quot; ) </li></ul><ul><li>[printl, &quot;Hello&quot;]( &quot; world&quot; ) </li></ul><ul><li>[printl, &quot;Hello&quot;, &quot; &quot;, &quot;world&quot;]() </li></ul><ul><li>i = 0 </li></ul><ul><li>icall = .[printl $i &quot;: &quot;] </li></ul><ul><li>for i in [0:10]: icall( &quot;Looping...&quot; ) </li></ul>
  49. 49. Accessing the calling context <ul><li>fself keyword </li></ul><ul><li>caller keyword </li></ul><ul><li>function recurse( val ) </li></ul><ul><ul><li>if val <= 0: return 1 </li></ul></ul><ul><ul><li>> recurse.caller(), &quot;:&quot;, val // or fself.caller() </li></ul></ul><ul><ul><li>return recurse( val-1 ) + val </li></ul></ul><ul><li>end </li></ul><ul><li>recurse( 5 ) </li></ul>
  50. 50. Non positional parameters <ul><li>function f( alpha, beta, gamma ) </li></ul><ul><ul><li>> @&quot;alpha: $alpha&quot; </li></ul></ul><ul><ul><li>> @&quot;beta : $beta&quot; </li></ul></ul><ul><ul><li>> @&quot;gamma: $gamma&quot; </li></ul></ul><ul><li>end </li></ul><ul><li>f( gamma| &quot;a&quot; + &quot;b&quot; + &quot;c&quot;, beta|&quot;b-value&quot; ) </li></ul>
  51. 51. <ul><li>future bindings </li></ul><ul><li>future_beta = beta|&quot;b-value&quot; </li></ul><ul><li>future_gamma = lbind( &quot;gamma&quot;, &quot;a&quot; + &quot;b&quot; + &quot;c&quot; ) </li></ul><ul><li>f( future_gamma, future_beta ) </li></ul><ul><li>The lbind function can create late and future bindings; </li></ul><ul><li>f( non_existing|&quot;value&quot; ) // raises an error! </li></ul>
  52. 52. object <ul><li>object object_name [ from class1, class2 ... classN] </li></ul><ul><ul><li>property_1 = expression </li></ul></ul><ul><ul><li>property_2 = expression </li></ul></ul><ul><ul><li>... </li></ul></ul><ul><ul><li>property_N = expression </li></ul></ul><ul><ul><li>[init block] </li></ul></ul><ul><ul><li>function method_1( [parameter_list] ) </li></ul></ul><ul><ul><ul><li>[method_body] </li></ul></ul></ul><ul><ul><li>end </li></ul></ul><ul><ul><li>... </li></ul></ul><ul><ul><li>function method_N( [parameter_list] ) </li></ul></ul><ul><ul><ul><li>[method_body] </li></ul></ul></ul><ul><ul><li>end </li></ul></ul><ul><li>end </li></ul>
  53. 53. object 就是单件模式?
  54. 54. class <ul><li>class class_name[ ( param_list ) ] [ from inh1[, inh2, ..., inhN] ] </li></ul><ul><ul><li>[ static block ] </li></ul></ul><ul><ul><li>[ properties declaration ] </li></ul></ul><ul><ul><li>[init block] </li></ul></ul><ul><ul><li>[method list] </li></ul></ul><ul><li>end </li></ul>
  55. 55. <ul><li>class mailbox( max_msg ) </li></ul><ul><ul><li>capacity = max_msg * 10 </li></ul></ul><ul><ul><li>name = nil </li></ul></ul><ul><ul><li>messages = [] </li></ul></ul><ul><ul><li>init </li></ul></ul><ul><ul><ul><li>printl( &quot;Box now ready for &quot;, self.capacity, &quot; messages.&quot; ) </li></ul></ul></ul><ul><ul><li>end </li></ul></ul><ul><ul><li>function slot_left() </li></ul></ul><ul><ul><ul><li>return self.max_msg - len( self.messages ) </li></ul></ul></ul><ul><ul><li>end </li></ul></ul><ul><li>end </li></ul>
  56. 56. Property accessors <ul><li>__set_propname/__get_propname </li></ul><ul><li>class Series( values ) </li></ul><ul><ul><li>values = values </li></ul></ul><ul><ul><li>function __get_mean() </li></ul></ul><ul><ul><ul><li>sum = 0 </li></ul></ul></ul><ul><ul><ul><li>for i in self.values: sum += i </li></ul></ul></ul><ul><ul><ul><li>return sum / self.values.len() </li></ul></ul></ul><ul><ul><li>end </li></ul></ul><ul><li>end </li></ul><ul><li>s = Series( [14,53,18,8] ) </li></ul><ul><li>> &quot;The mean is: &quot;, s.mean // 23.25 </li></ul>
  57. 57. <ul><li>class parent1( p ) </li></ul><ul><li>end </li></ul><ul><li>class parent2( p ) </li></ul><ul><li>end </li></ul><ul><li>class child(p1, p2) from parent1( p1 ), parent2( p2 ) </li></ul><ul><ul><li>init </li></ul></ul><ul><ul><ul><li>> &quot;Initializing child with &quot;, p1, &quot; and &quot;, p2 </li></ul></ul></ul><ul><ul><li>end </li></ul></ul><ul><li>end </li></ul><ul><li>instance = child( &quot;First&quot;, &quot;Second&quot; ) </li></ul>
  58. 58. Private members <ul><li>_ </li></ul><ul><li>object privateer </li></ul><ul><ul><li>_private = 0 </li></ul></ul><ul><ul><li>function getPrivate(): return self._private </li></ul></ul><ul><ul><li>function setPrivate(value): self._private = value </li></ul></ul><ul><li>end </li></ul>
  59. 59. Operator overloading <ul><li>class OverPlus( initValue ) </li></ul><ul><ul><li>numval = initValue </li></ul></ul><ul><ul><li>function add__( operand ) </li></ul></ul><ul><ul><ul><li>return OverPlus( self.numval + operand ) </li></ul></ul></ul><ul><ul><li>end </li></ul></ul><ul><li>end </li></ul><ul><li>op = OverPlus( 10 ) </li></ul><ul><li>nop = op + 10 </li></ul><ul><li>> nop.numval //: 20 </li></ul>
  60. 60. Comparison overloading <ul><li>Comparison operators, namely <, >, <=, >=, == and != all refer to the same overloaded method: compare. </li></ul><ul><li>没有 __ 结尾 </li></ul><ul><li>class CmpOver( val ) </li></ul><ul><ul><li>number = val </li></ul></ul><ul><ul><li>function compare( oper ) </li></ul></ul><ul><ul><ul><li>if oper provides number </li></ul></ul></ul><ul><ul><ul><ul><li>return self.number - oper.number </li></ul></ul></ul></ul><ul><ul><ul><li>elif oper.typeId() == NumericType or oper.typeId() == IntegerType </li></ul></ul></ul><ul><ul><ul><ul><li>return self.number - oper </li></ul></ul></ul></ul><ul><ul><ul><li>end </li></ul></ul></ul><ul><ul><ul><li>return nil </li></ul></ul></ul><ul><ul><li>end </li></ul></ul><ul><li>end </li></ul><ul><li>ten = CmpOver( 10 ) </li></ul><ul><li>> &quot;Is ten > 5? &quot;, ten > 5 </li></ul><ul><li>> &quot;Is ten != 3? &quot;, ten != 3 </li></ul><ul><li>> &quot;Is ten <= 10? &quot;, ten <= 10 </li></ul><ul><li>> &quot;Is ten > an array? &quot;, ten > [1,2,3] </li></ul>
  61. 61. Subscript overloading <ul><li>[] </li></ul><ul><li>getIndex__ </li></ul><ul><li>setIndex__ </li></ul>
  62. 62. Automatic string conversion <ul><li>toString method </li></ul>
  63. 63. Error recovery <ul><li>try </li></ul><ul><ul><li>[try statements] </li></ul></ul><ul><ul><li>[ catch [object_type] [ in error_variable] ] </li></ul></ul><ul><ul><li>[ catch statements ] </li></ul></ul><ul><li>end </li></ul><ul><li>raise keyword </li></ul>
  64. 64. Thank you! <ul><li>@laiyonghao </li></ul><ul><li>http://laiyonghao.com </li></ul><ul><li>[email_address] </li></ul>

×