欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

rparsec在《Pracical Ruby Projects》中

程序员文章站 2022-07-14 14:43:24
...
最近发现《Practical Ruby Projects》用rparsec来讲解怎么在Ruby里构建lisp。于是假公济私地用公司的账户订购了一本,也算给自己捧场。

书拿到,打开一看,好么,被批评了rparsec在《Pracical Ruby Projects》中
            
    
    博客分类: 默认类别 RubyRailsLISP

引用
Caution: For such an excellent library, rparsec plays very fast and loose with namespaces. Its parser classes are installed directly into root namespace. As a library author, try not to do this.


赶紧自己把代码下载下来一看,可不是么,所有的类都在顶层namespace。汗啊!

还是太习惯于java的方式了,潜意识中总是觉得在什么地方放一个"package org.codehaus.rparsec"就好了。结果ruby没这东西。

作为我的第一个(也是迄今为止唯一一个)ruby项目,很多惯用法都不知道。记得当时写完代码,到处问别人:我这些源文件应该怎么组织啊?好像不是跟java似的,有"package"的概念?有classpath?用org/codehaus/rparsec这种方式?旁边的人都是rails的用户,基本上人家告诉说有个rails的咒语怎么念就跟着怎么念的那种,自己都没写过库,所以也都含糊,反正后来凑合着给整上了,到现在也不知道整得对不对。

这个namespace好像一度曾经想过,但是当时觉得“以后问别人怎么弄吧,先写代码去也”,后来也就忘记了。

不过到底应该怎么搞namespace呢?这样?

module org
  module codehaus
    module rparsec
      class Parser
        ...
      end
    end
  end
end


牙磕!

这样?
module RParsec
  class Parser
    ...
  end
end


好点,但是还是不喜欢每个源文件上来就全缩进两格。就没有java的"package RParsec"这类咚咚?Ruby语法这么灵活,应该会有吧?

哎,下一版本如果要改namespace,就要破坏向后兼容性了。好在还没有太多用户呢。

对了,如果你读过这本书,作者对rparsec的使用有一点点偏差,他用"alt(parser1, parser2)" 这个组合子,但是实际上这个alt是一个高级选项,应该用"parser1 | parser2"这个更直观,更不容易出错的组合子,这样书里面提到的一个陷阱就不存在了。
相关标签: Ruby Rails LISP