强曰为道
与天地相似,故不违。知周乎万物,而道济天下,故不过。旁行而不流,乐天知命,故不忧.
文档目录

Guile/Scheme 编程教程 / 第2章:安装与环境搭建

第 2 章:安装与环境搭建

2.1 各平台安装方法

2.1.1 Linux 发行版

Linux 是 Guile 最原生的平台,几乎所有发行版都提供官方包。

Debian / Ubuntu

# 安装 Guile 3.0
sudo apt update
sudo apt install guile-3.0

# 验证安装
guile --version
# GNU Guile 3.0.9

# 安装额外的开发库(用于 C 扩展开发)
sudo apt install guile-3.0-dev

# 安装文档
sudo apt install guile-3.0-doc

Fedora / RHEL

# 安装 Guile
sudo dnf install guile30

# 开发库
sudo dnf install guile30-devel

Arch Linux

# 安装 Guile
sudo pacman -S guile

# AUR 中可能有更新的版本
yay -S guile-git

openSUSE

sudo zypper install guile3

2.1.2 macOS

# 使用 Homebrew(推荐)
brew install guile

# 使用 MacPorts
sudo port install guile3

# 验证
guile --version

注意:macOS 上的 Guile 可能需要设置 GUILE_LOAD_PATH 环境变量。使用 Homebrew 安装时通常会自动配置。

2.1.3 Windows

Windows 上安装 Guile 相对复杂,推荐以下方案:

方案一:MSYS2(推荐)

# 1. 安装 MSYS2: https://www.msys2.org/

# 2. 在 MSYS2 终端中
pacman -S mingw-w64-x86_64-guile

# 3. 验证
guile --version

方案二:WSL(Windows Subsystem for Linux)

# 在 WSL 中使用 Ubuntu 的包管理器
sudo apt update
sudo apt install guile-3.0

方案三:编译安装

# 需要先安装依赖:libgc, libunistring, libffi
# 下载源码
wget https://ftp.gnu.org/gnu/guile/guile-3.0.9.tar.gz
tar xzf guile-3.0.9.tar.gz
cd guile-3.0.9

# 编译
./configure --prefix=/usr/local
make -j$(nproc)
sudo make install

2.1.4 各平台安装对比

平台安装方式难度推荐度
Debian/Ubuntuapt★☆☆☆☆⭐⭐⭐⭐⭐
Fedoradnf★☆☆☆☆⭐⭐⭐⭐⭐
Archpacman★☆☆☆☆⭐⭐⭐⭐⭐
macOS (Homebrew)brew★☆☆☆☆⭐⭐⭐⭐
Windows (MSYS2)pacman★★☆☆☆⭐⭐⭐
Windows (WSL)apt★★☆☆☆⭐⭐⭐⭐
源码编译make★★★★☆⭐⭐

2.2 GNU Guix 系统

GNU Guix 是一个纯函数式的包管理器和操作系统,完全使用 Guile 编写配置。如果你计划长期使用 Guile,强烈推荐了解 Guix。

2.2.1 Guix 包管理器(在任何 Linux 上安装)

# 安装 Guix 包管理器(不影响现有系统)
# 参考: https://guix.gnu.org/manual/en/html_node/Binary-Installation.html

# 1. 下载安装脚本
wget https://git.savannah.gnu.org/cgit/guix.git/plain/etc/guix-install.sh
chmod +x guix-install.sh

# 2. 运行安装
sudo ./guix-install.sh

# 3. 重新加载 profile
source ~/.bashrc

# 4. 安装 Guile
guix install guile

# 5. 安装 Guile 包
guix install guile-srfi-64  ; 测试框架
guix install guile-json     ; JSON 支持
guix install guile-lib      ; 通用库集合

2.2.2 Guix System(完整操作系统)

Guix System 是一个完整的 GNU/Linux 发行版,系统配置完全用 Guile 编写:

