M-% Emacs Lisp RET Guile Scheme RET ?

Table of Contents

Guile 支持1用 Emacs Lisp 和 ECMAScript 写 Guile 程序,Guile 2.22 完全兼容了 Emacs,并且

We hope that eventually Guile’s implementation of Elisp will be good enough to replace Emacs’ own implementation of Elisp

我希望了解下目前到了什么程度,Guile 能取代 Emacs Lisp 吗?

1 安装 Guile 2.2

我的系统是 macOS,包管理器是 MacPorts,由于 Guile 2.2 今天刚出来,自然 MacPorts 上还没有更新(MacPorts 目前提供的是 Guile 2.0.14)。所以我利用了 MacPorts 现成的设施从源码安装 Guile 2.2(修改 Portfile 然后 port install)。

注意,从源码编译比较耗资源,我的 MBA 花了十几二十分钟,中间风扇转个不停。


guile --version
guile (GNU Guile) 2.2.0
Copyright (C) 2017 Free Software Foundation, Inc.

License LGPLv3+: GNU LGPL 3 or later <http://gnu.org/licenses/lgpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

1.1 安装 Guile Info manuals

Emacs 里看 Info Manual 很方便,但 MacPorts 虽然编译了 Info manual,但没更新 dir 文件,不清楚是不是 Bug,暂时手动更新

cd /opt/local/share/info && sudo install-info guile.info dir && sudo install-info r5rs.info dir

2 Hello World in Guile

我以前没有用过 Guile,依照惯例,先写一只 Hello World 程序

(display "Hello World in Guile")
"Hello World in Guile"

其中 display 是 R5RS3 标准规定的函数,文档在 (info "(guile) Scheme Write")

3 在 Guile 中使用 Emacs Lisp

在 Guile 中使用 Emacs Lisp 有两种方法,一是从 Guile 的 REPL

scheme@(guile-user)> (let ((fn (lambda () 42))) (fn))
$1 = 42
scheme@(guile-user)> ,L elisp
Happy hacking with Emacs Lisp!  To switch back, type `,L scheme'.
elisp@(guile-user)> (let ((fn (lambda () 42))) (funcall fn))
$1 = 42

(Emacs Lisp 中变量的值即便是函数也需要用 funcall ,但 Guile 不同。)

二是在 Guile 程序中调用 compile

;; 我是一只 Guile 程序,但是使用了一部分 Emacs Lisp 代码
(compile '(let ((fn (lambda () 42))) (funcall fn)) #:from 'elisp)

我不清楚目前这有什么用处,光是能在 Guile 中调用 Emacs Lisp 本身对 Guile 意义不大,对 Emacs 完全没有作用。或许有一天,Guile 开发者把 Emacs 里的 Emacs Lisp 先完全换成 Guile,并且还能兼容现有的 Emacs Lisp 代码。

无论如何对于一个 Emacs 普通用户,比如我,对此不会太感兴趣,以后再遇到这个话题,也不再算是一无所知了。



R5R5 即 Revised5 Report on the Algorithmic Language Scheme

Created: 2017-04-16 | Modified: 2017-03-17 | Org source | History

Author: Chunyang Xu <mail@xuchunyang.me>

Proudly Powered by Emacs & Org mode

Validate XHTML 1.0