Scheme 编程环境的设置

介绍了这么久的 Scheme,却没有讲过如何配置一个高效的 Scheme 的编程环境。有些人开始学习 Scheme 的时候感觉无从下手,所以今天讲一下它的配置。

Scheme 的配置有很多种方式,我不想介绍太多东西,免得有人看花了眼,所以这里只介绍一下我自己的配置。我不大喜欢像 Quack 一类的复杂的环境,因为它们经常有很多多余的功能,却缺少我想要的功能。一旦我想修改它们,又到处出问题。我的配置很简约,我用它写了几千行的超高难度的代码,翻来覆去的改,感觉效率非常高,也没有觉得缺少什么特别重要的东西。

现在我就一步一步的介绍我的配置。

安装 Scheme

Chez Scheme

世界上最快,最成熟可靠的 Scheme 实现是 R. Kent Dybvig 所作的 Chez Scheme。它可以把 Scheme 编译成机器代码,运行速度非常高。Chez Scheme 曾经是商业软件,价格昂贵,然而现在却开源了,并且可以免费使用。你可以在这里下载 Chez Scheme 的源代码:

https://github.com/cisco/ChezScheme

编译安装很快很方便,在 Linux 和 Mac 系统基本就是这样:

./configure
make
sudo make install

整个编译安装过程只需要30秒。这是世界上最快编译自己全套系统的编译器。

Racket

如果你对性能没有特别高的需求,主要用于学习,也可以用 Racket。它可以在这里下载:

http://racket-lang.org

安装应该很容易。Ubuntu 也自带了 Racket,所以可以直接让系统安装它。

设置 ParEdit mode

我编辑 Scheme 的时候都用 Emacs。我使用一个叫做 ParEdit mode 的插件。它可以让你“半结构化”式的编辑 Scheme 和其它的 Lisp 文件。开头你可能会有点不习惯,可是一旦习惯了,你就再也离不开它。

ParEdit mode 可以在这里下载:

http://mumble.net/~campbell/emacs/paredit.el

下载之后,把它放到一个目录里,比如 ~/.emacs.d,然后打开 ~/.emacs 配置文件,加入如下设置:

