formatting - 如何使用格式指令生成列表索引

标签 formatting lisp common-lisp

有没有办法获得与此相同的输出:
(手牌是一张牌列表)

(loop for card in hand
           with i = 1
           do
             (format t "~&~a. ~a~%" i card)
             (incf i))
1. (5 . HEARTS)
2. (5 . CLUBS)
3. (10 . DIAMONDS)
4. (JACK . DIAMONDS)
5. (8 . CLUBS)

但只使用一次调用格式化?到目前为止我有这个,但我不知道如何增加索引。
(format nil "~{~%1. ~a~}~%" hand)
1. (5 . HEARTS)
1. (5 . CLUBS)
1. (10 . DIAMONDS)
1. (JACK . DIAMONDS)
1. (8 . CLUBS)

我还尝试在 Call Function 指令旁边使用闭包,但是您必须为每次调用重置计数器,而且感觉非常笨拙。
(let ((counter 0))
  (defun increment (output-stream format-argument colonp at-sign-p &rest directive-parameters)
    (declare (ignore colonp at-sign-p directive-parameters))
    (incf counter)
    (format output-stream "~a. ~a" counter format-argument))
  (defun reset-counter ()
    (setf counter 0)))

(format t "~&~{~&~/increment/~}" '(a c b d))
1. A
2. C
3. B
4. D

最佳答案

你的循环形式:

(loop for card in hand
           with i = 1
           do
             (format t "~&~a. ~a~%" i card)
             (incf i))

人们通常会这样写:
(loop for card in hand and i from 1
      do (format t "~&~a. ~a~%" i card))

简单处理该问题的一种方法是提供一个带有数字的列表:
(defun numbering (list &key (i0 1))
  (loop for i from i0 and element in list
        collect i collect element))

CL-USER > (format t "~{~%~a. ~a~}~%" (numbering hand))

1. (5 . HEARTS)
2. (5 . CLUBS)
3. (10 . DIAMONDS)
4. (JACK . DIAMONDS)
5. (8 . CLUBS)
NIL

关于formatting - 如何使用格式指令生成列表索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61491525/

相关文章:

java - 如何在整数的左侧填充零?

lisp - Clozure Common Lisp 中的 Sharpsign 点宏

scope - Lisp函数和/或let语句中的函数和变量的范围

lisp - 将文件输入流中的列表存储在 LISP 中的变量中

linux - 将字符串和列表的组合转换为 csv 文件

formatting - 如何在Google Dart编辑器中配置格式设置规则

matlab - 使用 fprintf() 和 disp() 函数在 MATLAB 中的命令窗口中显示消息?

binary - 在数据库中存储 Lisp 编译函数

sql - 在 Common Lisp 中使用的最佳 SQL 库是什么?

directory - 普通口齿不清 : creating a directory