int foo(int f) { return f * 3; } int i = 5; immutable x = 3 * 4; // 正确,12 immutable y = i + 1; // 错误,无法在编译时求值 immutable z = foo(2) + 1; // 正确,foo(2)能在编译时求得值——7
非静态的局部immutable数据的初始化表达式是在运行时计算的:
int foo(int f) { immutable x = f + 1; // 运行时求值 x = 3; // 错误,x不可改变 }
由于immutable数据具有可传递性,由immutable数据引用的数据也是不变的:
immutablechar[] s = "foo"; s[0] = 'a'; // 错误,s指向一块不可改变的数据 s = "bar"; // 错误,s不可改变
def foo(): Int @cps[Int,Int] = { // could leave out return type shift { k: (Int=>Int) => k(7) } + 1 } reset(2 * foo()) // result: 16
以下是另一示例,示范了如何在基于回调的API使用Continuation.
import java.util.{Timer,TimerTask}
val timer = new Timer()
def sleep(delay: Int) = shift { k: (Unit => Unit) => timer.schedule(new TimerTask { def run() = k() // in a real program, we'd execute k on a thread pool }, delay) }
println("look, Ma ...") sleep(1000) println(" no threads!")
for key, value in pairs(t) do print(key, value) end
有没有办法像unpack一样,对枚举器进行unpack,返回多个返回值呢?
这也可以用递归实现:
local function _iterator_unpack_i(i, f, s, var1, ...) if var1 == nil then return else return select(i, var1, ...), _iterator_unpack_i(i, f, s,f(s, var1)) end end local function iterator_unpack_i(i, f, s, var) return _iterator_unpack_i(i, f, s, f(s, var)) end
local function _iterator_unpack_f(formatstring, f, s, var1, ...) if var1 == nil then return else return format(formatstring, var1, ...), _iterator_unpack_f(formatstring, f, s,f(s, var1)) end end local function iterator_unpack_f(formatstring, f, s, var) return _iterator_unpack_f(formatstring, f, s, f(s, var)) end
local function keys(t) return iterator_unpack_i(1, pairs(t)) end
local function values(t) return iterator_unpack_i(2, pairs(t)) end