📗
elisp manual zh
  • LAND OF LISP
  • 引言
  • 进度 & 计划
  • 一些记录
  • Lisp 数据类型
    • 2 Lisp 数据类型
    • 2.1 打印表示 和 读取语法
    • 2.2 特定的读取语法
    • 2.3 注释
    • 2.4 编程类型
      • 2.4.1 整型
      • 2.4.2 浮点型
      • 2.4.3 字符型
        • 2.4.3.1 基本字符语法
        • 2.4.3.2 通用转义语法
        • Page 2
        • Page 3
        • Page 4
        • Page 1
      • 2.4.4 符号类型
      • 2.4.5 序列类型
      • 2.4.6 点对类型
        • 2.4.6.1 点对可视化
        • 2.4.6.2 点对记法
        • 2.4.6.3 关联列表
      • 2.4.7 数组类型
      • 2.4.8 字符串类型
        • 2.4.8.1 字符串的语法
        • 2.4.8.2 字符串中的非ASCII码
        • 2.4.8.3 不可打印字符
        • 2.4.8.4 字符串的文本属性
      • 2.4.9 向量类型
      • 2.4.10 字符表类型
      • 2.4.11 布尔向量类型
      • 2.4.12 哈希映射类型
      • 2.4.13 函数类型
      • 2.4.14 宏类型
      • 2.4.15 原函数类型
      • 2.4.16 字节码类型
      • 2.4.17 记录类型
      • 2.4.18 类型描述符
      • 2.4.19 自动加载类型
      • 2.4.20 终止类型
    • 2.5 编辑类型
      • 2.5.1 缓冲区变量
      • 2.5.2 标记类型
      • 2.5.3 窗口类型
      • 2.5.4 框架类型
      • 2.5.5 终端类型
      • 2.5.6 窗口配置类型
      • 2.5.7 框架配置类型
      • 2.5.8 进程类型
      • 2.5.9 线程类型
      • 2.5.10 互斥锁类型
      • 2.5.11 条件变量类型
      • 2.5.12 流类型
      • 2.5.13 按键映射类型
      • 2.5.14 覆盖类型
      • 2.5.15 字体类型
    • 2.6 循环结构对象
    • 2.7 类型谓语
    • 2.8 相等谓语
    • 2.9 可变性
  • 数字
    • 3.1 整型数
    • 3.2 浮点型基础
    • 3.3 谓词:数字相关
    • 3.4 数字比较
    • 3.5 数字类型转换
    • 3.6 数学变换
    • 3.7 取整
    • 3.8 位运算
    • 3.9 数学函数
    • 3.10 随机数
  • 字符串 和 字符
    • 4 字符串和字符
    • 4.1 字符串基础
    • 4.2 谓语:字符串相关
    • 4.3 创建字符串
    • 4.4 修改字符串
    • 4.5 字符串比较
    • 4.6 字符串转换
    • 4.7 字符串格式化
    • 自定义格式化
    • Case Conversion
    • Case Table
  • 列表
    • 5 列表
    • 5.1 列表与点对
    • 5.2 列表相关的谓词
    • 5.3 列表元素的存取
    • 5.4 列表与点对的构建
    • 5.5 列表变量的修改
    • 5.6 列表结构的修改
    • 5.7 列表和集合的使用
    • 5.8 关联列表 Association Lists (alist)
    • 5.9 属性列表 Property Lists (plist)
  • 序列, 数组, 和 向量
    • 6 序列、数组、以及向量
    • 6.1 序列
    • 6.2 数组
    • 6.3 数组相关函数
    • 6.4 向量
    • 6.5 向量相关函数
    • 6.6 字符表
    • 6.7 布尔向量
    • 6.8 大小固定的对象环的管理
  • 记录
    • 7 记录
    • 7.1记录相关函数
    • 7.2 向后兼容
  • 哈希表
    • 8 哈希表
    • 8.1 哈希表创建
    • 8.2 哈希表存取
    • 8.3 哈希表定制
    • 8.4 其他哈希表相关函数
  • 符号
    • 9 符号(3/4)
    • 9.1 符号的组成(DONE)
    • 9.2 定义符号(DONE)
    • 9.3 创建(Creating)并注册(Interning)符号(DONE)
    • 9.4 符号属性
      • 9.4.1 存取符号属性(DONE)
      • 9.4.2 标准符号属性
  • 求值
    • 10 求值(DONE)
    • 10.1 表达式类型(DONE)
      • 10.2.1 自求值表达式(DONE)
      • 10.2.2 符号表达式(DONE)
      • 10.2.3 列表表达式(DONE)
      • 10.2.4 函数符号转义(DONE)
      • 10.2.5 函数表达式求值(DONE)
      • 10.2.6 Lisp 宏求值(DONE)
      • 10.2.7 特殊表达式(DONE)
      • 10.2.8 自动加载(DONE)
    • 10.2 引用(Quoting)(DONE)
    • 10.3 反引用(DONE)
    • 10.4 Eval(求值)(DONE)
    • 10.5 延迟求值(DONE)
  • 控制结构
    • 11. 控制结构
    • 11.1 顺序执行(DONE)
    • 11.2 条件判断(DONE)
    • 11.3 条件组合结构(DONE)
    • 11.4 模式匹配(TODO)
    • 11.5 迭代(DONE)
    • 11.6 生成器(DONE)
    • 11.7 非局部退出
      • 11.7.1 显式非局部退出:catch 和 throw
      • 11.7.2 catch 和 throw 的例子
      • 11.7.3 错误
        • 11.7.3.1 如何传递出一个错误
        • 11.7.3.2 Emcas 的错误处理流程
        • 11.7.3.3 编写错误处理函数
        • 11.7.3.4 错误符号和条件名
      • 11.7.4 非局部退出后的清理工作
  • 变量
    • 12 变量
    • 12.1 全局变量
    • 12.2 常量变量
    • 12.3 局部变量
    • 12.4 无效(Void)变量
    • 12.5 定义全局变量
    • 12.6 定义变量的建议
    • 12.7 变量获取
    • 12.8 变量设置
    • 12.9 变量监视
      • 12.9.1 限制
    • 12.10 变量作用域规则
      • Untitled
      • 12.10.1 动态绑定
      • 12.10.2 动态绑定的建议
      • 12.10.3 词法绑定
      • 12.10.4 如何正确的使用词法绑定
    • 文件变量
    • 目录变量
    • 通信变量
    • 变量别名
    • 变量限制
    • 泛型变量
  • 函数
    • 13 函数
    • 13.1 函数是什么?(DONE)
    • 13.2 Lambda 表达式(WORKING)
      • 13.2.1 lambda表达式的组成部分
      • 13.2.2 一个简单的lambda表达式例子
      • 13.2.3 参数列表的特性
      • 13.2.4 函数的文档字符串
    • 13.3 函数命名
    • 13.4 函数定义
    • 13.5 函数调用
    • 13.6 函数映射式调用
    • 13.7 匿名函数
    • 13.8 泛型函数
    • 13.9 读取函数槽信息
    • 13.10 闭包
    • 13.11 Emacs Lisp 函数最佳实践
    • 13.12 声明废弃函数
    • 13.13 内联函数
    • 13.14 declare 表达式
    • 13.15 告知编译器某函数已定义
    • 13.16 函数安全调用
    • 13.17 有关函数的其他主题
  • 宏
    • Untitled
  • 自定义设置
  • 加载脚本
  • 字节码编译
  • 调试 Lisp 代码
  • 读取和打印
    • 19.1 读取与打印简介
    • 19.2 输入流
    • 19.3 输入函数
    • 19.4 输出流
    • 19.5 输出函数
    • 19.6 输出变量
  • Mini Buffer
  • Loop 循环
  • 按键绑定
  • Modes
  • 23.1 钩子
    • 23.1.1 运行钩子
    • 23.1.2 设置钩子
  • 23.2
  • Untitled
  • Untitled
  • Untitled
  • Untitled
  • 文档
    • Untitled
  • 文件访问
    • Untitled
  • 备份 及 自动保存
    • Untitled
  • Buffers
    • Untitled
  • 窗口
    • Untitled
  • 框架
    • Untitled
  • 位置
    • Untitled
  • 标记
    • Untitled
  • 文本
    • 32 文本
      • 32.1 位置点附近 (Near Point)
      • 32.2 缓冲区内容 (Buffer Contents)
  • 非 ASCII 字符
    • Untitled
  • 搜索 和 匹配
    • Untitled
  • 语法表
    • Untitled
  • 缩写 及 缩写拓展
    • 34 搜索 与 替换
      • 34.1 文本搜索
  • 进程
    • Untitled
  • 线程
    • Untitled
  • Emacs 显示
    • Untitled
  • 操作系统接口
    • Untitled
  • 标准错误
    • Untitled
  • 标准按键映射
    • Untitled
  • 标准 Hooks
    • Untitled
  • Tip & Conventions
    • Untitled
  • 索引
    • Untitled
  • 附录
    • Untitled
    • 附录 H: 标准钩子
