Io Language 學習教程(1)

Io 語言簡介(1)

做者:perlvim@gmail.com 2013/6/17linux

版權: 不經贊成,也可隨意轉載算法

Io 語言學習的意義

Io 語言借鑑了 SmallTalk 的消息機制,Self 的原型模型,NewtonScript 的多重繼承,Act1 語言的併發原理,Lisp 的運行時動態語法和 Lua 的小巧,可嵌入性。編程

學習 Io 可以讓你無限接近 Lisp 的設計理念。並且不須要那麼多括號。vim

Io 語言是一種徹底的原型語言,另外還有 Javascript, Lua 都是基於原型的語言。windows

若是你想了解解釋器的原理,或者想本身製做一個解釋器的話,學習 Io 將 讓你事半功倍。由於 Io 語言內置的可定製的詞法分析器和動態擴展語法, 讓你有可能用極少的代碼,構建一門語言的解釋器,並得到可觀的性能。由於 在併發領域,Io 的算法模型甚至比 C 更快。數據結構

Io 精緻小巧的設計和無以倫比的領域特定語言(DSL)能力,將幫助你在許多領域成爲 語言解析方面的專家。併發

Hello world

和許多編程入門書同樣,從打印一個簡單的 "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 的基本語法

註釋

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 的表達式組成

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 隱含的從調用的對象中繼承對象本身。

數據結構

列表 List

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

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

第一部分完

相關文章
相關標籤/搜索