函数调用

词法分析器

女生的网名这么多〃 提交于 2020-02-13 05:30:07
1. 词法分析器 函数 skip_one_line: 跳过一行, 会在skip_comment中注释为//的时候调用 skip_comment: // 和 /**/ skip_blanks: 跳过空白行, 会在skip_comment处理完注释之后调用, 同时在get_next_token这个核心的词法分析器的接口函数中调用防止获取到的token含有空白字符 to_next_char: 将parser中的next_char_ptr指向的字符赋给cur_char, 并++next_char_ptr to_next_char_if: 和to_next_char类似, 返回类型为bool类型, 当nextchar是我们期望的值的时候调用to_next_char并返回true, 否则直接返回false peek_next_char: *parser->next_char_ptr peek_cur_char: parser->cur_char get_next_token: 给语法分析器调用的函数, 在get_next_token函数中主要由一个伪while循环(之所以是伪while循环, 是因为在while的结尾有return语句), 里面还有continue语句, 主要在遇到了注释, 调用了skip_comment之后continue继续获取Token, 因为注释并不是我们的token,

Function 构造器及其对象、方法

自闭症网瘾萝莉.ら 提交于 2020-02-13 05:08:28
一、基础 Function 是一个构造器,能创建Function对象,即JavaScript中每个函数实际上都是Function 对象。 构造方法: new Function ([arg1[, arg2[, ...argN]],] functionBody) 说明:arg1、arg2等为构造器的参数,functionBody为方法体。注意:参数必须用引号包围! 实例: var plus=new Function("a","b","return a+b"); var result=plus(1,2);//调用,返回3 上述方法创建function等同于普通函数声明方法: function plus(a,b){ return a+b;}; 重点: 1、使用Function构造器生成的对象是在函数创建时解析的(即真正调用时才生成对象的模型),所以比普通函数声明方法低效,因为普通方法是和其它代码一起解析的; 2、此方法不支持闭包,即不能访问创建他的所在function对象的私有变量,而只能访问自身参数列表中的变量和全局变量,因此一般只作为全局函数时使用。如: <script> var test=1;//用于测试的全局变量 var plus=new Function("a","b","return a+b+test"); alert(plus(1,2));//将提示结果为4

Generator

血红的双手。 提交于 2020-02-13 05:00:14
基本概念 Generator函数是ES6提供的一种异步编程解决办法,语法行为与传统函数完全不同。 Generator函数有多种理解角度。语法上,首先可以把它理解成,Generator函数是一个状态机,封装了多个内部状态。 执行Generator函数会返回一个遍历器对象,也就是说,Generator函数除了状态机,还有一个遍历器对象生成函数。返回的遍历器对象,可以依次遍历Generator函数内部的每一个状态。 形式上,Generator函数是一个普通函数,但是有两个特征 function关键字与函数名之间有一个星号。 函数体内部使用yield表达式,定义不同的内部状态。 function* helloWorldGenerator() { yield 'hello'; yield 'world'; return 'ending'; } var hw = helloWorldGenerator(); 上面代码定义了一个Generator函数helloWorldGenerator,它内部有两个yield表达式(hello和world),即该函数有三个状态:hello,world和return语句(语句执行)。 然后,Generator函数的调用方法与普通函数一样,也是在函数名后面加上一堆圆括号。不同的是,提哦啊用Generator函数后,函数并不执行,返回的也不是函数运行结果

ES6最具魔力的特性——生成器

有些话、适合烂在心里 提交于 2020-02-13 04:36:22
ES6生成器(Generators)简介 我们从一个示例开始: function* quips(name) { yield "你好 " + name + "!"; yield "希望你能喜欢这篇介绍ES6的译文"; if (name.startsWith("X")) { yield "你的名字 " + name + " 首字母是X,这很酷!"; } yield "我们下次再见!"; } 这段代码看起来很像一个函数,我们称之为生成器函数,它与普通函数有很多共同点,但是二者有如下区别: 普通函数使用function声明,而生成器函数使用function*声明。 在生成器函数内部,有一种类似return的语法:关键字yield。二者的区别是,普通函数只可以return一次,而生成器函数可以yield多次(当然也可以只yield一次)。在生成器的执行过程中,遇到yield表达式立即暂停,后续可恢复执行状态。 这就是普通函数和生成器函数之间最大的区别,普通函数不能自暂停,生成器函数可以。 生成器做了什么? 当你调用quips()生成器函数时发生了什么? > var iter = quips("jorendorff"); [object Generator] > iter.next() { value: "你好 jorendorff!", done: false } > iter.next()

javascript基础集锦_箭头函数、generator(六)

