2018年1月8日 星期一

[轉載]使用Lua Function表示Lambda calculus

http://blog.csdn.net/yuanlin2008/article/details/8627081
很多程序語言所帶給你的“完美”的感覺都來自於數學抽象之美。
在Lua中,function被描述成“具有真正的詞法範圍的一類值”(first-class values​​ with proper lexical scoping)。
所謂的“一類值”,應該滿足以下條件:
  • 可以被保存到變量和數據結構中
  • 可以被當作子程序的參數和返回值
  • 可以在運行期創建
  • 具有內在標識,不依賴於任何給定的名稱
大多數語言的基本數據類型,比如int,就屬於“一類值”。很多語言中的函數實​​現,只能滿足其中一些條件。比如在C中可以將函數指針保存到變量中,可以將函數指針當作參數和返回值。這樣的函數實現一般不會被算作“一類值"。
在Lua中,所有的值都是“一類”值,包括function本身。函數可以被保存到任何的變量或者table中,可以被當作參數和返回值使用,所有的函數(更準確的說應該是closure)都是運行期被創建的,函數本身並沒有名字,名字只是對函數的引用而已。作為“一類值”的function更為抽象,可以用來表示很多的"Functional Programming"的概念。比如“高階函數”(Higher-order functions),“匿名函數”(Anonymous functions")。這些功能在很多語言中都是通過特殊的語法來支持的,而在lua中則不需要。