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