Windows 用户 Ocaml 入坑指南

2019-11-02 22:05:01 +08:00
 wocanmei

第一次听说 Ocaml 是看到 Ocaml 写的 quicksort 算法:

let rec quicksort = function
  | [] -> []
  | x::xs ->
    let smaller, larger = List.partition (fun y -> y < x) xs
    in quicksort smaller @ (x::quicksort larger);;

List.iter (fun x -> Printf.printf "%d " x) (quicksort [2; 3; 1; 1; 7; 10])

Java 语言的实现相信大家都看过,这里我把Algorithms 4th中的源码贴一下:

public class Quick {

    public static void sort(Comparable[] a) {
        StdRandom.shuffle(a);
        sort(a, 0, a.length - 1);
    }

    private static void sort(Comparable[] a, int lo, int hi) {
        if (hi <= lo) return;
        int j = partition(a, lo, hi);
        sort(a, lo, j-1);
        sort(a, j+1, hi);
    }

    private static int partition(Comparable[] a, int lo, int hi) {
        int i = lo;
        int j = hi + 1;
        Comparable v = a[lo];
        while (true) {
            while (less(a[++i], v)) {
                if (i == hi) break;
            }
            while (less(v, a[--j])) {
                if (j == lo) break;
            }
            if (i >= j) break;
            exch(a, i, j);
        }
        exch(a, lo, j);
        return j;
    }

    private static boolean less(Comparable v, Comparable w) {
        if (v == w) return false;
        return v.compareTo(w) < 0;
    }

    private static void exch(Object[] a, int i, int j) {
        Object swap = a[i];
        a[i] = a[j];
        a[j] = swap;
    }
}

两下一对比,被震撼到了。这么说吧,看 Ocaml 写的快排算法很容易看到算法的本质,而 Java 的实现则是“一团糟”,算法的本质隐藏到琐碎的细节中了,通篇都是if分支和数组索引。Ocaml 强大的模式匹配和 immunable 数据结构可以让你写出清晰简洁的代码。难能可贵的是,和曲高和寡的 Lisp 不同,Ocaml 虽然崇尚函数式编程,但并不排斥命令式编程。另外,Ocaml 是一门非常实用的语言,尤其适合编译方面的工作,所以如果你对 DSL 感兴趣,相信 Ocaml 会是你的菜,要知道大名鼎鼎的 Rust 语言在自举前编译器就是用 Ocaml 写的。

怀着激动的心情一通谷歌,发现只支持 Linux 和 OSX,这就蛋疼了。尝试了官网安装说明中几种 Windows 安装方式,效果都不理想,顶多就一个黑框框,毕竟自己不是大神,还是需要代码提示和代码格式化这样的功能的,所以尝试了几次,只好忍痛割爱。一个偶然的机会,接触了 Windows 上的 Wsl 系统,感觉不错,又想起心心念念的 Ocaml 了,自然就想到了结合 Wsl 是否可以搭建一个理想的 Ocaml 环境?摸索了一段时间,终于找到一种比较理想的方法。

最终环境图:

全文地址

1338 次点击
所在节点    程序员
2 条回复
pythonee
2019-12-21 16:53:50 +08:00
我很好奇,那些声称语言自举的,是怎么实现的呢
也就是 compiler 是 rust 的话,那么谁来编译 compiler 呢,是不是最 core 的地方还是用了别的语言
beizhedenglong
2022-03-29 17:31:09 +08:00
你写的 ocaml 的那个版本性能很差,快排本质还是 in-place 替换

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/615664

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX