当我们打印垂直轴时,我们希望在每五行插入诸如 ‘5 -’ 和 ‘10 - ’ 等字符串。 此外,我们希望数字和破折号对齐,因此较短的数字必须填充前导空格。 如果一些字符串使用两位数字,则具有单个数字的字符串必须在数字前包含前导空格。
为了确定数字的长度,使用了 length
函数。
但是 length
函数只能处理字符串,而不能处理数字。因此,数字必须转换为字符串。
这是通过 number-to-string
函数完成的。例如,
(length (number-to-string 35)) ⇒ 2 (length (number-to-string 100)) ⇒ 3
(number-to-string
也被称为 int-to-string
;在各种来源中,您会看到这个替代名称。)
此外,在每个标签中,每个数字后面都跟着一个字符串,例如 ‘ - ’,我们将其称为 Y-axis-tic
标记。
该变量使用 defvar
定义:
(defvar Y-axis-tic " - " "Y轴标签中数字后面跟随的字符串。")
Y标签的长度是Y轴标记的长度和图表顶部的数字的长度之和。
(length (concat (number-to-string height) Y-axis-tic)))
此值将由 print-graph
函数在其 varlist 中作为 full-Y-label-width
计算,并传递给下一个函数。(请注意,在我们首次提出 varlist 时,我们没有考虑包含这个。)
为了创建完整的垂直轴标签,一个刻度标记与一个数字连接在一起;两者一起可能在数字前包含一个或多个空格,这取决于数字有多长。
标签由三部分组成:(可选的)前导空格、数字和刻度标记。
该函数接收特定行的数字值和由 print-graph
计算的顶部线的宽度的值,该值仅计算一次。
(defun Y-axis-element (number full-Y-label-width) "构建一个带有数字的标签元素。 数字元素的外观如下 ` 5 - ',并根据最大数字的元素进行必要的填充,以使所有元素对齐。")
(let* ((leading-spaces (- full-Y-label-width (length (concat (number-to-string number) Y-axis-tic)))))
(concat (make-string leading-spaces ? ) (number-to-string number) Y-axis-tic)))
Y-axis-element
函数将前导空格(如果有的话)、作为字符串的数字和刻度标记连接在一起。
为了确定标签需要多少前导空格,该函数从实际标签的长度(数字长度加刻度标记长度)中减去所需的标签宽度。
使用 make-string
函数插入空格。该函数接受两个参数:第一个参数告诉它字符串的长度,第二个是要插入的字符的符号,以特殊的格式。格式是一个问号后跟一个空格,如此,‘? ’。参见See Character Type in The GNU Emacs Lisp Reference Manual, 以获取有关字符语法的描述。(当然,您可能希望将空格替换为其他字符… 您知道该怎么做。)
在连接表达式中使用 number-to-string
函数,将数字转换为与前导空格和刻度标记连接的字符串。