说明
上一篇探讨帖子收到不少有价值的建议,所以我继续贴出来新的一篇探讨。
本篇的话题是“函数的调用”
注:函数的定义格式远比调用复杂,所以打算单独开篇讨论。
函数调用
凹语言英文版的函数调用是最普遍的()
形式:
print("hello")
方案1. 中文版的原始设计如下:
打印:"hello"
加:1、2
乘:(加:1、2)、(减:3、4)
-
:
用做函数调用的提示符 -
换行表示调用结束
-
、
顿号表示参数的分隔 -
()
用来实现多曾嵌套。
这种设计实际上是前缀表达式,所有的动作名都在开头,用:
提示。
由于普通情况下不需要括号,所以表达式更接近于自然语言。
多层嵌套情况下,这种语法和Lisp
之类语言的S表达式
基本一致。
缺点:
-
与常见的函数调用并不一致,需要学习成本。(常见的函数调用实际上是中缀表达式)
-
与
+
、-
、*
、/
等运算符的中缀顺序不一致。 -
:
在原版中不但用于函数调用,还用于代码块的开端,两者容易混淆。 -
由于只有前缀提示,无法简单地表达无参数的调用,比如
print()
。
方案2. 直接沿用传统的()
形式:
打印("hello")
加(1,2)
乘(加(1,2)、减(3,4))
这种方案的优点是和英文版一致,学习成本为零。
缺点是括号的使用位置与中文自然语言不同,读起来有点生硬。给人一种“这和英文编程有什么区别,就只做了个关键字替换吧”的印象。
方案3. 直接用空格:
打印 "hello"
加 1 2
乘 (加 1 2)(减 3 4)
这种方法其实就是最简略的S表达式
,只不过把最外层的括号去掉了。
优点是很简洁;缺点是“含空格量”超高,但中文并不是一门空格语言。
方案4. 用!
符号调用:
打印!"hello"
加!1、2
乘!(加!1、2)、(减!3、4)
准备!;启动!;加速!;保持!;停止!
这种方法相对于:
有两个好处:
-
与代码块的
:
不混淆。 -
与
;
配合的话,可以在同一行写下多个调用,且支持空参数。
缺点是!
太惊悚,有点辣眼睛。欢迎大家提供其他的前缀提示符号供选择。
方案5. 用其他的包裹性符号直接替换()
:
如果换成「」
,则可以写成:
打印「"hello"」
加「1、2」
乘「加「1、2」、减「3、4」」
准备「」;启动「」;加速「」;保持「」;停止「」
优点是比()
更适合中文阅读体验,缺点是输入法不好。
小结:
函数调用基本就两种形式:
-
传统中序表达式,以包裹性符号分隔函数名、参数起始和参数结尾。
-
前序表达式,类似与LISP。
上面的说的几种方式都属于这两类:
-
:
和、
:类S表达式,无显示结束符。 -
()
:传统中序表达式。 -
只用空格:类S表达式,无显示结束符。
-
!
和、
:前序表达式,无显示结束符。 -
「」
:传统中序表达式。是()
的直接替换。