;; /etc/config.scm — Guix 系统配置示例
(use-modules (gnu)
             (gnu system)
             (gnu system nss)
             (gnu packages)
             (gnu packages admin)
             (gnu packages guile)
             (gnu packages version-control))

(operating-system
  (host-name "guile-dev")
  (timezone "Asia/Shanghai")
  (locale "zh_CN.utf8")

  ;; 引导加载器
  (bootloader (bootloader-configuration
                (bootloader grub-bootloader)
                (targets '("/dev/sda"))
                (keyboard-layout (keyboard-layout "cn"))))

  ;; 文件系统
  (file-systems (append
                  (list (file-system
                          (device (file-system-label "root"))
                          (mount-point "/")
                          (type "ext4")))
                  %base-file-systems))

  ;; 用户
  (users (cons (user-account
                 (name "developer")
                 (comment "Guile Developer")
                 (group "users")
                 (supplementary-groups '("wheel" "netdev" "audio" "video")))
               %base-user-accounts))

  ;; 系统级包
  (packages (append (list guile-3.0
                          git
                          nss-certs)
                    %base-packages)))
# 应用 Guix 系统配置
sudo guix system reconfigure /etc/config.scm

2.2.3 Guix 开发环境

# 创建项目专属的 Guile 开发环境
# guix.scm 或 manifest.scm

guix shell guile guile-json guile-srfi-64 -- \
    guile -c '(display "Guile ready!\n")'

# 或创建 manifest 文件
cat > manifest.scm << 'EOF'
(specifications->manifest
  '("[email protected]"
    "guile-json"
    "guile-srfi-64"
    "guile-lib"))
EOF

guix shell -m manifest.scm

2.3 Emacs 集成

Emacs 是开发 Guile 程序的最佳编辑器,原生支持 Geiser 和多种 Lisp 交互模式。

2.3.1 安装 Geiser

Geiser 是 Emacs 的 Scheme 交互开发环境,提供一流的 Guile 支持。

;; 在 Emacs 配置文件中添加(~/.emacs.d/init.el 或 ~/.emacs)

;; 安装 Geiser(使用 use-package)
(use-package geiser
  :ensure t
  :config
  (setq geiser-active-implementations '(guile))
  (setq geiser-guile-binary "guile"))

;; 可选:安装 geiser-guile 包(有些 Emacs 版本需要单独安装)
(use-package geiser-guile
  :ensure t)

;; 可选:安装 paredit(结构化编辑,强烈推荐)
(use-package paredit
  :ensure t
  :hook ((scheme-mode . paredit-mode)
         (geiser-repl-mode . paredit-mode)))

2.3.2 Geiser 核心快捷键

快捷键功能说明
C-c C-s启动 REPL选择 Scheme 实现
C-c C-c加载当前缓冲区类似 “运行文件”
C-c C-r加载选中区域只执行部分代码
C-M-x加载当前定义光标所在的顶层定义
C-c C-z切换到 REPL在代码和 REPL 间切换
C-c C-d查看文档查看当前符号的文档
C-c C-a添加模块导入自动添加 use-modules
M-.跳转到定义转到函数定义处
M-,返回从定义处返回
C-c C-e求值表达式在 minibuffer 中输入表达式

2.3.3 Geiser 工作流示例

;; 在 Emacs 中创建 hello.scm
(display "Hello from Geiser!")
(newline)

;; 按 C-c C-c 加载整个文件
;; 或按 C-M-x 加载当前定义

;; 在 REPL 中交互测试
;; 按 C-c C-z 切换到 REPL
;; 直接输入表达式:
(+ 1 2 3)  ; => 6

2.3.4 其他编辑器支持

编辑器插件支持程度
VS Codevscode-scheme基础语法高亮
Vim/Neovimvim-sexp, conjure中等,需配置
Sublime TextScheme 语法包基础
DrRacket原生支持完整 IDE(Racket 方言)
IntelliJ插件有限基础

2.4 Guile REPL 使用

2.4.1 启动 REPL

# 最简单的启动方式
guile

# 启动并加载文件
guile -l script.scm

# 启动并执行表达式
guile -c '(display "Hello!\n")'

# 从标准输入读取
echo '(+ 1 2)' | guile

# 启动并进入交互模式(即使有 -l 或 -c)
guile -l script.scm --interactive

2.4.2 REPL 基本操作

;; Guile REPL 启动后显示:
;; GNU Guile 3.0.9
;; Copyright (C) 1995-2024 Free Software Foundation, Inc.
;; Guile comes with ABSOLUTELY NO WARRANTY.
;; ...
;; scheme@(guile-user)>

;; 基本算术
scheme@(guile-user)> (+ 1 2 3)
$1 = 6

;; 定义变量
scheme@(guile-user)> (define name "Guile")
scheme@(guile-user)> name
$2 = "Guile"

;; 定义函数
scheme@(guile-user)> (define (square x) (* x x))
scheme@(guile-user)> (square 5)
$3 = 25

;; 查看历史结果
scheme@(guile-user)> ,apropos display
;; 搜索所有包含 "display" 的绑定

;; REPL 命令(以逗号开头)
scheme@(guile-user)> ,help       ; 显示帮助
scheme@(guile-user)> ,quit       ; 退出 REPL
scheme@(guile-user)> ,use (srfi srfi-1)  ; 加载模块
scheme@(guile-user)> ,pp '(1 2 3)        ; 美化打印
scheme@(guile-user)> ,trace (factorial 5) ; 追踪调用

2.4.3 REPL 命令参考

命令功能示例
,help显示帮助,help
,quit退出,quit
,use MODULE加载模块,use (srfi srfi-1)
,pp EXPR美化打印,pp '((a 1) (b 2))
,trace EXPR追踪求值,trace (fib 10)
,time EXPR计时,time (fib 30)
,apropos STR搜索符号,apropos "map"
,bindings列出绑定,bindings
,option查看选项,option
,clear清屏,clear
,backtrace显示回溯,backtrace

2.4.4 REPL 技巧

;; 1. 多行输入 —— 用分号或直接续行
scheme@(guile-user)> (define (long-function x y z)
....                    (+ x
....                       y
....                       z))

;; 2. 使用 #; 注释掉一个表达式
scheme@(guile-user)> (+ 1 #;(+ 2 3) 4)
$1 = 5

;; 3. 使用 ,option 查看和修改选项
scheme@(guile-user)> ,option print-width 80

;; 4. 调试:使用 ,bt 查看回溯
scheme@(guile-user)> (define (buggy n) (/ n 0))
scheme@(guile-user)> (buggy 5)
;; ERROR: In procedure /: Numerical overflow
scheme@(guile-user)> ,bt
;; 显示调用栈

;; 5. 从错误中恢复
scheme@(guile-user)> ,c   ; 继续(如果可能)
scheme@(guile-user)> ,r   ; 重试

2.5 项目结构约定

2.5.1 推荐的项目布局

my-guile-project/
├── README.md
├── guix.scm              # Guix 环境定义(可选)
├── manifest.scm           # Guix manifest(可选)
├── Makefile               # 构建脚本
├── src/
│   ├── main.scm           # 入口文件
│   ├── core.scm           # 核心逻辑
│   └── utils.scm          # 工具函数
├── tests/
│   ├── test-core.scm      # 核心测试
│   └── test-utils.scm     # 工具测试
├── doc/
│   └── manual.md          # 文档
└── examples/
    └── demo.scm           # 示例

2.5.2 简单的 Makefile

# Makefile for Guile project

GUILE = guile
GUILE_FLAGS = -L src

# 运行主程序
run:
	$(GUILE) $(GUILE_FLAGS) src/main.scm

# 运行测试
test:
	$(GUILE) $(GUILE_FLAGS) tests/test-core.scm

# 语法检查
check:
	$(GUILE) $(GUILE_FLAGS) -e main -c '(use-modules (src core))'

.PHONY: run test check

2.5.3 脚本文件头约定

#!/usr/bin/env guile
!#
;; -*- mode: scheme; -*-
;; my-script.scm — 脚本说明

;; 模块声明(如果是独立脚本可省略)
(use-modules (ice-9 format)
             (srfi srfi-1))

;; 主逻辑
(define (main args)
  (format #t "Hello, ~a!~%" (if (null? args) "World" (car args)))
  0)

;; 脚本入口
(main (command-line))

2.6 版本管理

2.6.1 并行安装多版本

# 使用 Guix 管理多版本
guix install [email protected]
guix install [email protected]

# 指定版本运行
guix shell [email protected] -- guile --version

# 查看已安装的版本
guix package -I guile

2.6.2 版本检测脚本

;; check-version.scm — 检查 Guile 版本兼容性
(define (check-guile-version major minor)
  "检查当前 Guile 版本是否 >= 指定版本"
  (let ((current-major (string->number
                         (car (string-split (version) #\.))))
        (current-minor (string->number
                         (cadr (string-split (version) #\.)))))
    (or (> current-major major)
        (and (= current-major major)
             (>= current-minor minor)))))

;; 使用示例
(unless (check-guile-version 3 0)
  (display "警告: 需要 Guile 3.0 或更高版本\n")
  (exit 1))

2.7 第一个完整程序

#!/usr/bin/env guile
!#
;; hello-guile.scm — 一个完整的 Guile 入门程序

(use-modules (ice-9 format)
             (srfi srfi-19))  ; 日期时间库

;; 定义问候函数
(define (greet name)
  "生成个性化问候语"
  (let* ((now (current-date))
         (hour (date-hour now))
         (time-greeting (cond
                          ((< hour 6) "夜深了")
                          ((< hour 12) "早上好")
                          ((< hour 18) "下午好")
                          (else "晚上好"))))
    (format #f "~a,~a!当前时间是 ~a"
            time-greeting
            name
            (date->string now "~Y-~m-~d ~H:~M:~S"))))

;; 主函数
(define (main args)
  (let ((name (if (> (length args) 1)
                  (cadr args)
                  "Guile 学习者")))
    (display (greet name))
    (newline)
    (format #t "Guile 版本: ~a~%" (version))
    (format #t "运行平台: ~a~%" (utsname:sysname (uname)))
    0))

;; 执行
(main (command-line))
# 运行程序
chmod +x hello-guile.scm
./hello-guile.scm "开发者"
# 早上好,开发者!当前时间是 2026-05-10 09:30:15
# Guile 版本: 3.0.9
# 运行平台: Linux

2.8 常见问题排查

2.8.1 安装问题

问题原因解决方案
guile: command not found未安装或不在 PATH 中检查安装和 PATH 设置
ERROR: no code for module模块路径错误检查 GUILE_LOAD_PATH
libguile-3.0.so: cannot open共享库路径缺失设置 LD_LIBRARY_PATH
Unbound variable: use-modules版本太旧(< 2.0)升级到 3.0
编译时找不到 libgc依赖未安装安装 libgc-dev

2.8.2 环境变量

# GUILE_LOAD_PATH —— 模块搜索路径
export GUILE_LOAD_PATH="/my/modules:$GUILE_LOAD_PATH"

# GUILE_COMPILED_PATH —— 编译后的 .go 文件路径
export GUILE_COMPILED_PATH="/my/compiled:$GUILE_COMPILED_PATH"

# GUILE_AUTO_COMPILE —— 自动编译 (0=关闭, 1=开启)
export GUILE_AUTO_COMPILE=1

# GUILE_WARN_DEPRECATED —— 弃用警告
export GUILE_WARN_DEPRECATED=detailed

2.9 本章小结

主题要点
Linux 安装使用包管理器,最简单
macOS推荐 Homebrew
Windows推荐 MSYS2 或 WSL
GuixGuile 生态的核心,推荐学习
EmacsGeiser 是最佳开发工具
REPL交互式开发的核心工具

扩展阅读


上一章:第 1 章:Guile 概述 下一章:第 3 章:基本语法