Differences between revisions 1 and 2
Revision 1 as of 2004-08-28 22:19:58
Size: 5260
Editor: limodou
Comment:
Revision 2 as of 2004-08-29 03:20:33
Size: 6379
Editor: 218
Comment: discuss
Deletions are marked like this. Additions are marked like this.
Line 152: Line 152:

====已经非常不错了 by tomz====

我说的支持python的意思就是能够自动遇到冒号时在下一行开始缩进。自动和上面的缩进对齐。因为一般的语言对缩进没有要求,所以没有缩进的处理要求。如果用其它语言编程就会非常方便。自己处理缩进也凑合能用。我试了试,感觉很不错。就不用noweb软件了。

这种格式不是遇到空行分割,而是遇到下一个变量<<某某>>分割。

这种noweb格式,dohao.org上推荐的leo编辑器支持。能够自动形成outline视图。

不知道limodou是不是能够体会到这种编程方式的好处。这是一种自顶到下的编程方式。从构思程序开始就能写程序。写出来的程序更容易懂。在这里还能加入面向方面编程的功能,就棒透了。不需要具体的实现就能够表达编程的思想。只是没有适应UML方式。不适应面向对象编程。但已经不错了。

非常感谢limodou的工作。这样,limodou也能有一个把meteor加入newedit的理由了。就是用newedit实现文学编程功能。

含有章节索引的中文 文章模板

-- limodou [DateTime(2004-08-28T22:19:58Z)] TableOfContents

Tomz 所提的noweb模板测试

由Tomz所提的文学模板,虽然不太明白,不过还是进行了简单地测试,仍然发现了meteor存在的不足,以后会改进

Noweb模板原型

由Tomz所提,没有听说过的一个东西,原型:

<<*>>=
<<def>>
<<print>>
<<defend>>
<<run>>

<<def>>=
def myprint():

<<print>>
print "test"

<<run>>=
myprint()

输出结果是:

def mypirnt():
print "test"
myprint()

可以看出文学编程不支持python的缩进。 这个是不是比meteor的调用方式更好呢? 另外,文学编程能集成面向方面编程就更好了。

by Tomz

Noweb模板原型分析

从上面的noweb模板原型我们可以看出,一个模板元素的定义为:

<<name>>=换行符
多行内容
空行

因为没有更多关于noweb模板的资料因此从原型可以这样规定。其中多行的内容可以包括其它的模板元素。

再从模板引用的示例与输出结果的对比我们可以看出,在<<*>>根元素中,对每个模板元素的引用后面都有一个回车,同时每个模板元素的定义中都是以空行结尾的,这样引出模板元素如果原样处理的话,必然带一个回车符。这样加上根元素中的模板引用中的回车,会生成两个回车。这一点在我没注意前的运行结果的确就是这样。于是我做了一个特殊处理,将每个元素最后的回车符去掉,输出结果与原型的结果就相同的。当然,实际上这种引用方式过于简单。因为一个模板元素完全可以是嵌入到一段文字中的,并不一定是独立为一行。不过,在这个简单的例子中我只关心能否生成相同的结果,而并不关心实际的情况。不过原型中可能存在错误,如果细心点可以看出,<<*>>中引用的模板有一个<<defend>>,但这个模板元素其实没有定义。而且输出结果中也少了一项。不知道是写错了,还是故意的。在测试中我将其去掉了。

因为noweb的模板替换(这个例子非常简单)没有超出Meteor的处理范围,只是模板定义形式不是python的定义格式,因此需要从预处理类中派生可以生成处理noweb的预处理类,然后在模板替换时指定这个新的处理器就可以了。

Meteor的定制模板程序

   1 from Template import *
   2 import re
   3 
   4 class NowebPreprocess(PreprocessBase):
   5     def __init__(self):
   6         PreprocessBase.__init__(self, 'noweb', '<<', '>>')
   7         
   8     def process(self, filename):
   9         f = file(filename)
  10         re_p = re.compile('^<<(.*)>>=$', re.M)
  11         vars = {}
  12         nodes = {}
  13         line = f.readline()
  14         while line:
  15             b = re_p.search(line)
  16             if b:
  17                 name = b.groups()[0]
  18                 line = f.readline()
  19                 s = []
  20                 while line.strip():
  21                     s.append(line)
  22                     line = f.readline()
  23                 s[-1] = s[-1].rstrip()
  24                 vars[name] = T(''.join(s))
  25                 nodes[name] = self._get_rely_on_node(vars[name].getText())
  26             line = f.readline()
  27         return vars, nodes
  28 
  29     def _get_rely_on_node(self, s): #search for %(name)s format, make a dict
  30         re_node = re.compile(self.getPattern())
  31 
  32         return list(sets.Set(re_node.findall(s)))
  33 
  34 register(NowebPreprocess())
  35 
  36 if __name__ == '__main__':
  37     template = Template()
  38     template.load('noweb.txt', 'noweb')
  39     print template.value('*', {'*':{}})

可以看出,实际对noweb的处理只是对PreprocessBase进行派生,生成了新的NowebPreprocess的处理器类,通过register将其注册到Template中。测试就很简单了:

  • 生成模板实例
  • 装入模板数据,指定'noweb'预处理器
  • 进行模板替换,提供对根元素的一个空字典

模板测试样例

这是一个测试样例:

<<*>>=
<<def>>
<<print>>
<<run>>

<<def>>=
def myprint():

<<print>>=
    print "test"

<<run>>=
    myprint()

这与原型有区别的就是:

  • 将<<defend>去掉

  • <<print>><<run>>模板中加入了缩近空格

输出结果为:

def myprint():
    print "test"
    myprint()

结果与预期的差不多。由于加入了缩近,因此就是符合Python要求的代码了。因此象Tomz所提不支持缩近应该完全是模板处理系统的原因。meteor不会随意对空格进行处理的。

讨论

Meteor是一个Python模板处理系统,但它提供了相应的接口可以通过派生,重载等方法来实现一个新的模板处理。当然能过这次测试我发现Meteor还有可以改进的地方:

  • load()方法应该可以支持文件名,文件对象,字符串等多种方式。而现在只能处理文件名。
  • value()方法中提供的字典数据,在没有数据时应可以省略或只是简单地提供一个{}就可以。而现在是至少有一个根元素的字典。

====已经非常不错了 by tomz====

我说的支持python的意思就是能够自动遇到冒号时在下一行开始缩进。自动和上面的缩进对齐。因为一般的语言对缩进没有要求,所以没有缩进的处理要求。如果用其它语言编程就会非常方便。自己处理缩进也凑合能用。我试了试,感觉很不错。就不用noweb软件了。

这种格式不是遇到空行分割,而是遇到下一个变量<<某某: invalid macro name>>分割。

这种noweb格式,dohao.org上推荐的leo编辑器支持。能够自动形成outline视图。

不知道limodou是不是能够体会到这种编程方式的好处。这是一种自顶到下的编程方式。从构思程序开始就能写程序。写出来的程序更容易懂。在这里还能加入面向方面编程的功能,就棒透了。不需要具体的实现就能够表达编程的思想。只是没有适应UML方式。不适应面向对象编程。但已经不错了。

非常感谢limodou的工作。这样,limodou也能有一个把meteor加入newedit的理由了。就是用newedit实现文学编程功能。

Tomz_所提的noweb模板处理 (last edited 2009-12-25 07:17:17 by localhost)