Skip to content

中文函数名与参数顺序

· xieyuheng

问题 ​

之前设计函数的参数顺序时, 考虑到要方便 auto currying, 而把函数的 target 参数放在最后, 形成了 target-last 的参数顺序设计。

例如:

meta-lisp
(list-map f list)
(list-get index list)
(hash-get key hash)
(hash-put key value hash)

但是这与未来想要设计的 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:

text
把列表中的每个元素   用函数   映射   成新列表
  受事/对象         方式     动作   结果

也可以说:

text
用函数把列表中的每个元素映射一遍

两种都自然。中文里“用函数”这种方式状语,可以放在“把列表”前面,也可以放在后面。

list-filter:

text
把列表   按谓词   筛选   保留满足条件的元素
 受事     标准     动作   结果/补充

或者:

text
按谓词把列表筛选一遍

array-sort:

text
把数组   按比较函数   排序
 受事      标准       动作

或者:

text
按比较函数给数组排序

如果不需要比较函数,就是:

text
把数组排序
对数组排序

总结中文语感的共同点,可以看出, 这三个函数最自然的中文说法,基本都走这个结构:

text
把/对 + 列表(受事) + 用/按 + 函数/谓词/比较器(方式或标准) + 动作动词

也就是说:

  • 列表、数组在中文里很自然地被“把”提前,放在动词前;
  • 函数、谓词、比较器常作“用/按”引出的状语;
  • 映射、筛选、排序是动词中心语;
  • 结果或保留条件常放最后。

所以单从中文语感看,list-map、list-filter、array-sort 最自然的描述都是:

把 列表 / 数组 …… 映射 / 筛选 / 排序。

这确实会让 target 在语感上偏前置。

总结来说,就是:

[介词短语状语 1] + [介词短语状语 2] + 核心动词 + [宾语/结果补语]

前面这多个做状语的「介词短语」就是描述每个参数的, target 一般都可以作为第一个「介词短语」来强调受事的对象。

结论 ​

根据汉语语感,我们用「类型修饰语 + 动作或属性中心语」来命名函数, 用自然的现代汉语语法来描述函数。

参数的设计应该是 target-first 而不是 target-last, 因为如果使用 target-first, 参数的顺序就是参数在自然描述中出现的顺序, 而函数名就成了自然描述的名词化缩写。

补证 ​

中文是对语序要求极为严格的语言, 在构词时经常让顺序相互呼应。

比如:

  • 说「主谓」那么就是前「主」后「谓」;
  • 说「偏正」那么就是前「偏」后「正」。

「定中」「状中」「述宾」「述补」也是如此。

因此「函数名」「参数」「描述」三者中词的顺序应该相互呼应。