Golang编程语言知识介绍


  • 首页

  • todo

  • 思考

  • life

  • food

  • OS

  • lua

  • redis

  • Golang

  • C

  • TCP/IP

  • ebpf

  • p4

  • OpenVPN

  • IPSec

  • L2TP

  • DNS

  • distributed

  • web

  • OpenWRT

  • 运维

  • Git

  • 鸟哥的私房菜

  • IT杂谈

  • 投资

  • About Me

  • 友情链接

  • FTP

  • 搜索
close

探索Lua52内部实现-Function

时间: 2021-04-06   |   分类: lua     |   阅读: 952 字 ~2分钟

原文链接

基本概念 Lua函数引入了很多functional programming的概念,这些概念使得Lua函数在使用上可谓“功能强大,简洁统一”,非常符合程序员的“审美观”。 函数在Lua中属于“带有词法范围的一类值”(first-class values with proper lexical scoping)。

所谓“一类值”(first-class values),应该符合以下条件:

  • 可以被保存到变量和数据结构中
  • 可以被当作子程序的参数和返回值
  • 可以在运行期被创建
  • 具有内在一致性,也就是不依赖于任何给定的名称 大多数语言的基本数据类型,比如int,就属于“一类值”。很多语言中的函数实现,只能满足其中一些条件。比如在C中可以将函数指针保存到变量中,可以将函数指针当作参数和返回值。这样的函数实现一般不会被算作“一类值"。 在Lua中,所有的值都是“一类”值,包括函数本身。函数可以被保存到任何的变量或者table中,可以被当作参数和返回值使用,所有的函数(更准确的说应该是closure)都是运行期被创建的,函数本身并没有名字,名字只是对函数的引用而已。

First-class function为lua带来了很多FP的概念,比如“高阶函数”(Higher-order functions),“匿名函数”(Anonymous functions")。这些功能在很多语言中都是通过特殊的语法来支持的,而在lua中则不需要。

所谓“词法范围”(lexical scoping),

Functions in Lua are first-class values with proper lexical scoping.

first class value

http://en.wikipedia.org/wiki/First-class_citizen

can be stored in variables and data structures can be passed as a parameter to a subroutine can be returned as the result of a subroutine can be constructed at run-time has intrinsic identity (independent of any given name)

lexical scoping

static scoping

在Lua中,lua closure和c closure都使用一个Closure结构体来表示一个closure对象:

typedef struct CClosure {
  ClosureHeader;
  lua_CFunction f;
  TValue upvalue[1];  /* list of upvalues */
} CClosure;
 
 
typedef struct LClosure {
  ClosureHeader;
  struct Proto *p;
  UpVal *upvals[1];  /* list of upvalues */
} LClosure;
 
 
typedef union Closure {
  CClosure c;
  LClosure l;
} Closure;

closure代表一个函数的可调用实例。无论时lua closure还是c closure,都包含两部分信息:函数体和upvalue。

Lua closure中的p是对

函数数据类型在lua中使用LUA_TFUNCTION来标识。在内部,LUA_TFUNCTION又被分成三种子类型:LUA_TLCL,LUA_TLCF和LUA_TCCL。

LUA_TLCF代表一个轻量级的C function。所谓的轻量级

#lua#
探索Lua5.2内部实现:Garbage Collection(1) 原理
探索Lua52内部实现:TString
shankusu2017@gmail.com

shankusu2017@gmail.com

日志
分类
标签
GitHub
© 2009 - 2025
粤ICP备2021068940号-1 粤公网安备44011302003059
0%