自古美人都是妖i 提交于 2020-02-13 04:24:23
本系列主要记录javascript中,新手比较容易搞错的地方。 (1)箭头函数    ES6标准新增了一种新的函数:Arrow Function(箭头函数)。   为什么叫Arrow Function?因为它的定义用的就是一个箭头:   x => x * x   上面的箭头函数相当于:   function (x) {    return x * x;   }箭头函数相当于匿名函数,并且简化了函数定义。箭头函数有两种格式,一种像上面的,只包含一个表达式,连{ ... }和return都省略掉了。还有一种可以包含多条语句,这时候就不能省略{ ... }和return: 注意,需要你的浏览器支持ES6的Arrow Function:   箭头函数看上去是匿名函数的一种简写,但实际上,箭头函数和匿名函数有个明显的区别:箭头函数内部的this是词法作用域,由上下文确定。   回顾前面的例子,由于JavaScript函数对this绑定的错误处理,下面的例子无法得到预期结果:   var obj = {   birth: 1990,   getAge: function () {   var b = this.birth; // 1990   var fn = function () {   return new Date().getFullYear() - this.birth; //

Socket与系统调用深度分析

試著忘記壹切 提交于 2020-02-13 03:02:32
一、什么是系统调用   linux内核中设置了一组用于实现系统功能的子程序,称为系统调用。系统调用和普通库函数调用非常相似,只是系统调用由操作系统核心提供,运行于核心态,而普通的函数调用由函数库或用户自己提供,运行于用户态。   系统调用的意义如下:   1.把用户从底层的硬件编程中解放出来   2.极大的提高了系统的安全性   3.使用户程序具有可移植性   一般进程是不能访问内核的,而系统调用是用户态进入内核态的唯一入口 二、系统调用与API之间的关系   1.API和系统调用的区别:     API只是一个函数定义     系统调用通过软中断向内核发出一个明确的请求   2.Libc库定义的一些API引起了封装例程(wrapper routine,唯一的目的就是发布系统调用)     一般每个系统调用对应一个封装例程     库再用这些封装例程定义出给用户的API   3.不是每个API都对应一个特定的系统调用     首先,API可能直接提供用户态的服务(比如一些数学函数)     其次,一个单独的API可能调用几个系统调用不同的     API可能调用了同一个系统调用   4.返回值     大部分封装例程返回一个整数,其值得含义依赖于相应的系统调用     -1在多数情况下表示内核不能满足进程的请求     Libc中定义的errno变量包含特定的出错码 三

理解 Java 方法引用(方法引用符:“双冒号 :: ”)

六眼飞鱼酱① 提交于 2020-02-13 01:47:23
方法引用 在使用Lambda表达式的时候,我们实际上传递进去的代码就是一种解决方案:拿什么参数做什么操作。那么考虑一种情况:如果我们在Lambda中所指定的操作方案,已经有地方存在相同方案,那是否还有必要再写重复逻辑? 冗余的Lambda场景 来看一个简单的函数式接口以应用Lambda表达式: @FunctionalInterface public interface Printable { /** * 接收一个字符串参数,打印显示它 * @param str 字符串 */ public abstract void print(String str); } 在 Printable 接口当中唯一的抽象方法 print 接收一个字符串参数,目的就是为了打印显示它。那么通过Lambda 来使用它的代码很简单: public class Demo01PrintSimple { public static void main(String[] args) { printString(s -> System.out.println(s)); } private static void printString(Printable data) { data.print("Hello, World!"); } } 其中 printString 方法只管调用 Printable 接口的 print

Python 2.7 Tutorial —— 流程控制

爱⌒轻易说出口 提交于 2020-02-13 01:30:03
.. _tut-morecontrol: ****************************************** More Control Flow Tools 深入流程控制 ****************************************** Besides the :keyword:`while` statement just introduced, Python knows the usual control flow statements known from other languages, with some twists. 除了前面介绍的 :keyword:`while` 语句,Python 还从其它语言借鉴了一些流 程控制功能,并有所改变。 .. _tut-if: :keyword:`if` Statements :keyword:`if` 語句 ========================================================= Perhaps the most well-known statement type is the :keyword:`if` statement. For example:: 也许最有名的是 if 语句。例如: >>> x = int(raw_input("Please

构造/析构/赋值运算

左心房为你撑大大i 提交于 2020-02-12 17:33:29
条款05:了解C++默默编写并调用哪些函数   如果你没有声明任何构造函数,编译器也会成为你声明一个默认构造函数,默认构造函数和析构函数主要给编译器一个地方用来放置“藏身幕后”的代码,像是调用base classes和non-static成员变量的构造函数和析构函数。所有这些函数都是public且inline,编译器产生出来的析构函数是non-virtual,除非这个class的base class自身声明有virtual析构函数。   惟有当这些函数被需要(被调用),它们才会被编译器创建出来。即有需求,编译器才会创建它们。   至于拷贝构造函数和拷贝赋值操作符,编译器创建的版本只是单纯地将来源对象的每一个非静态成员变量拷贝到目标对象。   如一个类声明了一个构造函数(无论有没参数),编译器就不再为它创建默认构造函数。   编译器生成的拷贝赋值操作符:对于成员变量中有指针,引用,常量类型,我们都应考虑建立自己“合适”的拷贝赋值操作符。因为指向同块内存的指针是个潜在危险,引用不可改变,常量不可改变。 请记住:   编译器可以暗自为类创建默认构造函数、拷贝构造函数、拷贝赋值操作符,以及析构函数。 条款06:若不想使用编译器自动生成的函数,就该明确拒绝   通常如果你不希望类支持某一特定技能,只要不说明对应函数就是了。但这个策略对拷贝构造函数和拷贝赋值操作符却不起作用。因为编译器会

【C语言】函数指针扫盲

限于喜欢 提交于 2020-02-12 11:44:33
首先看看函数指针,函数名,以及它们分别与*和&结合后的值 程序清单 #include<stdio.h> void func(void){puts("成功调用");}; int main() { void(*p_func)(void)=func; puts("func是函数名,p_func是指向该函数的指针,那么有:"); printf("func=%p\n*func=%p\n&func=%p\ \np_func=%p\n*p_func=%p\ \n&p_func=%p",func,*func,&func,p_func,\ *p_func,&p_func); //puts("\n接着我们尝试用上述变量调用函数:"); //func(); //(*func)(); //(&func)(); //(p_func)(); //(*p_func)(); return 0; } 执行结果 func是函数名,p_func是指向该函数的指针,那么有: func=004015C0 *func=004015C0 &func=004015C0 p_func=004015C0 *p_func=004015C0 &p_func=0061FECC 可见==func==,== func==,==&func==,==p_func==,== p_func==代表的值都是func()函数的地址 ( &p