由 GitBook 提供支持
在本页

这有帮助吗?

  1. 字符串 和 字符

4.3 创建字符串

本章将介绍 直接,间接(如拼接,取子字符串)创建字符串的函数。至于通过修改其他字符串内容,从而创建新字符串的方法,请查阅 搜索与替换 章节。

Function: make-string count character & optional multibyte 这个函数将 character 重复 count 次,并作为字符串返回。如果 count 为负,那么这个函数会抛出错误。

(make-string 5 ?x)
    => "xxxxx"
(make-string 0 ?x)
    => ""

通常来说,如果一个字符是ASCII字符,那么返回的字符串是单字节字符串。如果可选参数 multibyte 非nil,则函数会返回一个多字节字符串。如果后面,你需要拼接非ASCII字符串或使用非ASCII字符替换其中字符的话,这个这个功能会非常有用。

其他还有些类似的函数,比如 make-vector (查阅向量章节)和 make-list (查阅列表构造章节)

Function: substring string &rest characters 这个函数返回一个包含字符characters的字符串。

(string ?a ?b ?c)
    => "abc"

Function: substring string &optional start end 这个函数从 string 中抽取某一范围的字符,并将这些字符构造成字符串返回。范围由可选参数 start 和 end 决定。其中字符串的第一位的索引为 0.如果只有一个参数,那么这个函数就会拷贝整个 string。

