问题
之前设计函数的参数顺序时, 考虑到要方便 auto currying, 而把函数的 target 参数放在最后, 形成了 target-last 的参数顺序设计。
例如:
但是这与未来想要设计的 region-lisp 是相互冲突的, 因为 region-lisp 并没有 auto currying, 甚至大概率也不会支持 lambda。
如此依赖,为了 auto currying 而设计参数顺序就值得商榷了。
汉语语感
来自 deepseek 讨论
先不管 target 放哪,只求汉语语感最自然,来写函数的描述试试:
| 函数英文名 | 函数中文名 | 最符合中文语感的描述 |
|---|---|---|
| hash-get | 散列取 | 从散列表中按键取值 |
| array-get | 数组取 | 从数组中按下标取元素 |
| list-get | 列表取 | 从列表中按位置取元素 |
| list-member | 列表属于 | 判断元素是否在列表中 |
| set-member | 集合属于 | 判断元素是否在集合中 |
| text-is-prefix | 文本为前缀 | 判断文本是否以某片段开头 |
| text-split | 文本分割 | 把文本按分隔符拆分 |
| text-slice | 文本截取 | 从文本中截取从 start 到 end 的一段 |
| text-replace | 文本替换 | 把文本中的 from 替换为 to |
| text-join | 文本连接 | 用分隔符把列表连接成文本 |
| text-get-code-point | 文本取码点 | 取文本中指定位置的码点 |
| text-repeat | 文本重复 | 把文本重复指定次数 |
| int-align | 整数对齐 | 按对齐方式对齐整数 |
| parse-sexps | 解析符号算式 | 从源代码中解析 S 表达式,文件名用于报错 |
一个明显的中文语感是:
来源、容器、受事,常用「从……中」「把……」「在……中」提前; 动词居中;结果、方式、补充在后。
比如:
- 「从哈希表中按键取值」
- 「把文本按分隔符拆分」
- 「用分隔符把列表连接成文本」
- 「判断元素是否在列表中」
这些都比「取值从哈希表按键」「拆分文本按分隔符」自然得多。 所以中文语感整体偏向:先交代对什么/从哪里,再说做什么,最后说结果或补充。
另外再考虑一些在 LISP 传统中经常 target 后置的函数:
| 函数英文名 | 函数中文名 | 最符合中文语感的描述 |
|---|---|---|
| list-map | 列表映射 | 把列表中的每个元素用函数映射,得到新列表 |
| list-filter | 列表筛选 | 把列表按谓词筛选,保留满足条件的元素 |
| array-sort | 数组排序 | 把列表按比较函数排序 |
list-map:
把列表中的每个元素 用函数 映射 成新列表
受事/对象 方式 动作 结果也可以说:
用函数把列表中的每个元素映射一遍两种都自然。中文里“用函数”这种方式状语,可以放在“把列表”前面,也可以放在后面。
list-filter:
把列表 按谓词 筛选 保留满足条件的元素
受事 标准 动作 结果/补充或者:
按谓词把列表筛选一遍array-sort:
把数组 按比较函数 排序
受事 标准 动作或者:
按比较函数给数组排序如果不需要比较函数,就是:
把数组排序
对数组排序总结中文语感的共同点,可以看出, 这三个函数最自然的中文说法,基本都走这个结构:
把/对 + 列表(受事) + 用/按 + 函数/谓词/比较器(方式或标准) + 动作动词也就是说:
- 列表、数组在中文里很自然地被“把”提前,放在动词前;
- 函数、谓词、比较器常作“用/按”引出的状语;
- 映射、筛选、排序是动词中心语;
- 结果或保留条件常放最后。
所以单从中文语感看,list-map、list-filter、array-sort 最自然的描述都是:
把 列表 / 数组 …… 映射 / 筛选 / 排序。
这确实会让 target 在语感上偏前置。
总结来说,就是:
[介词短语状语 1] + [介词短语状语 2] + 核心动词 + [宾语/结果补语]
前面这多个做状语的「介词短语」就是描述每个参数的, target 一般都可以作为第一个「介词短语」来强调受事的对象。
结论
根据汉语语感,我们用「类型修饰语 + 动作或属性中心语」来命名函数, 用自然的现代汉语语法来描述函数。
参数的设计应该是 target-first 而不是 target-last, 因为如果使用 target-first, 参数的顺序就是参数在自然描述中出现的顺序, 而函数名就成了自然描述的名词化缩写。
补证
中文是对语序要求极为严格的语言, 在构词时经常让顺序相互呼应。
比如:
- 说「主谓」那么就是前「主」后「谓」;
- 说「偏正」那么就是前「偏」后「正」。
「定中」「状中」「述宾」「述补」也是如此。
因此「函数名」「参数」「描述」三者中词的顺序应该相互呼应。