C.2.2 构建Y轴元素

当我们打印垂直轴时,我们希望在每五行插入诸如 ‘- 和 ‘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 函数,将数字转换为与前导空格和刻度标记连接的字符串。