代码块与变量

    上一篇讲到了强大的表达式,这一篇讲一下一个对于语言而言同样重要的代码块。

    先看一个c#的代码块:

image

    注意看这个例子,里面其实有两个嵌套的代码块,一个是SomeMethod的方法体,在里面的那个代码块中,先定义了一个temp的变量,然后利用这个temp变量,去交换了s1和s2(定义在SomeMethod这个代码块中的变量)的内容。

    这里可以看到代码块需要这样几个要素:

  • 变量定义
  • 变量访问
  • 变量的作用域
  • 各种表达式组成的语句
  • 以及可能需要的return语句

    看玩这些要素,再看看xsd,发现这些要素基本上都是缺乏的,其中最缺乏的概念就是变量

    之前的xsd描述了一个由表达式组成的xml,但是并没有变量的概念,并且没有变量所需要的作用域——容器

    显然,一个容器需要包含变量声明和变量初始化器,先看一下声明部分的xsd:

image

    变量有了声明似乎已经完成了,那么关于变量的访问哪?访问变量分为两种:读和写

 

    读取变量就比较简单,直接定义一个表达式就可以了:

image

    写变量,实际上就是个语句,当忽略控制语句时,语句可以被退化成一个动词(例如:设置变量)和一个表达式:

image

   这里声明了3个verb:Let、Call和Return,Let用于设置变量,Call则仅仅调用后面的表达式,并忽略表达式的返回值,Return则将表达式的结果作为代码块的返回值,并终止代码块的执行。

    现在可以定义代码块了:

image

    但是代码块可以用在哪里哪?来看一段c#:

image

    这里的Func<string>包含了一个代码块,但是它本身仅仅被所在的代码块当成一个表达式(Lambda Expression),那么Block自然可以被放在一个表达式里面:

image

    现在,再来看看xml中Block以什么方式展现:

image

    写到这里,代码块就基本上完成了,但是,现在还不能定义一个Slide级别或全局的变量,这里需要另外写一个Container类,增加一个初始化器:

image

    然后进一步修改一下Slide和Configuation的定义:

image

    现在,就可以定义Slide或Configuation级的变量了:

image

    既然能有全局的变量,那么仅仅在Lambda里面运用Block显然是不够的,因此,再加一个包含Block的Modification:

image

    这样,代码块和变量就差不多了。

    看到这里,一定有一个很大的疑问,这么复杂的xml如何实现哪?

    可以说这个xml已经是一个专门为修改pptx定制的比较简单的语言了。因此,实现不仅仅需要那些修改pptx的部分,更需要那些解释和执行Expression和Block的部分。下一篇就开始讲如何去实现这个xml的执行引擎。


上一篇:从写组件说Xml——Xsd篇(二)

下一篇:从写组件说Xml——接口和初步实现(四)

posted on 2009-10-01 12:01  Zhenway  阅读(900)  评论(0编辑  收藏  举报