- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我已经写了一些 Lisp 代码,它可以工作,但我不确定如何正确地缩进。
基本上我有一个全局变量和三个函数:
(setf my-hand '((3 hearts)
(5 clubs)
(2 diamonds)
(4 diamonds)
(ace spades)))
(defun rank (card)
(car card))
(defun suit (card)
(cadr card))
(defun count-suit (suit hand)
(length (remove-if-not #'(lambda (card) (equal suit (suit card))) hand)))
我对全局变量和函数 rank
和 suit
没问题,但是 count-suit
呢?我应该如何包裹它的 body 并缩进它?我可以想出几种方法,但无法决定哪一种看起来是正确的。
有什么提示吗?
是否有规范的方式来执行此操作?
最佳答案
请注意,缩进 和格式化 之间存在细微差别。
缩进 通常意味着水平移动一行的内容。通常我们已经知道线上和线上的内容。如果您要求典型的编辑器缩进,它只会调整行内容的水平位置。它不会跨行分发表达式。
格式化 是指将代码布局到一行或多行。 Lisp 为自动布局提供了一个 pretty-print 。但在编辑器中,完整布局并没有得到很好的支持,尤其是因为规则可能很复杂,而且处理注释和其他非 s 表达式代码内容有点困难。宏的布局基于简单的原则。像 LOOP 这样更复杂的宏的自动布局真的很困难。
你的问题实际上是关于格式化的。
(length (remove-if-not #'(lambda (card) (equal suit (suit card))) hand))
我可以识别函数调用吗?论点是什么?什么是语法?行长呢?压痕深度?
让我们看看函数调用:将它们放在更显眼的位置:
(length
(remove-if-not
#'(lambda (card)
(equal
suit
(suit card)))
hand))
上面看起来还不错。
也许我们想专注于参数并确保两个或多个参数在不同的行上:
(length (remove-if-not #'(lambda (card)
(equal suit
(suit card)))
hand))
通常我们希望短参数列表在一行上,如果行不是太长的话:
(length (remove-if-not #'(lambda (card)
(equal suit (suit card)))
hand))
以上是我在这种情况下要写的内容。代码结构足够清晰,不会浪费太多篇幅。
格式化代码意味着应用大量局部和全局约束/规则。
如果我们看一下表达式,我们也会想以不同的方式编写它,因为它会触发很多通常不喜欢的事情:
所以:
(count suit hand :key #'suit :test #'eql)
或者只是(eql
是默认值):
(count suit hand :key #'suit)
回到格式化。我们可以做一些实验,看看 Lisp 是如何做到的,因为它有一个内置的代码格式化程序(这里是 Clozure Common Lisp):
? (defun test ()
(dolist (*print-right-margin* '(80 60 40 30))
(format t "~%Margin: ~a" *print-right-margin*)
(pprint '(length (remove-if-not #'(lambda (card) (equal suit (suit card))) hand)))))
TEST
? (test)
Margin: 80
(LENGTH (REMOVE-IF-NOT #'(LAMBDA (CARD) (EQUAL SUIT (SUIT CARD))) HAND))
Margin: 60
(LENGTH (REMOVE-IF-NOT
#'(LAMBDA (CARD) (EQUAL SUIT (SUIT CARD)))
HAND))
Margin: 40
(LENGTH
(REMOVE-IF-NOT
#'(LAMBDA
(CARD)
(EQUAL SUIT (SUIT CARD)))
HAND))
Margin: 30
(LENGTH
(REMOVE-IF-NOT
#'(LAMBDA
(CARD)
(EQUAL
SUIT
(SUIT CARD)))
HAND))
尽管在许多情况下手动格式化的代码可能看起来更好,但熟悉自动格式化(又名 pretty-print 或“研磨”)并能够处理它还是很有用的。
关于lisp - Lisp 代码的缩进,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29638007/
你们能帮帮我吗,这是我们的讲师给我们的教程问题,无论我们尝试了多少,我们实际上似乎都无法破解它。请帮忙 ; perform some type/error checking, ; then ca
在 Common Lisp 中编写、编译和测试一个函数,该函数接受一个列表并计算列表中正整数的总数。必须编译然后执行包含函数的 .lisp 文件。在编译该文件后开始传递它,列出要生成的结果的结果,从而
我是 Lisp 初学者,我很难理解为什么下面的代码会给我一个错误。 (dolist (elem '(mapcar mapcon)) (when (fboundp `
我听说 Lisp 可以让你重新定义语言本身,我也试图研究它,但没有任何地方明确的解释。有人有一个简单的例子吗? 最佳答案 Lisp 用户将 Lisp 称为 可编程编程语言 .用于符号计算 - 用符号计
Closed. This question is off-topic. It is not currently accepting answers. Learn more。 想改进这个问题吗Updat
这些是 cons 参数的不同组合的输出。我刚开始学习 lisp。有人可以帮我理解这些吗? Break 80 [81]> (CONS '(A) 'B) ((A) . B) Break 80 [81]>
这个问题不太可能帮助任何 future 的访问者;它只与一个小的地理区域、一个特定的时间点或一个非常狭窄的情况有关,这些情况并不普遍适用于互联网的全局受众。为了帮助使这个问题更广泛地适用,visit
我想问一下为什么这个功能不起作用... (defun nenum(ls) (cond ((null ls) nil) ((listp car(ls)) (nenum (rest ls)
如果我有一个原子,例如“a4”,我需要能够将 1 添加到“4”部分以使其成为 a5,但是因为它被认为是一个字符串,所以这是不可能的,所以如果我可以拆分 (a4 ) 到 ((a)(4)) 中,然后我可以
我有一个关于动态构建函数(或类似的东西)的问题。在 Java 中,我可以通过编程将一些 Source 写入字符串,编译该字符串并像函数一样执行它多次。 假设我有一些遗传算法来创建最佳代码以获取 n 个
我是 Common Lisp 的新手,正在学习教程,但无法全神贯注 (equal '(reverse (a b)) '(b a))) 返回零。 非常感谢您的协助。 M. 最佳答案 在 lisp 中引
我有一个使用列表表示的树。例如: (1 ((2 (3)) (3 (2)))) (2 ((1 (3)) (3 (1)))) (3 ((1 (2)) (2 (1)))))` 现在我需要在维护层次结构树的同
在此站点:http://www.gigamonkeys.com/book/practical-a-simple-database.html有如下列出的用户入口函数: (defun prompt-rea
我对 lisp 比较陌生,对在以下上下文中使用嵌套列表的最佳方法很好奇: 所以,我有以下功能: (defun get-p0 (points) (loop for (label x y) in
我正在为 CLOS 类编写一个函数,该函数反转所述类对象的列表元素。 我有一个返回反向列表的方法,但如何让它将对象的列表设置为该列表?我可以在存储列表的函数中有一个实例变量,然后将元素设置为那个吗?或
我知道,严格来说,没有编译语言或解释语言这回事。 但是,一般来说,LISP 是用来编写 Python、bash 脚本、批处理脚本之类的脚本的吗? 还是像 C++、JAVA 和 C# 这样的通用编程语言
在此站点 http://jatha.sourceforge.net/快速函数的示例是通过递归。是不是递归通常比 Lisp 中的迭代更快并且性能更好? 编辑:Lisp 是否比其他语言更优化递归? 最佳答
另一个新手(常见)LISP 问题: 基本上在大多数编程语言中,函数都有一种方法接收对变量的引用而不仅仅是值,即通过引用传递而不是通过值传递。比方说,为了简单起见,我想编写一个 LISP 函数来接收一个
这个问题在这里已经有了答案: How do I find the index of an element in a list in Racket? (3 个答案) 关闭 9 年前。 如果我有这样的列
我在为这个程序生成正确的输出时遇到了一些问题。我的输出几乎是正确的,但缺少一些步骤。我的代码如下: (defun kt (x y m n) ;set the
我是一名优秀的程序员,十分优秀!