代码块与变量
上一篇讲到了强大的表达式,这一篇讲一下一个对于语言而言同样重要的代码块。
先看一个c#的代码块:
注意看这个例子,里面其实有两个嵌套的代码块,一个是SomeMethod的方法体,在里面的那个代码块中,先定义了一个temp的变量,然后利用这个temp变量,去交换了s1和s2(定义在SomeMethod这个代码块中的变量)的内容。
这里可以看到代码块需要这样几个要素:
- 变量定义
- 变量访问
- 变量的作用域
- 各种表达式组成的语句
- 以及可能需要的return语句
看玩这些要素,再看看xsd,发现这些要素基本上都是缺乏的,其中最缺乏的概念就是变量
之前的xsd描述了一个由表达式组成的xml,但是并没有变量的概念,并且没有变量所需要的作用域——容器
显然,一个容器需要包含变量声明和变量初始化器,先看一下声明部分的xsd:
变量有了声明似乎已经完成了,那么关于变量的访问哪?访问变量分为两种:读和写
读取变量就比较简单,直接定义一个表达式就可以了:
写变量,实际上就是个语句,当忽略控制语句时,语句可以被退化成一个动词(例如:设置变量)和一个表达式:
这里声明了3个verb:Let、Call和Return,Let用于设置变量,Call则仅仅调用后面的表达式,并忽略表达式的返回值,Return则将表达式的结果作为代码块的返回值,并终止代码块的执行。
现在可以定义代码块了:
但是代码块可以用在哪里哪?来看一段c#:
这里的Func<string>包含了一个代码块,但是它本身仅仅被所在的代码块当成一个表达式(Lambda Expression),那么Block自然可以被放在一个表达式里面:
现在,再来看看xml中Block以什么方式展现:
写到这里,代码块就基本上完成了,但是,现在还不能定义一个Slide级别或全局的变量,这里需要另外写一个Container类,增加一个初始化器:
然后进一步修改一下Slide和Configuation的定义:
现在,就可以定义Slide或Configuation级的变量了:
既然能有全局的变量,那么仅仅在Lambda里面运用Block显然是不够的,因此,再加一个包含Block的Modification:
这样,代码块和变量就差不多了。
看到这里,一定有一个很大的疑问,这么复杂的xml如何实现哪?
可以说这个xml已经是一个专门为修改pptx定制的比较简单的语言了。因此,实现不仅仅需要那些修改pptx的部分,更需要那些解释和执行Expression和Block的部分。下一篇就开始讲如何去实现这个xml的执行引擎。