(add-to-list 'load-path "~/.emacs.d")
(autoload 'paredit-mode "paredit"
"Minor mode for pseudo-structurally editing Lisp code."
t)

这样,只要你使用 M-x paredit-mode 就可以自动载入这个模式。具体的操作方式可以看它的说明(按 C-h m 查看“模式帮助”),我下面也会简单说一下。

设置 scheme mode

我一般就用系统自带的 Scheme 模式,叫 cmuscheme。但是为了方便,我自己写了几个函数,用于在执行 Scheme 代码的时候自动启动解释器,并且打开解释器窗口。你基本只需要把下面的代码拷贝到你的 .emacs 文件里就行:

;;;;;;;;;;;;
;; Scheme
;;;;;;;;;;;; (require 'cmuscheme)
(setq scheme-program-name "racket") ;; 如果用 Petite 就改成 "petite" ;; bypass the interactive question and start the default interpreter
(defun scheme-proc ()
"Return the current Scheme process, starting one if necessary."
(unless (and scheme-buffer
(get-buffer scheme-buffer)
(comint-check-proc scheme-buffer))
(save-window-excursion
(run-scheme scheme-program-name)))
(or (scheme-get-process)
(error "No current process. See variable `scheme-buffer'"))) (defun scheme-split-window ()
(cond
((= 1 (count-windows))
(delete-other-windows)
(split-window-vertically (floor (* 0.68 (window-height))))
(other-window 1)
(switch-to-buffer "*scheme*")
(other-window 1))
((not (find "*scheme*"
(mapcar (lambda (w) (buffer-name (window-buffer w)))
(window-list))
:test 'equal))
(other-window 1)
(switch-to-buffer "*scheme*")
(other-window -1)))) (defun scheme-send-last-sexp-split-window ()
(interactive)
(scheme-split-window)
(scheme-send-last-sexp)) (defun scheme-send-definition-split-window ()
(interactive)
(scheme-split-window)
(scheme-send-definition)) (add-hook 'scheme-mode-hook
(lambda ()
(paredit-mode 1)
(define-key scheme-mode-map (kbd "<f5>") 'scheme-send-last-sexp-split-window)
(define-key scheme-mode-map (kbd "<f6>") 'scheme-send-definition-split-window)))

我的配置会在加载 Scheme 文件的时候自动载入 ParEdit mode,并且把 F5 键绑定到“执行前面的S表达式”。这样设置的目的是,我只要把光标移动到一个S表达式之后,然后用一根手指头按 F5,就可以执行程序。够懒吧。

ParEdit mode 的简单使用方法

ParEdit mode 是一个很特殊的模式。它起作用的时候,你不能直接修改括号。这样所有的括号都保持完整的匹配,不可能出现语法错误。但是这样有一个问题,如果你要把一块代码放进另一块代码,或者从里面拿出来,就不是很方便了。

为此,ParEdit mode 提供了几个非常高效的编辑方式。我平时只使用两个:

  1. C-right: 也就是按住 Ctrl 再按右箭头。它的作用是让光标右边的括号,“吞掉”下一个S表达式。

    比如,`(a b c) (d e)`。你把光标放在 `(a b c)` 里面,然后按 `C-right`。结果就是 `(a b c (d e))`。也就是把 `(d e)` 被整个“吞进”了 `(a b c)` 里面。
  2. M-r: 去掉外层代码。

    这在你需要去掉外层的 let 等结构的时候非常有用。比如,如果你的代码看起来是这样:

    (let ([x 10])
    (* x 2))

    当你把光标放在 (* x 2) 的最左边,然后按 M-r,结果就变成了

    (* x 2)

    也就是把外面的 (let ([x 10]) ...) 给“掀掉”了。

    其它的一些按键虽然也有用,不过我觉得这两个是最有用的,甚至不可缺少的。有些其他的自动匹配括号的模式,没有提供这种按键,所以用起来很别扭。

设置括号颜色

很多人看见 Lisp 就怕了,就是因为它看起来括号太多。可是这样的语法,却是有很大的好处的(参考这篇博文《谈语法》)。如果你真的觉得括号碍眼,你可以稍微调整一下括号的颜色,比如淡灰色。这样括号看起来就没有那么显眼了。

你只需要下载这个 el,放到你的 .emacs.d:

https://www.dropbox.com/s/v0ejctd1agrt95x/parenface.el

然后在 .emacs 里面加入两行:

(require 'parenface)
(set-face-foreground 'paren-face "DimGray")

然后再打开 Scheme 代码的时候,你就会看到是这个样子:

好了,这就是我写 Scheme 的所有配置了。希望这些有所帮助。

【转】Scheme 编程环境的设置的更多相关文章

  1. Scheme 编程环境的设置(racket/petite)-王垠

    Scheme 编程环境的设置 http://www.yinwang.org/blog-cn/2013/04/11/scheme-setup/ sudo apt-get insatll racket ; ...

  2. Emacs下scheme编程环境的设置

    Scheme编程环境搭建 1.1 安装Chez Scheme git clone https://github.com/cisco/ChezScheme.git cd ChezScheme ./con ...

  3. Python编程环境设置

    第1节.Python编程环境设置 一.sublime相关 1.sublime REPL插件安装 (1)安装 先打开插件安装面板:ctrl+shift+P 输入install ,选择Package Co ...

  4. linux下ruby使用tcl/tk编程环境设置

    正常情况下最新的ruby都是不带tcl/tk选项编译的,所以我们在运行tcl/tk代码时都会发生找不到tk库的错误.解决办法很简单只要以tcl/tk选项编译ruby即可. 这里以ubuntu 15.0 ...

  5. win7中java编程工具安装 java环境变量设置

    一.下载java 官方地址:http://www.oracle.com/technetwork/java/javase/downloads/jdk-6u26-download-400750.html ...

  6. 【转】手把手教你把Vim改装成一个IDE编程环境(图文)

    手把手教你把Vim改装成一个IDE编程环境(图文) By: 吴垠 Date: 2007-09-07 Version: 0.5 Email: lazy.fox.wu#gmail.com Homepage ...

  7. Vim配置及说明——IDE编程环境

    Vim配置及说明——IDE编程环境 Vim配置及说明——IDE编程环境 1.基本及字体 2.插件管理 3.主题风格 4.窗口设置 5.目录树导航 6.标签导航 7.taglist 8.多文档编辑 9. ...

  8. IDE编程环境

    Vim配置及说明——IDE编程环境 目录 Vim配置及说明——IDE编程环境 1.基本及字体 2.插件管理 3.主题风格 4.窗口设置 5.目录树导航 6.标签导航 7.taglist 8.多文档编辑 ...

  9. Ubuntu下编程环境GNU安装

    ubuntu下C编程   环境搭建 其实,linux下写C也是很容易的.IDE的话用 eclipse 集成 CDT 模块就行了.当然这属于重量级的了,就如同VC++之于windows一样.那有没有像T ...

随机推荐

  1. 递归的隐含限制——处理对象小的可以、大的不可以

    最近自己编写了一个求n阶行列式的值的C程序,编译成功,并且使用了一个3阶行列式进行了测试,测试也成功了.以为这样就万事大吉了,可是后来在实际应用中调用该函数时却导致程序无法运行.注意到,实际应用中要求 ...

  2. 从#!/bin/bash中想到的...

    罪过罪过,开发了N年的SHELL,竟然第一次思考#!/bin/bash是啥意思?真是怀疑以前的的代码是咋开发出来的- 如果要解释#!/bin/bash是啥意思?为啥每个SHELL脚本第一行都写它哪?首 ...

  3. infobright系列二:数据迁移

    安装之后把之前infobright的数据迁移到新安装的infobright上. 1:挺掉相关的服务 2:scp 把旧数据拷到新安装的infobright上 3:修改/etc/my-ib.cnf的数据目 ...

  4. C++ Standard Library

    C++ Standard Library *注:内容主要是对參考1的学习记录.知识点与图片大都来源于该书, 部分知识点与图片来源于參考2. 详细參考信息,见最下方參考. * C++98中新支持的语言特 ...

  5. OpenCV实现任意大小图片的合并(转)

    OpenCV实现图像合并主要有两种方法 方法一:使用Mat.push_back方法将列数相同的图像加到最后一行 方法二: 主要思路是将图像拷贝到待合并图像的感兴趣区域 (1)新建一个要合并的图像(容器 ...

  6. nginx 和php设置上传大小及可以提交的内容限制

    1. 以下代码加入 /etc/nginx/nginx.conf 文件中的 http{ ... } 块中 client_max_body_size 8M; 2. PHP 设置上传大小 打开 /etc/p ...

  7. Oracle Data Integrator 12cR1 (12.1.3.0.0)安装过程

    Oracle Data Integrator 12cR1 (12.1.3.0.0)安装过程 下载安装文件 Oracle Data Integrator 12cR1 (12.1.3.0.0) http: ...

  8. java sm4国密算法加密、解密

      java sm4国密算法加密.解密 CreationTime--2018年7月5日09点20分 Author:Marydon 1.准备工作 所需jar包: bcprov-jdk15on-1.59. ...

  9. 删除sql server用户时报15138错误

    问题 在删除sql server中某数据库下的用户时报15138错误,见下图  解决 可用下述sql代码检查该用户的架构信息,然后逐一修正 SELECT s.name FROM sys.schemas ...

  10. vsftp 虚拟用户测试

    1.创建用于进行FTP验证的帐号密码数据库文件,单数行为账户名,偶数行为密码.[root@rhel1 vsftpd]# vi /etc/vsftpd/vuser.listuser1123456user ...