(substring "abcdefg" 0 3)
    => "abc"

在上面的例子中, "a" 的索引为 0,"b" 的索引为 1,"c" 的索引为2.而索引3,也就是字符串中的第四个字符的位置,标注了子字符串终止的位置。因此,"abc" 便从原来的 "abcdef" 中拷贝出来。

这个函数同时也支持负的索引,比如 -1 表示字符串的最后一个字符。举个例子:

(substring "abcdefg" -3 -1)
    => "ef"

在这个例子里,"e" 的索引为 -3,"f" 的索引为 -2,而 "g" 的索引为 -1.因此,"e" 和 "f" 都被包括,但 "g" 被排除在外。

如果 end 为 nil,那么就默认到字符串结尾,因此,

(substring "abcdefg" -3 nil)
    => "efg"

end 参数缺失和将end设为 nil 是等价的。(substring string 0) 就会返回一整个string的拷贝。

(substring "abcdefg" 0)
    => "abcdefg"

但是如果是想拷贝整个字符串,我们更推荐使用 copy-sequence(详情查阅 序列函数)。

如果字符串中有的字符具有文本属性,那么文本属性也会被一并拷贝到新的字符串中。详情查阅 文本属性。

函数 substring 同时也可以处理向量。比如:

(substring [a b (c) "d"] 1 3)
    => [b (c)]

如果 start 不是整数,或者 end 既不是整数,也不是 nil。那么这个函数会抛出 wrong-type-argument 错误。如果 start 标记的位置在 end 之后,或其中有参数超出了字符串范围,那么函数会抛出 args- out-of-range 错误。

另外有一个函数 buffer-substring,用来从当前缓冲区中拷贝子字符串。不过这个函数作用的是缓冲区,而缓冲区的起始索引为 1,而非字符串的 0.

Function: substring-no-properties string &optional start end 这个函数和 substing 很相似,但是这个函数并不拷贝文本属性。此外,对于这个函数 start 为 nil,和start 为 0 是等价的。因此,这个函数返回一个无文本属性的字符串。

Function: concat &rest sequences 将 sequences 中所有的字符拼接在一起,然后返回(包括文本属性)。其参数必须是字符串、数字列表、数字向量;而参数本身并不会被修改。此外如果 concat 没有收到任何参数,那它就会返回一个空字符串。

(concat "abd" "-def")
    => "abc-def"
(concat "abc" (list 120 121) [122])
    => "abcxyz"
;; nil 表示空列表
(concat "abc" nil "-def")
    => "abc-def"
(concat "The" " quick brown " "fox.")
    => "The quick brown fox."
(concat)
    => ""

但要记住,这个函数并不总是返回新创建的字符串。调用者需要知道这一点。此外,也不也不要使用 eq 来将其和已存在的字符串进行比较。

因为实际上,返回的字符串可能隐形的改变了参数中的字符串,因此可能会引发潜在的 错误。为了获取绝对安全的字符串,你最好在其返回的字符串上再调用一个 copy-sequence。

你可以在 Mapping函数章节 查看 mapconcat,在 Vector函数章节 查看 vconcat,在 列表构建章节 查看 append。他们其他的拼接函数。对于拼接命令行参数这样的特定工作,请查阅 合并和引用字符串章节。

Function: split-string string &optional separators omit-nulls trim 这个函数用来根据分隔符,对string进行分割。其中的分隔符可以为正则表达式(详情查阅正则表达式章节)。所有被正则表达式匹配到的字符都会被当作分隔符;分隔后的子字符串们会以字符串列表的形式返回。

如果参数 separators 为 nil(或缺失),那么默认的分隔符就取决于变量 splite-string-default-separators 。而且参数 omit-null 会默认设置为 t 。

如果参数 omit-nulls 为 nil(或缺失),那么返回的结果将会包含 null 字符,如果该参数为 t,那么 null 字符便会从结果中移除。

如果可选参数 trim 非 nil,那么它必须为正则表达式,而这个正则表达式会对分隔的字符串列表中的每一个子字符串进行匹配。如果匹配结果为空,那么这个子字符串会被当成 null 处理。

如果你将独立的命令行参数分隔开,那么为了配合 call-process 或 start-process 函数,你需要查阅 分隔字符串和解引用章节。

比如:

(split-string " two words ")
    => ("two" "words")

结果并非 ("" "two" "words" "")。如果你需要这样的结果,那你需要显式地声明分隔符:

(split-string " two words "
                split-string-default-separators)
    => ("" "two" "words" "")
(split-string "Soup is good food" "o")
    => ("S" "up is g" "" "d f" "" "d")
(split-string "Soup is good food" "o" t)
    => ("S" "up is g" "d f" "d")
(split-string "Soup is good food" "o+")
    => ("S" "up is g" "d f" "d")

TODO

上一页4.2 谓语:字符串相关下一页4.4 修改字符串

最后更新于3年前

这有帮助吗?