zoukankan      html  css  js  c++  java
  • 从写组件说Xml——Xsd篇(三)

    代码块与变量

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

        先看一个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——接口和初步实现(四)

  • 相关阅读:
    如何获取Apollo上项目下的所有namespace?
    从源码研究如何不重启Springboot项目实现redis配置动态切换
    用 Explain 命令分析 MySQL 的 SQL 执行
    MySQL死锁系列-常见加锁场景分析
    带你100% 地了解 Redis 6.0 的客户端缓存
    Java 数据持久化系列之 HikariCP (一)
    MySQL的死锁系列- 锁的类型以及加锁原理
    Java 数据持久化系列之池化技术
    Redis Cluster 的数据分片机制
    Redis 命令执行过程(下)
  • 原文地址:https://www.cnblogs.com/vwxyzh/p/1577194.html
Copyright © 2011-2022 走看看