文档章节

Ruby进行简单的S表达式的解析

蕾娜漢默
 蕾娜漢默
发布于 2015/01/04 23:15
字数 152
阅读 52
收藏 0

Hello World,发贴测试.

def parse(line)
  s = line.scan(/\(|\)|"(?:\\.|[^"])*"|[^()" \n]+/)
  f = ->(t=nil){
    case x = t || s.shift
    when ?(
      y = []
      while x = s.shift
        return y if x==?)
        y << f[x]
      end
      fail ")?"
    when nil
      nil
    when /^#(.*)$/
      {?t=>true,?f=>false}[$~[1]]
    when /\d+/
      x.to_i
    when /^\"(.*)\"$/m
      $~[1].gsub(/\\./,'\n'=>"\n","\\\\"=>"\\","\\\""=>'"')
    else
      x.to_sym
    end
  }
  f[]
end
 
$tests = {
  "" => nil,
  "1" => 1,
  "(a b)" => [:a,:b],
  "(1 2(2 3))" => [1,2,[2,3]],
  '(a"b"c"d"(ef))' => [:a,"b",:c,"d",[:ef]],
  '("a b" (c d-e))' => ["a b",[:c,:"d-e"]],
  "(\"a\nb\"\nb\nc (d))" => ["a\nb",:b,:c,[:d]],
  ' "a\nb"' => "a\nb",
  '"a\\"b"'=>'a"b',
  "\"\\\\\""=> "\\",
  "(#t #f)" => [true,false],
  "(define (f x) (if (zero? x) 0 (+ x (f (- x 1)))))" =>
    [:define,[:f,:x],[:if,[:zero?,:x],0,[:+,:x,[:f,[:-,:x,1]]]]],
}
 
p $tests.all?{|x,y|parse(x)==y}

© 著作权归作者所有

共有 人打赏支持
蕾娜漢默
粉丝 2
博文 2
码字总数 754
作品 0
其他
私信 提问
Ruby 2.4 的一些新特性

使用了 Regexp#match? 的更快的正则表达式 Ruby 2.4 为正则表达式新增加了一个新的 #match? 方法,它比 Ruby 2.3 中Regexp的任何一个方法都要快三倍: 当你调用 Regexp#===, Regexp#=~, 或者是...

oschina
2016/07/22
3.3K
7
数据即代码,我和我的小伙伴们都惊呆了

几个小伙伴在考虑下面这个各个语言都会遇到的问题: 问题:设计一个命令行参数解析API 一个好的命令行参数解析库一般涉及到这几个常见的方面: 1) 支持方便地生成帮助信息 2) 支持子命令,比...

oschina
2013/08/10
8.4K
25
ruby面向对象语言学习第四天

今天继续学习ruby的基本类型,正则表达式,它涵盖的内容非常多。 六、正则表达式 正则表达式指的是一种模式,一般用来和字符串进行匹配,通常一类字符串都具有相同的模式,如电话号码,邮箱等...

若狼
2016/04/25
38
0
PostgreSQL 9.4 中使用 jsonb

转载翻译自http://nandovieira.com/using-postgresql-and-jsonb-with-ruby-on-rails PostgreSQL 9.4 引入了,一个新的列类型用于存储文档到你的关系数据库中。和在更高的层面上看起来几乎是一...

gameFu
2015/06/16
0
0
JavaEye3.0开发手记之二 - rails的UTF-8支持造成的正则表达式问题

rails的ActionView::Helpers::TextHepler模块提供了很多实用的方法,这些方法对于论坛类应用非常有用,例如auto_link这个方法可以自动检测传入字符串当中的URL,并将其自动转换为HTML超链接格...

懒勤人
2012/02/23
0
0

没有更多内容

加载失败,请刷新页面

加载更多

关于C++ 容器的swap操作

一、swap操作交换两个相同类型的容器的内容,一般的容器(除array外),交换两个容器内容的操作会保证非常快,因为并没有交换元素本身,而只是交换了两个容器的内部数据结构。 拿vector做个例...

shzwork
25分钟前
1
0
程序员从宏观、微观角度浅析JVM虚拟机!

1.问题 1、JAVA文本文件如何被翻译成CLASS二进制文件? 2、如何理解CLASS文件的组成结构? 3、虚拟机如何加载使用类文件的生命周期? 4、虚拟机系列诊断工具如何使用? 5、虚拟机内存淘汰机制?...

我最喜欢三大框架
26分钟前
2
0
Choerodon猪齿鱼实践之应用生命周期管理

Choerodon平台中的开发和部署都是围绕应用来进行的,那Choerodon平台中的应用有什么样的特性?又是怎样来进行管理的呢?本文旨在深入地介绍Choerodon平台中应用的功能特性及其生命周期的管理...

Choerodon
47分钟前
0
0
Websocket之Jmeter压力测试

最近使用到Websocket进行聊天功能开发,用Jmeter进行压力测试,记录下。 使用的Jmeter版本5.1.1,自行从apache jmeter官网下载。 首先要添加Websocket的插件,网上有很多,我从百度网盘下载的...

克虏伯
47分钟前
1
0
作为Java程序员这些技术都不会,拿什么去涨薪跳槽?

引言 当下,正面临着近几年来的最严重的互联网寒冬,听得最多的一句话便是:相见于江湖~,缩减HC、裁员不绝于耳,大家都是人心惶惶,年前如此,年后想必肯定又是一场更为惨烈的江湖厮杀。但博...

别打我会飞
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部