【发布时间】:2016-07-04 22:39:34
【问题描述】:
考虑一下 SICP 中的这个迭代阶乘过程。
(define (fact-iter product counter max-count)
(if (> counter max-count)
product
(fact-iter (* counter product)
(+ counter 1)
max-count)))
在这里,我们看到了:
- 阶乘的声明没有前导空格。我认为这很正常。
- 函数体每行需要两个前导空格。
- 我们在 if 语句的第一个子句和第二个子句的开头添加了四个空格。共 6 个空格。
- 我们在最后两行添加了 11 个空格,即 if 语句的第二个子句的其余部分。共 17 个空间。
为什么会这样?间距让我感到困惑。为什么不能像 java 一样(在代码的每个内部部分添加四个空格)?我应该如何格式化lisp代码?
【问题讨论】:
-
函数调用的参数与第一个一致。这清楚地表明它们是谁的论点,所以你不需要开始计算括号来确定
MAX-COUNT是FACT-ITER的第三个参数(同样适用于IF,尽管它当然不是一个函数)。它还将参数列表与宏体区分开来。 -
@jkiiski 我们在 "product" 中添加了 4 个空格以使其与 (if ? 对吗?为什么只在 " (if " 中添加两个空格?为什么是 2 个?
-
@morbidCode:某些“特殊”表单,例如定义表单和绑定表单,有自己的规则,即(我认为:我相信编辑知道)表单的“正文”会缩进由两个字符。这包括诸如 Scheme 中的
define、CL 中的defun以及两者中的let或lambda之类的东西。这些通常是“身体”概念有意义的形式。 (请注意,我在这里使用“特殊”是非技术意义上的)。
标签: scheme lisp code-formatting