`
yangdong
  • 浏览: 66274 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论
文章列表
http://winteryoung.github.io
Java 的 Parser combinator 中最有名应该是 JParsec 了。随着 Java 8 的发布,我们也可以用 lambda 表达式来写规则了。刚开始的时候我以为它跟 C# 下面的 Sprache 会比较像,API 应该很容易。结果我错了。Sprache 的思想跟《Monadic Parser Combinators》这篇论文里的提到的设计方法如出一辙,是不区分 lexer 和 parser 的。但是 JParsec 区分。如果在 parser 对应的规则里面使用 lexer 的规则,会导致异常。可以参看 ParserState 类: @Override CharSeque ...

Java 类路径扫描

    博客分类:
  • Java
Java 中缺乏内建的类路径扫描机制。但是这个机制对于做框架的人来说很常用。下面的工具类从类路径下面的文件或者 JAR 路径中扫描包,可以实现我们需要的功能。实现是基于 Spring 3.1.11.RELEASE 版的 PathMatchingResourcePatternResolver 修改的。去掉了原版中 ANT * 号匹配的功能。依赖 Google Guava, Apache Commons Collections 4, Apache Commons  Lang。 这个实现的大概思路是 1. 先根据包名构建一个路径("." 换成 "/") 2. ...
    TimSort 是 Python 中 list.sort 的默认实现。Java 7 也将非原始类型列表的排序实现替换成了 TimSort。网上关于 TimSort 是什么,性能特点分析的文章不少,但是介绍它的具体实现步骤的文章很少。这里有一篇:Understanding timsort, Part 1: Adaptive Mergesort,用 C 作为示例代码。 基于这个文章的介绍,我用 python 实现一遍 TimSort,并说一下其中的关键步骤。因为原文只讲解了 TimSort 中最基本最重要的部分,所以本文也没有超过这个范围。本文不是对 TimSort 的分析,只是介绍一下其 ...
今天搜了一下,发现 ruby 只有一部分 VM 实现支持 TCO(Tail Call Optimization)。下面的代码模拟实现了一下,有点 clojure 的感觉了~~ class Recur attr :args def initialize(*args) @args = args end end def def_recur(fn_name, &block) def recur(*args) Recur.new *args end mtd = lambda do |*args| loop do ...
如果把 ruby 当脚本使用,在 windows 命令行下面输出中文可能会乱码。这句话可以解决问题: STDOUT.set_encoding Encoding.locale_charmap
Java 没有像 C++ 一样的友元。但是友元我认为是非常有用的。尤其是在设计 API 的时候,参见《Practical API Design》。友元可以帮助实现“clueless programming”(即无需考虑过多繁琐的细节就可以编程)。但是也容易被滥用。无论如何,我希望这个选择是在语言使用者手里。 《Practical API Design》里提到了一种 Accessor 模式,可以帮助 API 定义实现友元。但是这个并不是我们通常意义上的友元。因为它只能让客户端不能访问 API 的非 public 方法,但是 API 内部实现的任意部分都可以。更糟糕的是,它的实现复杂,而且需要自定 ...
我的笔记本的显卡是 nVidia GeForce GT 320M。用 gnome-mplayer 播放视频的时候垂直不同步,会发生画面撕扯现象(Totem 更不用说了)。驱动用的是 Ubuntu 推荐安装的 proprietary driver。在 Ubuntu forums 发现一个方法非常管用。用gnome-mplayer 播放就不会有问题了。video_output 我用的是 xv。我找了一个动作片的打斗部分进行了测试,没有问题。 方法:在 /etc/X11/xorg.conf 里面加一段: Section "Extensions" Option &qu ...
SICP 第二版 5.2 节提到的 Register Machine Simulator 我用 Clojure 重写了一遍,完全不用 mutable states。每执行一条指令都可以打出当时机器的状态,甚至可以把这些状态保存起来。这就是 Clojure 牛逼的地方…… 程序里的模型跟书上不太一样,为了方便对时间的管理(也就是为了用不变体搞定原本需要可变体搞定的事)。Machine 只包含寄存器和栈。操作集和解析过的指令都不作为 Machine 的一部分。因为它们在程序运行过程中是不会变的。 比较有意思的是指令的初始化过程。原本书的指令(instructions/controller)是可变 ...
Update: As of Clojure 1.3, Clojure standardized the exception handling mechanism. Refer to clj-stacktracefor the details. Clojure 中虽然使用了 Java 的异常处理机制。但是,Clojure 很难自然地自定义自己的异常。我在与 Java 类库进行交互就时恰恰遇到了这种需求。下面的代码是与 svn-kit 进行交互的代码,它们提供了 svn-kit 的一个 wrapper。 (defmacro- try-catch-svn-ex [& exprs] ...
Clojure doesn't provide direct support for named arguments, which are supported under some popular dynamic languages like Ruby, Python. The following Python code was exerpted from `The Joy of Clojure': def slope(p1=(0,0), p2=(1,1)): return (float(p2[1] - p1[1])) / (p2[0] - p1[0]) slope((4,15), (3 ...
看了《The Joy of Clojure》的快速排序,觉得比较丑,而且不通用。所以自己又写了一个。不过有一个比不上书里面的。书里面的支持 lazy-seq,而下面这个不支持。可能正是因为要支持 lazy-seq 所以书里面的那个才会那么繁琐吧…… (defn- split-by [pred coll] [(filter pred coll) (remove pred coll)]) (defn qsort-by [comparator work] (letfn [(step [ret [pivot & rst :as work]] (if ...

封闭空间

《Structure and Interpretation of Computer Programs》中提到,“The ability to create pairs whose elements are pairs is the essence of list structure's importance as a representational tool. We refer to this ability as the closure property of cons.”这话表面上是说 cons 作为 LISP 的核心,能够把自己产生的 pair 作为 cons 的参数进而去产生新的组合 ...

求对数

下面是求以 1.12 为底,2.7 的对数。本方法极其低效,仅仅标记一下以备以后参考。 (ns t (:require [clojure.contrib.generic.math-functions :as math])) (defn abs [x] (if (< x 0) (* -1 x) x)) (defn close-enough? [delta] #(< (abs (- %1 %2)) delta)) (defn calc-log [lg lg-level acc-stack] (let [acc (math/pow 1.12 ...
(define fibs (stream-cons 0 (stream-cons 1 (stream-add (stream-cdr fibs) fibs)))) The code above is an excerpt from SICP that generates an infinite Fibonacci sequence. I've tried to migrate it to Clojure. The following code is the implementations of the stream concept mentioned in ...
Global site tag (gtag.js) - Google Analytics