`
RednaxelaFX
  • 浏览: 3056135 次
  • 性别: Icon_minigender_1
  • 来自: 海外
社区版块
存档分类
最新评论

[草泥马语] ws2gmh之正则版

    博客分类:
  • misc
阅读更多
友情支持草泥马语官方网站:>>= 猛击这里 =<<

草泥马语是一种脱胎自Whitespace全新语言。它是如此的新,我们可以放心的把Whitespace程序升级为草泥马版。官网提供的发行版里就有ws2gmh工具帮我们完成升级。

WS2GMH.java中,升级的核心逻辑如下:
int ch;
while ((ch = reader.read()) != -1) {
    switch (ch) {
    case ' ':
        // writer.append("[Space]");
        ch = '草';
        break;
    case '\t':
        // writer.append("[Tab]");
        ch = '泥';
        break;
    case '\n':
        // writer.append("[LF]\n");
        writer.append('马');
        break;
    }
    writer.append((char) ch);
}

(注意该程序保留了\n;另外Java I/O的默认处理是读文件的时候把\r\n变成\n)
这是一个while-switch结构。不考虑运行效率,有没有办法写得更精悍一点呢?

先来看JavaScript版本甲:
function ws2gmh(wsSrc) {
  return wsSrc.replace(/( )|(\t)|(\n)/mg, function (_, p1, p2, p3) {
    return p1 && '草' || p2 && '泥' || p3 && '马\n'
  })
}

可以在浏览器里测试:
<html>
  <meta http-equiv="Content-Type" content="text/html;charset=GBK" />
  <head>
    <script type="text/javascript">
    function ws2gmh(wsSrc) {
      return wsSrc.replace(/( )|(\t)|(\n)/mg, function (_, p1, p2, p3) {
        return p1 && '草' || p2 && '泥' || p3 && '马\n'
      })
    }
    
    function sync() {
      var ws_textarea = document.getElementById('ws_textarea')
      var gmh_textarea = document.getElementById('gmh_textarea')
      
      // strip the CRs, mimic Java's file I/O behavior
      var ws_src = ws_textarea.value.replace(/\r/mg, '')
      gmh_textarea.value = ws2gmh(ws_src)
    }
    </script>
  </head>
  <body>
    <div>
      <p>Whitespace:<br />
        <textarea id="ws_textarea" cols="80" rows="10" width="100%" onkeyup="sync()"></textarea>
      </p>
    </div>
    <div>
      <p>草泥马语:<br />
        <textarea id="gmh_textarea" cols="80" rows="10" width="100%" readonly="true" disabled="true"></textarea>
      </p>
    </div>
  </body>
</html>

如果从外部文本编辑器复制过来的话要注意了,有些编辑器会自动转换掉了单个的\n或\r,或\r\n,总之复制进来前注意一下……

然后,JavaScript版本乙:
var mapping = {
  ' ' : '草',
  '\t': '泥',
  '\n': '马\n'
}

function ws2gmh(wsSrc) {
  return wsSrc.replace(/[ \t\n]/mg, function (s) {
    return mapping[s]
  })
}

当然mapping直接写在ws2gmh()里也行,只不过要重复求值有点不太爽。要实验的话照样放到前面的HTML里换掉版本甲即可。

用JavaScript能行,用Ruby当然也能。版本甲:
def ws2gmh(ws_src)
  ws_src.gsub(/( )|(\t)|(\n)/m) { $1 && '草' || $2 && '泥' || $3 && "马\n" }
end

版本乙:
def ws2gmh(ws_src)
  mapping = { ' ' => '草', "\t" => '泥', "\n" => "马\n" }
  ws_src.gsub(/[ \t\n]/m) {|s| mapping[s] }
end

版本乙变种:
def ws2gmh(ws_src)
  mapping = { ' ' => '草', "\t" => '泥', "\n" => "马\n" }
  ws_src.gsub(/[#{Regexp.escape mapping.keys.join}]/m) {|s| mapping[s] }
end

这个变种对mapping的变化敏感度更低些,但运行时开销更大些

于是官方版WS2GMH的完整逻辑就可以用以下脚本实现:
#!/usr/bin/env ruby
# -*- coding: gbk -*-

def ws2gmh(ws_src)
  mapping = { ' ' => '草', "\t" => '泥', "\n" => "马\n" }
  ws_src.gsub(/[ \t\n]/m) {|s| mapping[s] }
end

if __FILE__ == $0
  begin
    ws_file, gmh_file = ARGV
    raise unless ws_file && File.extname(ws_file) =~ /\.ws/i
    gmh_file ||= ws_file[0..-3] + 'gmh' 
    open(gmh_file, 'wb') {|f| f << ws2gmh(File.read(ws_file)) }
  rescue
    puts 'Usage: ws2gmh <ws_file> [gmh_file]'
  end
end


当然用Java也能实现正则版,只是写起来麻烦……懒得写了。
分享到:
评论
11 楼 iaimstar 2009-12-09  
好吧,我承认确实比较短 >_<
10 楼 RednaxelaFX 2009-12-09  
iaimstar 写道
不过我喜欢乙
至少map被独立管理起来了,不会污染回调函数

在原帖里顺手加了个Ruby版本乙的变种……连正则表达式也可以不污染 =_=|||
9 楼 RednaxelaFX 2009-12-09  
iaimstar 写道
不过我喜欢乙
至少map被独立管理起来了,不会污染回调函数

嗯咪……反正甲乙都一样是用回调函数版。我是无所谓。甲是用来演示&& ||比if...else短的情形用的而已 =_=
8 楼 RednaxelaFX 2009-12-09  
night_stalker 写道
js 从第几个版本起有 gsub? 如果跨浏览器的话我就不用在服务器上实现一遍 gsub 了……

至少IE6上就有等价于gsub的东西了……就是replace。放心用。
要知道JS里正则替换g不g是写在正则表达式的后缀/属性上的,而不是写在函数名上……
7 楼 night_stalker 2009-12-09  
js 从第几个版本起有 gsub? 如果跨浏览器的话我就不用在服务器上实现一遍 gsub 了……
6 楼 iaimstar 2009-12-09  
不过我喜欢乙
至少map被独立管理起来了,不会污染回调函数
5 楼 iaimstar 2009-12-09  


replacement can be a string or a function to be called for each match.
这个很有趣,w3school上面只提到了string,没有提到回调函数

而我在ie上测试也没有问题,这是个很好用的skill
4 楼 RednaxelaFX 2009-12-09  
iaimstar 写道
return wsSrc.replace(/( )|(\t)|(\n)/mg, function (_, p1, p2, p3)
这个用法很新宣,fx解释下为啥/() \t 和\n能作为p1,p2,p3来调用function?

这个请参考Mozilla文档:String.replace
当调用replace提供两个参数时,第二个参数应该是一个回调函数,其参数列表的格式是:
1、匹配到的整个子串
2、第一个捕获分组匹配到的子串
3、第二个捕获分组匹配到的子串
……
N、最后一个捕获分组匹配到的子串
N+1、匹配到的整个子串在源字符串中的偏移量
N+2、整个源字符串

JavaScript的函数参数列表中变量有多少个其实没多大关系,反正编译器不会把形式参数与实际参数个数不同看作错误,所以……
3 楼 iaimstar 2009-12-09  
return wsSrc.replace(/( )|(\t)|(\n)/mg, function (_, p1, p2, p3)
这个用法很新宣,fx解释下为啥/() \t 和\n能作为p1,p2,p3来调用function?
2 楼 RednaxelaFX 2009-12-09  
iaimstar 写道
何等的蛋疼

其实这帖真正的看点是JavaScript版本甲。飘过……
1 楼 iaimstar 2009-12-09  
何等的蛋疼

相关推荐

    Maya多边形头发插件 GMH2_6_For_Maya汉化版

    《Maya多边形头发插件GMH2_6_For_Maya汉化版:解锁毛发模拟的新境界》 在3D建模和动画领域,Maya作为一款强大的工具,一直备受专业人士的喜爱。然而,创建逼真的毛发效果始终是一项挑战。正是在这种背景下,GMH2_6_...

    Maya多边形头发插件GMH2.6GeoMayaHairScript汉化版

    Maya多边形头发插件是一个非常强大好用的Maya插件,可以在Maya中轻松完成多边形头发的建模的修改,让你轻松制作各种头发模型,有需要的朋友欢迎下载Maya多边形头发插件使用。 2.6版本更新: 发型转多边形或曲线,...

    GMH1.1安装方法

    GMH1.1安装方法 把scripts里面的东西放到我的文档maya的scripts文件夹里面 把icon放进对应的maya版本的pref的icon文件夹里面 把 shelves里面的放进对应的maya版本的pref的shelves文件夹里面

    GrassMudHorse:GrassMudHorse 编程语言在 Haskell 中的实现

    GrassMudHorse 编程语言一种受 Whitespace 启发的基于堆栈... GrassMudHorse 解释器:( gmh ) $ gmh [file.gmh]空白到 GrassMudHorse 转编译器:( ws2gmh ) $ ws2gmh &lt;[file.ws] &gt;[file.gmh]GrassMudHorse to W

    Geo Maya Hair 2.5 for Maya 2011-2015

    GMH2 (Geo Maya Hair 2) is a more advanced version of GMH script, specialized in hair modeling & stylizing, developed by Phung Dinh Dzung at Thunder Cloud Studio. User can easily model complex hair ...

    gmh-3DP3断组

    预测数字3游戏数字组合分段,结合其他条件可以有效减少投注资金。

    less_gmh:实现css代码批量压缩

    标题 "less_gmh" 指的是一种用于批量压缩CSS代码的工具,它基于JavaScript语言。这个工具的主要目的是优化前端性能,通过减少CSS文件的大小来加快网页加载速度。在Web开发中,CSS代码的压缩是性能优化的重要环节,它...

    C++GMP库 gmp.zip 包含gmh.h、libgmp-6.1.1.lib和libgmp-10.dll

    在给定的压缩包`gmp.zip`中,包含了三个关键文件:`gmh.h`、`libgmp-6.1.1.lib`和`libgmp-10.dll`。 `gmh.h`是GMP库的头文件,它包含了所有你需要在C++代码中使用GMP库的函数和数据结构的声明。通过包含这个头文件...

    gmh-sops:肠道微生物与健康标准操作程序

    《GMH标准操作程序:肠道微生物与健康》 在当今生命科学领域,肠道微生物与人体健康的关系日益受到重视。GMH(Gut Microbiota and Health)项目专注于探索这一领域,通过标准化的操作流程来深入研究肠道微生物群落...

    华为5G MH5000-31培训材料.rar

    2.MH5000-31一般交付清单列表 4.B5000模块PCB设计指导 5G工业模组MH5000 6.MH5000天线设计要求2019-11-29 8-1.MH5000-31 Windows USB 驱动安装指南_v1.0 8-2.华为模块Android内核驱动集成指导-(V100R001_V2.0.0, ...

    gmsh 最新版本(4.0.4) windows 64位安装包

    2. **网格生成**:Gmsh的强项在于其自动网格划分功能,可以生成高质量的四面体、五面体、六面体、三角形和四边形等元素的混合网格。网格细化策略灵活,可以根据几何复杂度和物理问题的需求自适应地调整。 3. **...

    国密基础包jar包.rar

    2. 引用API:在代码中引用国密基础包提供的类和方法,如org.bouncycastle.jce.provider.BouncyCastleProvider,进行加密、解密、签名等操作。 3. 测试验证:在集成后进行充分的单元测试和系统测试,确保所有功能正常...

    技嘉 GA-8I945GMH-RH驱动程序下载

    支持Intel Viiv 欢愉科技技术,体验全新数字家庭娱乐科技 支持Intel Pentium D/ Pentium 4处理器 支持新一代 DDR2 667MHz双信道内存架构 内建高速SATA界面传输速率可达3Gb/s 内建Intel GMA950显示芯片,体验全新视觉...

    hair模拟hair模拟hair模拟hair模拟

    hair模拟hair模拟hair模拟hair模拟hair模拟hair模拟hair模拟hair模拟hair模拟hair模拟

    3000元以内组装机配置单.pdf

    * 主板:华擎 880GMH/USB3,价格499元 * 内存:金士顿 2GB DDR3 1333,价格280元 * 硬盘:WD 500GB 7200转 16MB(串口/RE3),价格299元 * 光驱:建兴 IHDP118-26,价格110元 * 液晶显示器:明基 G900WD,价格850元 ...

    SAP Business Objects Temporary License Keys

    **2. 许可密钥支持** - 如有任何关于许可密钥的疑问或需要协助,请在组件XX-SER-LIKEY-BOJ上开启支持案例。 **3. 试用与评估** - 如果您希望对未授权的产品或许可选项进行试用或评估,请联系您的帐户经理安排...

    八年级数学下册第二十二章四边形22.6正方形典型题解析素材新版冀教版

    例如,题目1中,要证明EF=GH,可以通过构造辅助线,如过点G、E分别作GM⊥BC和EN⊥CD,使垂足分别为M、N,然后利用全等三角形ENF与GMH证明它们的边相等,从而得出EF=GH。 其次,第二类问题通常要求证明一条线段等于...

    9,10-二氰基蒽和杜烯间光诱导电子转移的电荷分离态和电子耦合 (2003年)

    采用从头算方法,讨论了9,10-二...根据广义Mulliken-Hush(GMH)模型,计算了电荷复合过程的电子耦合矩阵元。结果表明,[DCA…DUR]配合物的S0→S1和S0→S2跃迁产生了两个强的局域激发态,S0→S3跃迁直接导致电荷分离

    matlab开发-最优约简顺序离散化QG设计

    2. gmhfac.m:可能实现了GMH(Givens-Matthews-Haug)旋转,这是一种矩阵操作,用于对矩阵进行约简或对角化,这是离散化过程中的常见步骤。 3. rocochk.m:这个名字可能指的是“正交性检查”,这可能是检查离散化后...

Global site tag (gtag.js) - Google Analytics