做者:perlvim@gmail.com 2013/6/17linux
版權: 不經贊成,也可隨意轉載算法
Io 語言借鑑了 SmallTalk 的消息機制,Self 的原型模型,NewtonScript 的多重繼承,Act1 語言的併發原理,Lisp 的運行時動態語法和 Lua 的小巧,可嵌入性。編程
學習 Io 可以讓你無限接近 Lisp 的設計理念。並且不須要那麼多括號。vim
Io 語言是一種徹底的原型語言,另外還有 Javascript, Lua 都是基於原型的語言。windows
若是你想了解解釋器的原理,或者想本身製做一個解釋器的話,學習 Io 將 讓你事半功倍。由於 Io 語言內置的可定製的詞法分析器和動態擴展語法, 讓你有可能用極少的代碼,構建一門語言的解釋器,並得到可觀的性能。由於 在併發領域,Io 的算法模型甚至比 C 更快。數據結構
Io 精緻小巧的設計和無以倫比的領域特定語言(DSL)能力,將幫助你在許多領域成爲 語言解析方面的專家。併發
和許多編程入門書同樣,從打印一個簡單的 "hello world" 開始吧app
"hello world!" print
for windows: http://iobin.suspended-chord.info/win32/iobin-win32-current.zip for linux x86: http://iobin.suspended-chord.info/linux/iobin-linux-x86-rpm-current.zip for linux x64 http://iobin.suspended-chord.info/linux/iobin-linux-x64-rpm-current.zip
Io 的註釋同 PHP 的很像:函數
# This is comment of Io "hello world" print // This is comment of Io "hello world" print /* this is comment */ "hello world" print // This is comment /* this is comment */
Io 的語句是以分號或回車結束性能
"print hello" print; "print thanks" print; "print hello" print "print thanks" print
初始化一個變量並進行賦值,是用 ":=", 改寫一個已經存在的變量,才能夠用 "=".
var := "string" var = "other string"
字符串字面量必須用雙引號來進行標記,單引號是無效的。若是內容中有雙引號, 就要進行轉義:
var := "this is \"string\"!"
在 Io 中,全部的數據都是對象,包括字符串和數字。type 方法能夠獲取對象的類型
Io> "string" type --> Sequence
在 Io 中,字符串字面量的數據類型是 Sequence, 這和其餘語言不一樣,Io 中 出現的方法名,變量名等標識符,都是一種 Sequence, 叫作 Symbol,這個和 Ruby 中的 Symbol 很像,這個類型是不可變的,也就是說沒有什麼方法能修改這個數據, 除非用一個副原本保存計算結果。
從另一個方面也說明,全部相似字符串形式的變量,在 Io 內部都是以字符序列 的方式保存的。
Io 中的 String 類型是一種不可變的字符序列
Io> String type --> ImmutableSequence Io> 13 type --> Number
Lobby 是 Io 的主命名空間,至關於Java 的 main 包。命名空間也是 Object.
Io> Lobby type --> Object
許多類型的 type 就是它本身,也就是頂級對象, 不能繼續尋根溯源(內部進行了封裝):
Io> true type --> true Io> false type --> false Io> Sequence type --> Sequence Io> Number type --> Number
相似的類型還有 Range, Vector, nil, System, List, Block, Map, Return Object, Path, File, WeakLink, Message,...
Io 的表達式是一個對象開始的,而後後面串聯了一些消息(Message), 消息的 做用相似於面嚮對象語言中的方法,但中間是以空格鏈接的。括號用來表示優先級。 括號內部的表達式被當成一個獨立的表達式進行計算。
Io> if(1 > 2) then("It is impossible" print) else("It is ok" print) Io> method("hello world" print)
Io 的語法極其簡單,就好象 Lisp 同樣,幾乎全部的抽象都是用相似函數的 結構完成的。Io 稱爲 Block, method(..) 結構最接近方法的抽象,也是一種 Block. Block 和 method 的區別和 Ruby 中的 Lamda 和 方法的區別差很少, Block 有本身的獨立的參數,而 method 隱含的從調用的對象中繼承對象本身。
Io 全部的數據結構都是從 List 開始的。
Io> array := List(1, "thanks", "Lobby", 0xff)
新建一個列表:
a := List clone a = list(33, "a")
也能夠用下面的語法,直接賦值:
a := list(33, "a")
添加一個元素:
a append("b") ---> list(33, a, b)
獲取列表的大小:
a size ---> 3
Map 就好象 Perl/Ruby 中的散列:
Io> map := Map clone Io> map atPut("key1", "value1") Io> map atPut("key2", "value2") Io> map keys --> list(key2, key1)
Io 中的 Map 是沒有順序的,插入數據的順序不會被保存。初始化 Map 沒有語法糖。 只能先 clone 一個對象後,用 atPut 的方法來添加鍵值對。
其餘的數據結構還有,Sequence
文件讀取的方法有:openForAppending, openForReading, openForUpdating.
f := File with("foo.txt") f remove f openForUpdating f write("hello world!") f close
第一部分完